Linux 在尝试路由数据包时丢弃数据包-为什么?

Linux 在尝试路由数据包时丢弃数据包-为什么?

我使用所有表的所有链的 LOG 目标跟踪数据包,而我看到的数据包的最后一个链是 mangle 表的 PREROUTING 链:

mangle_PREROUTING: IN=eth0 OUT= MAC=00:16:3e:0f:01:00:00:16:3e:0f:02:00:08:00
SRC=10.2.1.2 DST=10.1.1.2 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=60912 PROTO=ICMP
TYPE=0 CODE=0 ID=41230 SEQ=1

http://inai.de/images/nf-packet-flow.png我期望该数据包会出现在 mangle 表的 FORWARD 链中,但它从未到达那里。它们之间唯一的就是路由表。

# ip rule list
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

# ip route list
default via 192.168.178.100 dev eth3
10.1.1.0/24 dev eth1  proto kernel  scope link  src 10.1.1.1
10.1.2.0/24 dev eth2  proto kernel  scope link  src 10.1.2.1
10.5.0.0/24 dev eth0  proto kernel  scope link  src 10.5.0.1
192.168.178.0/24 dev eth3  proto kernel  scope link  src 192.168.178.1

因此该数据包应该可以通过 10.1.1.1 进行路由。(该系统也可以 ping 10.1.1.2。)

iptables(所有链都接受)只有这些规则(最后的日志记录除外):

-t raw -A PREROUTING -j MARK --set-xmark 0x0/0xffffffff
-t mangle -A PREROUTING -s 10.1.1.0/24 -d 10.2.1.0/24 -j MARK --set-xmark 0x1/0xffffffff
-t mangle -A PREROUTING -p esp -j MARK --set-xmark 0x1/0xffffffff

但是这些规则不应该匹配:目的地是 10.1.1.2 并且它不是 ESP...

有什么提示吗?

谨致问候,斯特芬

答案1

我认为您的问题出在 rp_filter 上。您有一个数据包,其源为 10.2.1.2,已在接口 eth0 中收到。您的路由表显示网络 10.2.1.2 是通过 eth3(默认路由)到达的。我想您没有打错字。

如果问题出在 rp_filter 上,数据包会在 FORWARD 之前被丢弃。

rp_filter 表示“反向路径过滤器”,通常默认启用。只允许从正确的接口(根据路由)进入的数据包。

sysctl -w net.ipv4.conf.all.rp_filter=0

相关内容