V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
phpfpm
V2EX  ›  问与答

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

  •  
  •   phpfpm · 2021-10-11 20:54:50 +08:00 · 770 次点击
    这是一个创建于 899 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网络拓扑:

    路由器: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
    

    作为转发配置。

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

    iBugOne
        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 选路由
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5453 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:50 · PVG 16:50 · LAX 01:50 · JFK 04:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.