连接不遵守 conntrack

连接不遵守 conntrack

我在接口 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 中显示为回复,但程序却没有收到?我还能查看什么?

相关内容