iptables 在 mangle 表上跟踪行为

iptables 在 mangle 表上跟踪行为

我正在尝试在我的 Linux 机器中执行 DNAT,并设置了下表:

  • 传入数据包的目的地:1.2.3.4
  • DNAT 后的目的地:5.6.7.8
$ iptables -t nat -L

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  0.0.0.0/0            1.2.3.4       to:5.6.7.8

...

另外还有一个 mangle 表,我不是故意放它的,而是一个默认设置,由于某种原因我无法更改它:

$ iptables -L -n -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
Some-PREROUTING  all  --  0.0.0.0/0            0.0.0.0/0            

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain Some-from-host-endpoint (1 references)
target     prot opt source               destination

Chain Some-PREROUTING (1 references)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0             mark match 0x10000/0x10000
Some-from-host-endpoint  all  --  0.0.0.0/0            0.0.0.0/0            
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0             mark match 0x10000/0x10000

当我使用 tcpdump 检查时,我确实看到目标数据包 1.2.3.4 到达了我的接口。并且我将 ip_forward 设置为 1:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

当我通过以下命令跟踪数据包时:

$ iptables -t raw -I PREROUTING -d 1.2.3.4 -j TRACE
$ modprobe nf_log_ipv4
$ sysctl net.netfilter.nf_log.2=nf_log_ipv4 

我确实看到了捕获的数据包,但结果让我更加困惑:

[17944.068093] TRACE: mangle:PREROUTING:policy:1 IN=eth0.123 OUT= MAC=12:34:56:78:ab:cd:ef:12:34:56:78:ab:08:00 SRC=192.168.1.123 DST=1.2.3.4 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=19764 DF PROTO=TCP SPT=3159 DPT=7878 SEQ=2715979345 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (309402198038ABEF398431232)

我期望目标地址更改为 5.6.7.8 并命中 5.6.7.8 的路由表条目。但看起来并没有发生。

我有以下问题:

  1. 它是否确实匹配一个条目(即 mangle:PREROUTING)或者它是否跟踪最多一个匹配项?

  2. 如果仅命中一个匹配的条目,那么匹配怎么会陷入混乱,而没有命中 NAT 表?

  3. 跟踪显示它匹配“policy:1”。这是否意味着它匹配 PREROUTING 下的“Some-PREROUTING”目标?或者它是“Some-PREROUTING”链下的第一个规则?

相关内容