答案1
数据包通过TEE克隆,被设置为不被 conntrack 跟踪,阻止被 再次重复,并通过发射本地输出路由堆栈的一部分,因此首先由 raw/OUTPUT 看到(您也可以参考此Netfilter 和通用网络示意图中的数据包流:这将是在本地流程之后)。如果之前对路由数据包进行了复制(例如,在 mangle 或原始 PREROUTING 中),这将是相同的。这使得事情变得困难(但是不是不可能) 接受额外的处理,例如额外的 nat,因为它不会被跟踪,并且很难将其与原始的区分开来。
这是一个例子痕迹(使用 iptables-legacy 的版本)在类似于 OP 的设置中捕获从 192.168.0.2 到 8.8.8.8 进行的 ping:捕获是在路由器上使用iptables -t raw -A OUTPUT -j TRACE
.原本的路由的数据包不会出现,因为它必须从原始/预路由中捕获,从而验证上面的解释,告诉它是从输出完成的。
TRACE: raw:OUTPUT:policy:2 IN= OUT=eth1 SRC=192.168.0.2 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=39209 DF PROTO=ICMP TYPE=8 CODE=0 ID=3070 SEQ=1
TRACE: mangle:OUTPUT:policy:1 IN= OUT=eth1 SRC=192.168.0.2 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=39209 DF PROTO=ICMP TYPE=8 CODE=0 ID=3070 SEQ=1
TRACE: mangle:POSTROUTING:policy:2 IN= OUT=eth1 SRC=192.168.0.2 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=39209 DF PROTO=ICMP TYPE=8 CODE=0 ID=3070 SEQ=1