使“ip 规则”的优先级高于“本地”

使“ip 规则”的优先级高于“本地”

我正在尝试使用 fwmarks 将一部分传入流量重定向到其他目的地。

步骤

1)标记匹配的传入数据包:

iptables -t mangle -A PREROUTING -i pppoe0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 6

2)添加一条规则,将标记的数据包引导至路由表“200”。

ip rule add fwmark 6 table 200

3)在路由表“200”上添加到新目的地的默认路由。

ip route all default via 192.168.33.2 table 200

问题

iptables -L PREROUTING -t mangle -v显示数据包与我在步骤 1 中制定的规则相匹配,但它们从未被转发到我期望的位置。

我认为问题在于流量的目的地是主机本地的地址,并且localIP 规则与我在步骤 2 中添加的规则相匹配,例如

~# ip rule show
0:      from all lookup local   <--- taking priority...
32765:  from all fwmark 0x6 lookup 200   <--- ... over this.
32766:  from all lookup main
32767:  from all lookup default

问题:有没有办法让我的规则优先于其他local规则?

答案1

preference您可以使用(或prio或等)关键字指定规则优先级,pref以覆盖为该规则选择的默认优先级(通常是“低于最低优先级 1 且不等于 0”)。

您还可以创建一个重复其他规则但使用不同优先级的规则,然后删除具有其他优先级的原始规则:这相当于更改规则的优先级。

您可以按照以下方法进行操作:

ip rule add preference 200 fwmark 0x6 lookup 200
ip rule add preference 300 lookup local
ip rule delete preference 0

这会将查找本地路由表的规则从 0 移动到 300,为其他规则的优先权留出空间,例如现在优先级为 200 的规则。此顺序可防止任何连接丢失(假设路由表 200 本身不会造成任何连接丢失)。


在 SU 上的示例,我利用这一点来回答通常用于没有 NAT 或 fwmark 的本地系统的流量:

使用 Wireguard 为本地网络中的机器提供来自 VPS 的公共地址


避免iptables因为这通常是让它发挥作用的最好方法。这需要内核 >= 4.17

扩展 fib 规则匹配支持,包括 sport、dport 和 ip proto 匹配(以完成 5 元组匹配支持)。数据中心中基于策略的路由的常见用例需要 5 元组匹配

没有iptables分数这看起来像:

ip rule add preference 200 iif pppoe0 ipproto tcp dport 80 lookup 200

加上反向方向,这取决于问题,可能是其他接口,或者在某些情况下iif lo是意味着本地启动的特殊词语:

ip rule add preference 201 iif ... ipproto tcp sport 80 lookup 200

我无法给出完整的答案,因为涉及许多因素,并且取决于最终目标,这里不是很清楚(您可以查看我的 SU 答案,了解所有可能出错且必须进行更改的地方,例如在某些情况下是 ARP)。

相关内容