遭遇した事象
VirtualBoxでCentOS7を3台立て、内部ネットワークの設定をしてpingで疎通確認をしている時だった、、、
[root@node01 ~]# ping 192.168.10.12
PING 192.168.10.12 (192.168.10.12) 56(84) bytes of data.
64 bytes from 192.168.10.12: icmp_seq=1 ttl=64 time=0.690 ms
64 bytes from 192.168.10.12: icmp_seq=1 ttl=63 time=0.738 ms (DUP!)
64 bytes from 192.168.10.12: icmp_seq=1 ttl=64 time=1.18 ms (DUP!)
64 bytes from 192.168.10.12: icmp_seq=1 ttl=63 time=1.29 ms (DUP!)
From 192.168.10.10: icmp_seq=2 Redirect Host(New nexthop: 192.168.10.12)
From 192.168.10.10 icmp_seq=2 Redirect Host(New nexthop: 192.168.10.12)
ping応答が重複しているだと?誰がお返事しているんだろ、、、
あれこれ探ってみたところ、原因はポートフォワーディング機能が有効になっていたことだった。
ここでは例としてA,B,Cの3ノードがあり、例えばA->Bへpingを打つことを考える。
pingを受け取ったBは期待通りAに返答するのだが、Cもpingのパケット自体は受け取ることになる。このとき、受け取ったパケットはCに向けられたものではないから破棄すればよいのだが、ポートフォワーディング機能によってBに転送してしまう。
結果としてBは2回Aにping応答を返してしまうことになる。
ポートフォワーディンの動作を確認する実験
実験として、上記例でBのNICを落とした状態でA->Bにpingを打ってみる。
ポートフォワーディングによるパケットの転送
[root@node01 ~]# ping 192.168.10.12
PING 192.168.10.12 (192.168.10.12) 56(84) bytes of data.
From 192.168.10.10: icmp_seq=2 Redirect Host(New nexthop: 192.168.10.12)
From 192.168.10.10 icmp_seq=2 Redirect Host(New nexthop: 192.168.10.12)
From 192.168.10.10: icmp_seq=3 Redirect Host(New nexthop: 192.168.10.12)
ほら、C(192.168.10.10)がB(192.168.10.12)に転送しているでしょ!
ポートフォワーディング無効化の設定
ポートフォワーディングの無効化は簡単。
IPフォワーディングを無効化
sysctl -w net.ipv4.ip_forward=0 # net.ipv4.ip_forward = 0
# sysctlコマンド使えなければ下記でも可
echo 0 > /proc/sys/net/ipv4/ip_forward
設定後、無事にping DUP!が消えました。めでたしめでたし。