IPエイリアスの設定でハマった

eth0のIPがAAA.BBB.CCC.DDDの時に、

sudo ifconfig eth0:0 AAA.BBB.CCC.EEE

とかIPエイリアスを設定して、複数のIPを持たせたりするのにハマったのでメモ。

特にこれといった設定をしていない、一般的なネットワークでifconfigすると、

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:AAA.BBB.CCC.DDD  Bcast:AAA.BBB.CCC.255  Mask:255.255.255.0

こんな感じになってます。

上記の設定をすると、

eth0:0    Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:AAA.BBB.CCC.EEE  Bcast:AAA.BBB.CCC.255  Mask:255.255.255.0

なんてのが追加されて、1つのNICに複数のIPでアクセスできるようになります。

ところが、世の中にはブロードキャストやサブネットマスクを変更している場合というのがあります。ブロードキャストの末尾が255じゃなかったり、サブネットマスクがもっと大きな値(小さい場合はきっと少ない)になってたり。そういうところで、冒頭のコマンドでIPエイリアスを設定するとえらいことになります。

eth0にグローバルIP、eth1にローカルIPを持たせた環境でやったら、eth0, eth0:0はもちろん、eth1のローカルIPでも接続出来なくなってしまいました。単にifconfigでIPエイリアスを振っただけだと、eth0:0のブロードキャストとサブネットマスクが上に示したようなデフォルトの値になってしまい、ネットワークの設定によっては問題が発生してしまうようです。

それでもグローバルはおろか、ローカルIPでもpingsshも通らなくなった時は相当焦りましたが… 結局、30分ほどしてダメ元でもう一回試したらアクセス出来ました。ブロードキャストのIPが無効だったから、それを諦めるまで待ったみたいな形になるんでしょうか? よく分かってません。

まぁ、とにかくそういう環境でIPエイリアスを設定する場合は、

sudo ifconfig eth0:0 AAA.BBB.CCC.EEE broadcast XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX

てな具合にブロードキャストとかサブネットマスクも指定しとけってこった。eth0の設定を引き継いでくれるんじゃね? とか何となく思ってると痛い目に遭うぞ。

sudoでリダイレクトしてファイルを書き換えるとか

LVSの設定するのにIP forwardを変更する必要があって、それを変更するのに、

sudo echo '1' > /proc/sys/net/ipv4/ip_forward

とかやろうとしたけど、リダイレクトがroot権限で動いてくれなくて上手くいかない。こういう場合は、

echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward
sudo sh -c "echo '1' > /proc/sys/net/ipv4/ip_forward"

のどちらかでやるといいらしい。個人的には何となく上の方が好み。書き込み権限が無い場合はこうやればいいのか。

※追記:ごめんなさい。上のコマンド例の下の方「sudo su -c」と書いてました。suじゃなくてshです。sudo suとかしちゃいかんです。

あと、IP forwardする場合は、/etc/sysctl.confもちゃんと書き換えて再起動してもIP転送してくれるようにする。

そして、

sudo sysctl -w net.ipv4.ip_forward=1

だけでいいことを知った。まぁいい。勉強にはなった。