网络拓扑:
路由器:10.0.0.1 网关: 10.0.0.2 服务器:10.0.0.5
服务器拿到的路由表:
default via 10.0.0.2 dev enp2s0 proto dhcp src 10.0.0.5 metric 100
10.0.0.0/24 dev enp2s0 proto kernel scope link src 10.0.0.5
10.0.0.2 dev enp2s0 proto dhcp scope link src 10.0.0.5 metric 100
路由器是 tplink 的,网关是 openwrt 。
如果直接设置在 tplink 的端口转发 12345:tplink:10.0.0.5:12345 无法连上,在 0.5 上抓包表现为:
入:外网进来,到 0.5 的 12345 的包 回:0.5 到外网的出去的包。
很显然,这个时候回包的 dst 是外网地址,走 0.2 出去
0.1 发出去的包 src=外网,dst=0.5 0.1 收到的包 src=0.2,dst=外网 无法匹配。
所以这种情况如何搞呢?
我想到这么几个解决方案:
0.2 是 openwrt 的单臂旁路网关,写了一句:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
作为转发配置。
求教各位大佬如何做比较好呢。。。
1
iBugOne 2021-10-11 21:47:55 +08:00 1
如果你只需要针对一个端口的话,可以用一条策略路由(+一个路由表)来处理
ip rule add from 10.0.0.5 ipproto tcp sport 12345 table 1 pref 1 ip route add default via 10.0.0.1 dev enp2s0 table 1 这两条命令的作用是创建一条路由规则,使来源 10.0.0.5:12345 (TCP) 的包通过表 1 而不是默认的表 main 选择路由,然后路由表 1 里把所有包都发给 tplink 路由器转发就行了 如果你需要开很多个端口的话,一种方法是重复 ip rule 命令把你需要的 sport 都加上(你也可以用 sport 1-10 这种 range 语法),另一种方法是用 iptables mangle 给外面连进来的连接打上 mark 然后 ip rule fwmark 选路由 |