自宅でSoftEtherを使ってるのですが、そのサーバーにpingを投げるとDUP(2重の応答が帰ってくる)という症状が出ていました。使ってる限りループしてる様子もないし、スループットが極端に悪いという事もなかったので放置していたのですが、ちょっと気持ちが悪いので真面目に調査してみました。
ここで出てくるhost1はVPNサーバーと同じセグメントにいる適当なホストです。 SoftEtherServerはSoftEtherのサーバーが起動しているLinuxのホストです。
host1$ ping 192.168.1.117 64 bytes from 192.168.1.117: icmp_seq=11 ttl=64 time=0.157 ms 64 bytes from 192.168.1.117: icmp_seq=11 ttl=128 time=0.280 ms (DUP!) 64 bytes from 192.168.1.117: icmp_seq=12 ttl=64 time=0.150 ms 64 bytes from 192.168.1.117: icmp_seq=12 ttl=128 time=0.237 ms (DUP!)
しかもTTLが半減して返ってくる。応答時間見る限りローカルにあるような数字なのに、すごく気持ち悪い…。
とりあえずSoftEtherを停止すると、このDUPはなくなります。
SoftEtherServer# systemctl stop vpnserver
host1$ ping 192.168.1.117 64 bytes from 192.168.1.117: icmp_seq=11 ttl=64 time=0.147 ms 64 bytes from 192.168.1.117: icmp_seq=11 ttl=64 time=0.137 ms
試しにtcpdumpして様子を見てみると
SoftEtherServer# tcpdump -i eth0 -n -e icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 20:00:15.919277 XX:XX:XX:XX:XX:c0 > XX:XX:XX:XX:XX:73, ethertype IPv4 (0x0800), length 98: 192.168.1.115 > 192.168.1.117: ICMP echo request, id 8717, seq 1, length 64 20:00:15.919324 XX:XX:XX:XX:XX:73 > XX:XX:XX:XX:XX:c0, ethertype IPv4 (0x0800), length 98: 192.168.1.117 > 192.168.1.115: ICMP echo reply, id 8717, seq 1, length 64 20:00:15.919468 XX:XX:XX:XX:XX:73 > XX:XX:XX:XX:XX:c0, ethertype IPv4 (0x0800), length 98: 192.168.1.117 > 192.168.1.115: ICMP echo reply, id 8717, seq 1, length 64 20:00:16.941117 XX:XX:XX:XX:XX:c0 > XX:XX:XX:XX:XX:73, ethertype IPv4 (0x0800), length 98: 192.168.1.115 > 192.168.1.117: ICMP echo request, id 8717, seq 2, length 64 20:00:16.941143 XX:XX:XX:XX:XX:73 > XX:XX:XX:XX:XX:c0, ethertype IPv4 (0x0800), length 98: 192.168.1.117 > 192.168.1.115: ICMP echo reply, id 8717, seq 2, length 64 20:00:16.941225 XX:XX:XX:XX:XX:73 > XX:XX:XX:XX:XX:c0, ethertype IPv4 (0x0800), length 98: 192.168.1.117 > 192.168.1.115: ICMP echo reply, id 8717, seq 2, length 64
これを見る限り1回のICMP requestにサーバーが2回応答してるように見える…
何となく、Kernelのping応答を無効にしてみた所・・・・・・
SoftEtherServer# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
host1$ ping 192.168.1.117 64 bytes from 192.168.1.117: icmp_seq=11 ttl=64 time=0.147 ms 64 bytes from 192.168.1.117: icmp_seq=11 ttl=64 time=0.137 ms
なんで応答するんだよ!!!!!!!!!!!
でもDUPは解消した。
わかってみれば実にシンプル。原因はSecureNATでした。
icmp_echo_ignore_allをONにしてもpingが応答するという事なら、Linux Kernelとは別にpingが応答しているものがいるという事。実はSecureNATの仮想ルーターにはping応答の機能があり、SoftEtherサーバーにpingを投げた時、ホストのLinuxKernelとSecureNATが二重に応答していたのでした。
原因はわかったわけですが、はてどうしたものか…。 SecureNATの外側はping応答しない設定があればいいんですが、どうも見当たらない。まぁ、ping応答をSecureNATに任せてしまうのもありかなと思ったので、今回はKernelのping応答を無効化しました。
SoftEtherServer# sysctl -p net.ipv4.icmp_echo_ignore_all = 1