我在接口 vti68 上设置了隧道。我正在对源和目标进行 NAT。
该主机的本地地址为 10.1.30.51,远程地址为 172.16.0.80。
隧道中的流量被转换为 10.45.89.4 为本地,而 192.168.7.5 为远程。
ip rule add fwmark 0x44 lookup table68
ip route add table table68 default dev vti68
sysctl -w net.ipv4.conf.vti68.rp_filter=0
# use table68 for routing
iptables -t mangle -A OUTPUT -d 172.16.0.56 -j MARK --set-mark 0x44
# NAT
iptables -t raw -A OUTPUT -d 172.16.0.56 -j CT --zone 68
iptables -t nat -A OUTPUT -d 172.16.0.56 -j DNAT --to 192.168.7.5
iptables -t raw -A PREROUTING -i vti68 -d 10.45.89.4 -j CT --zone 68
iptables -t nat -A POSTROUTING -o vti68 -s 10.1.30.51 -j SNAT --to 10.45.89.4
# not necessary for example, but the reverse translation, for completeness
iptables -t nat -A INPUT -i vti68 -s 192.168.7.5 -j SNAT --to 172.16.0.56
iptables -t nat -A PREROUTING -i vti68 -d 10.45.89.4 -j DNAT --to 10.1.30.51\
# debug
iptables -t mangle -A OUTPUT -p icmp -j LOG --log-level=1
iptables -A INPUT -p icmp -j LOG --log-level=1
ping 远程服务器挂起
ping -c1 172.16.0.56
但是使用 iptables 日志,我看到数据包返回。(奇怪的是,回复的 SRC 尚未被 conntrack 反向翻译,但据我所知,这是正常的)。
kernel: IN= OUT=vti68 SRC=10.1.30.51 DST=172.16.0.56 LEN=84 TOS=0x00 PREC=0x00 TTL=255 ID=13082 DF PROTO=ICMP TYPE=8 CODE=0 ID=26071 SEQ=1
kernel: IN=vti68 OUT= MAC= SRC=192.168.7.5 DST=10.1.30.51 LEN=84 TOS=0x00 PREC=0x00 TTL=126 ID=26747 PROTO=ICMP TYPE=0 CODE=0 ID=26071 SEQ=1
tcpdump 显示回复
IP (tos 0x0, ttl 126, id 26794, offset 0, flags [none], proto ICMP (1), length 84)
192.168.7.5 > 10.45.89.4: ICMP echo reply, id 26071, seq 1, length 64
并conntrack -E
显示回复
[NEW] icmp 1 30 src=10.1.30.51 dst=172.16.0.56 type=8 code=0 id=26071 [UNREPLIED] src=192.168.7.5 dst=10.45.89.4 type=0 code=0 id=26071 zone=68
[UPDATE] icmp 1 29 src=10.1.30.51 dst=172.16.0.56 type=8 code=0 id=26071 src=192.168.7.5 dst=10.45.89.4 type=0 code=0 id=26071 zone=68
TCP 连接类似:
[NEW] tcp 6 120 SYN_SENT src=10.1.30.51 dst=172.16.0.56 sport=54336 dport=3389 [UNREPLIED] src=192.168.7.5 dst=10.45.89.4 sport=3389 dport=54336 zone=68
[UPDATE] tcp 6 60 SYN_RECV src=10.1.30.51 dst=172.16.0.56 sport=54336 dport=3389 src=192.168.7.5 dst=10.45.89.4 sport=3389 dport=54336 zone=68
[UPDATE] tcp 6 60 SYN_RECV src=10.1.30.51 dst=172.16.0.56 sport=54336 dport=3389 src=192.168.7.5 dst=10.45.89.4 sport=3389 dport=54336 zone=68
[UPDATE] tcp 6 60 SYN_RECV src=10.1.30.51 dst=172.16.0.56 sport=54336 dport=3389 src=192.168.7.5 dst=10.45.89.4 sport=3389 dport=54336 zone=68
更奇怪的是,我已经针对不同的接口和地址以及远程主机完成了所有这些步骤,并且一切看起来都相同,只是 ICMP 依赖并且 TCP 连接实际上完成。
为什么连接会在 conntrack 中显示为回复,但程序却没有收到?我还能查看什么?