如何设置路由表 or 防火墙,让外网的回包不走网关呢?

2021-10-11 20:54:50 +08:00
 phpfpm

网络拓扑:

路由器: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=外网 无法匹配。

所以这种情况如何搞呢?

我想到这么几个解决方案:

  1. 把 0.5 的 gw 设置为 0.1 (但是此时 0.5 的网络环境就不好了)
  2. 把转发关系设给 0.2,0.2 再转发给 0.5 (不太稳定,有时候容易坏,而且配置麻烦)
  3. 0.5 的回包想办法不给 0.1 (需要在 0.5 上配置 iptables ?)
  4. 0.5 不动,网关=0.2 上,改回包的 src 让 0.1 能匹配上
  5. 内网搞一台 linux 机器单独做转发网关(取代 0.2 )——也不是不行

0.2 是 openwrt 的单臂旁路网关,写了一句:

iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

作为转发配置。

求教各位大佬如何做比较好呢。。。

867 次点击
所在节点    问与答
1 条回复
iBugOne
2021-10-11 21:47:55 +08:00
如果你只需要针对一个端口的话,可以用一条策略路由(+一个路由表)来处理

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 选路由

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/807138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX