我正在尝试使用 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 中制定的规则相匹配,但它们从未被转发到我期望的位置。
我认为问题在于流量的目的地是主机本地的地址,并且local
IP 规则与我在步骤 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)。