Gratuitous ARPの送出方法

以前のブログで書いたGratuitous ARP。今回は具体的な送出方法について書いてみる。

Linux・・・send_arpコマンドの利用

bonding を Active-Backup で構成している状況でネットワークリンクを切断せずに ifenslave コマンド、たとえば

# ifenslave -c bond0 eth1
のようにして、Active な Slave インターフェイスを変更すると、外部からのパケットが届かなくなる。これはラインが切り替わったことを接続しているスイッチが検知しないため。要は、スイッチの FDB (Forwarding Data Base)が更新されない。ラインの切替を bonding の機能に委ねている場合は、切り替わったタイミングがわからないので、この状況を回避する手段はないはず。一方で、自身で ping, arping などでネットワークの接続監視をし、異常があった場合に ifenslave コマンドで ActiveなSlave インターフェイスを切り替えるようにしておけば、切り替えのタイミングで Server0/Server1 に関連するすべての MACアドレスをスイッチに通知することで、この問題を回避できる。

そのためには、まず send_arp というコマンドが必要なので、http://dag.wieers.com/rpm/packages/fake/ から rpm を取得し、

# fake-1.1.8-1.2.el5.rf.i386.rpm
として Server0 にインストールしておく。そして、ifenslave で切り替えた後に、下記スクリプトを実行する。


#!/bin/sh

reset_for_Server0() {
ls -F /sys/class/net | egrep "/$" | \
while read netdev; do
netdev=`echo $netdev | sed -s "s/\(.*\)\/$/\1/"`
mac=`cat /sys/class/net/$netdev/address`

if [ "$mac" != "00:00:00:00:00:00" ] && [ "$mac" != "ff:ff:ff:ff:ff:ff" ] ;
then
send_arp 0.0.0.0 $mac 0.0.0.0 ff:ff:ff:ff:ff:ff $netdev
fi
done
}

reset_for_Server1() {
xm list | egrep -v "^Name|Domain-0" | \
while read name id dummy1; do
xm network-list $id | egrep -v "^Idx" | \
while read idx be mac handle state evtch txrx bepath; do
vif=`echo $bepath | sed -e "s/.*vif\/\(.*\)\/\(.*\)/vif\1.\2/"`
br=`ls -l /sys/class/net/$vif/brport/bridge | sed -e"s/.*net\/\(.*\)/\1/"`
send_arp 0.0.0.0 $mac 0.0.0.0 ff:ff:ff:ff:ff:ff $br
done;
done;
}


reset_for_Server0
reset_for_Server1

Windows・・・標準機能でのGratuitous ARP送出

Windows OSでも、LinuxのVIFのように1つのネットワークインターフェースに簡単に複数のIPアドレスを付与できる。設定方法はお馴染みの「インターネット プロトコル(TCP/IP)のプロパティ」から詳細設定を選択し、「IP設定」タブでIPアドレスを追加するだけ。ただしDHCP設定にしているとIPアドレス追加はできないので、DHCPになっている場合には事前に手動でIPアドレスを設定しておく。

パケットキャプチャをするとわかるが、この設定を有効にする際にWindowsでは自動的にGratutous ARPを送出している。また、気をつける事項としては設定有効化のタイミングで元々設定されていたリアルIPアドレスで確立していた通信が瞬断するという点である。イメージ的には、Linuxでnetworkサービスをrestartしているような感じ。このため、本番運用しているWindowsサーバ上でこの操作を行う場合には事前に影響範囲を考慮する必要がある。

この他、サーバの再起動時にもGratuitous ARPは送出される。ARP送信の抑制に関する情報もあるようだ。
http://support.microsoft.com/kb/280524/ja
http://support.microsoft.com/kb/219374/ja