qbqbqbqb
2022-06-21 13:26:13 +08:00
其实这个就是常见的一种对 iptables 的误解:很多人认为 iptables 里的 NAT 规则( SNAT 和 MASQUERADE ;这里先不讨论 DNAT )是负责“转发”的。
实际上不是这样的,SNAT 和 MASQUERADE 规则,功能就仅仅是做 NAT ,也就是对从指定出口转发出去的数据包修改源 IP ,并且建立临时映射对返程数据包做对应的处理使其能被正确收到,仅此而已。
至于这个数据包会不会从“指定出口”出去,这个不归 iptables 管,归路由表管。
想实现这个需求需要用到“策略路由”,流程上大概是在 iptables 的 mangle 表里给数据包用 MARK 操作打上标签,然后再在 ip route 这边新建一个路由表 table 并且设定相应的路由,和主路由表区分开来(比如说你现在主路由表是默认走 tun0 ,就新建一张默认走 eth0 的路由表),最后再用 ip rule 里面提供的 fwmark 规则指定打了特定标签的数据包走新建的路由表。