現象
/etc/network/interfacesに例えば
auto lo eth1 eth1:1
iface eth1
address 1.2.3.4
netmask 255.255.255.0
gateway 1.2.3.1
iface eth1:1
address 1.2.3.5
netmask 255.255.255.0
のように書いてeth1に複数のIPアドレスを振っていた場合、Ubuntu 11.04までは、ifconfig -aすると
# ifconfig -a
eth1 Link encap:イーサネット ハードウェアアドレス 00:d0:b7:09:xx:xx
inetアドレス:1.2.3.4 ブロードキャスト:0.0.0.0 マスク:255.255.255.0
inet6アドレス: fe80::2d0:b7ff:fe09:3e77/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:65564 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:88727 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:8445020 (8.4 MB) TXバイト:80644469 (80.6 MB)
eth1:1 Link encap:イーサネット ハードウェアアドレス 00:d0:b7:09:xx:xx
inetアドレス:1.2.3.5 ブロードキャスト:0.0.0.0 マスク:255.255.255.0
lo Link encap:ローカルループバック
inetアドレス:127.0.0.1 マスク:255.0.0.0
inet6アドレス: ::1/128 範囲:ホスト
UP LOOPBACK RUNNING MTU:16436 メトリック:1
RXパケット:2392 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:2392 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:0
RXバイト:241622 (241.6 KB) TXバイト:241622 (241.6 KB)
のように表示されていたのが、Ubuntu 11.10からは
# ifconfig -a
eth1 Link encap:イーサネット ハードウェアアドレス 00:d0:b7:09:xx:xx
inetアドレス:1.2.3.4 ブロードキャスト:0.0.0.0 マスク:255.255.255.0
inet6アドレス: fe80::2d0:b7ff:fe09:3e77/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:65564 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:88727 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:8445020 (8.4 MB) TXバイト:80644469 (80.6 MB)
lo Link encap:ローカルループバック
inetアドレス:127.0.0.1 マスク:255.0.0.0
inet6アドレス: ::1/128 範囲:ホスト
UP LOOPBACK RUNNING MTU:16436 メトリック:1
RXパケット:2392 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:2392 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:0
RXバイト:241622 (241.6 KB) TXバイト:241622 (241.6 KB)
としか表示されなくなった。しかし、ip addrすると
# ip addr
1: lo: <loopback ,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1: <broadcast ,MULTICAST,UP,LOWER_UP> mtu 1426 qdisc pfifo_fast state UP qlen 1000
link/ether 00:02:b3:4c:xx:xx brd ff:ff:ff:ff:ff:ff
inet 1.2.3.4/24 scope global eth2
inet 1.2.3.5/24 scope global secondary eth2
inet6 fe80::202:b3ff:fe4c:cc2a/64 scope link
valid_lft forever preferred_lft forever
のように表示され、その他のプログラムからも1.2.3.4も1.2.3.5も使える状態である。つまり、一応追加のIPアドレスは設定できているようであるが、ifconfig -aの表示だけがおかしい。
原因
/etc/network/interfacesの設定を読んで実際にシステムに設定しているifupdownが使用しているAPIが、ifupdownのchangelog(読むにはapt-get changelog ifupdownせよ)によると、Ubuntu 11.04搭載のバージョン0.6から11.10搭載の0.7の間で変更になったらしい。どうもそのときにIP aliasing互換への対応が抜け落ちたのではないか。おそらくもとから新しいAPIを使っているであろうipコマンドを使っても、次のようにlabelとして指定すればIP aliasing互換の設定ができる。
(/etc/network/interfacesにeth1:1の設定がないものとして)
# ip -4 addr add 1.2.3.5/24 dev eth1 brd + scope global label eth1:1
# ifconfig -a
eth1 Link encap:イーサネット ハードウェアアドレス 00:d0:b7:09:xx:xx
inetアドレス:1.2.3.4 ブロードキャスト:0.0.0.0 マスク:255.255.255.0
inet6アドレス: fe80::2d0:b7ff:fe09:3e77/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:65564 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:88727 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:8445020 (8.4 MB) TXバイト:80644469 (80.6 MB)
eth1:1 Link encap:イーサネット ハードウェアアドレス 00:d0:b7:09:xx:xx
inetアドレス:1.2.3.5 ブロードキャスト:0.0.0.0 マスク:255.255.255.0
lo Link encap:ローカルループバック
inetアドレス:127.0.0.1 マスク:255.0.0.0
inet6アドレス: ::1/128 範囲:ホスト
UP LOOPBACK RUNNING MTU:16436 メトリック:1
RXパケット:2392 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:2392 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:0
RXバイト:241622 (241.6 KB) TXバイト:241622 (241.6 KB)
ifconfigは古いので、IP aliasingを使わないで一つのインタフェースに直接IPアドレスを複数割り当てた場合に対応していない。
対処法
根本的にはifupdownの修正が必要だが、とりあえず設定の確認には古き良きifconfig -aのことは忘れ、ip addrを使う。設定そのものはいままでの/etc/network/interfacesの書き方そのままでできているので対処不要。
参照
“ifconfig -a” does not show all the inet4 interfaces ifconfigとipコマンドの関係や使い方等について参考になる。
追記
その後LaunchpadにてBug #876829として報告され、一応パッチも作成された模様。Debianでも再現するとのこと。
このパッチを見る限りでは、ifupdownは内部的にはまさにipコマンドを起動しているスクリプトのようだ。
2012.2.1追記: 先日の0.7~alpha5.1ubuntu5へのアップデートでこの問題は解消された。