Ubuntu 11.10から/etc/network/interfacesでのIP aliasingのサポートが中途半端になった

現象

 /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へのアップデートでこの問題は解消された。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください