SoftEtherでpingがDUPする

top20190604_softether_ping_dup

自宅で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でした

わかってみれば実にシンプル。原因はSecureNATでした。

tkp_f5YZsG7c4quj.png

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

top20190604_softether_ping_dup