ttl inherit
IPIP トンネルを作る。
-bash-3.2# ip tunnel add tun0 mode ipip remote 10.0.66.160 local 10.0.66.159 dev eth0 -bash-3.2# ip addr add 172.18.10.3 peer 172.18.10.4 dev tun0 -bash-3.2# ip addr show tun0 5: tun0@eth0: <POINTOPOINT,NOARP> mtu 1480 qdisc noop link/ipip 10.0.66.159 peer 10.0.66.160 inet 172.18.10.3 peer 172.18.10.4/32 scope global tun0 -bash-3.2#
ping を投げつつ tcpdump でパケットを観察する。 TTL に注目してほしい。
-bash-3.2# ifconfig tun0 up -bash-3.2# ping -t 1 172.18.10.4 & [2] 16929 -bash-3.2# PING 172.18.10.4 (172.18.10.4) 56(84) bytes of data. -bash-3.2# tcpdump -n -i eth0 -v -c 1 host 10.0.66.160 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 22:10:01.099068 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto: IPIP (4), length: 104) 10.0.66.159 > 10.0.66.160: IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto: ICMP (1), length: 84) 172.18.10.3 > 172.18.10.4: ICMP echo request, id 8514, seq 44, length 64 1 packets captured 1 packets received by filter 0 packets dropped by kernel -bash-3.2#
内側だけでなく、外側も TTL が 1 になっている。
なんでこんなことになっているかというと、 Linux では TTL を指定せずに IPIP トンネルを作ると ttl inherit となって、中を通るパケットの TTL が外側の TTL になる。
-bash-3.2# ip tunnel show tun0 tun0: ip/ip remote 10.0.66.160 local 10.0.66.159 dev eth0 ttl inherit -bash-3.2#
この上で OSPF を回そうとしたらだいぶハマって辛い気持ちになった。 ping とかは TTL 64 のパケットを投げるので疎通するが、 OSPF は TTL 1 のパケットを投げるので疎通しない。
トンネルの中身が外側に影響するというのはセンス悪いと思う。