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 のパケットを投げるので疎通しない。
トンネルの中身が外側に影響するというのはセンス悪いと思う。