V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
qazwsxkevin
V2EX  ›  Linux

熟悉 Linux 做多网卡软路由(iptables)的朋友,这个高难度,应该怎么做?

  •  1
     
  •   qazwsxkevin · Apr 10, 2020 · 5811 views
    This topic created in 2216 days ago, the information mentioned may be changed or developed.

    linux 的机器,估计就是 Centos6,机器上有很多网口,
    A 网口是主口 eth0 (类似 WAN ),IP 地址是 192.168.89.22/24,机器上的路由表是 0/0 都往 192.168.89.254 走。

    现在有 J 口 eth7 和 K 口 eth8
    J 网口 IP 地址,eth7:172.16.20.254/24
    K 网口 IP 地址,eth8:192.168.33.6/24

    需求一和二: 来自源地址是 172.16.20.0/24 的数据(J 口进来), 在 K 网口出去,eth8 的 IP 做动态 NAT,下一跳往 192.168.33.254 走,并且保证回流的数据,能回流到 172.16.20.0/24

    自己做过的尝试是:
    iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -o eth8 -j MASQUERADE

    用 tcpdump 看到 eth8 根本就没有流量转过去
    但后来听别人说,这种需求 iptables 无法做到
    要用到 ebtables ?

    21 replies    2020-04-13 08:55:39 +08:00
    zealic
        1
    zealic  
       Apr 10, 2020
    Centos6 的话我记得应该是 2.4~2.6 的内核,
    2.4 的内核 NAT 转发行为略有不同,建议升级系统后再试试。

    这种复杂的网络关系一般是建议建立多个 chain 进行管理。
    qazwsxkevin
        2
    qazwsxkevin  
    OP
       Apr 10, 2020
    @zealic 谢谢,我明天看看内核是多少版本的,再更新一下帖子,

    其实网络并不复杂,就是现在这个需求比较难理解,按道理,这个
    iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -o eth8 -j MASQUERADE
    应该就可以做到的,
    不过结果又不知道出了什么问题。。。。
    zealic
        3
    zealic  
       Apr 10, 2020
    MASQUERADE 不工作可以考虑直接指 IP 到 192.168.33.6,
    我之前也遇见过 MASQUERADE 不工作,直接指 IP 可行的情况。
    digimoon
        4
    digimoon  
       Apr 10, 2020
    这个不是要设置策略路由么? iptables 是防火墙不干路由的事啊
    qazwsxkevin
        6
    qazwsxkevin  
    OP
       Apr 10, 2020
    @zealic 其实我没能明白您意思,是指向 192.168.33.6 ?(网口自己本身?)
    还是 254 ? (但事实上机器上原本也没有指向 192.168.33.254 的路由,不能再做 0/0 去指向了,因为原本已经 eth0 口已经有一个 0/0 的默认路由了)
    192.168.33.254 那边不知道 172.16.20.0/24 的网段存在的,所以只能用 eth8 的口做动态 NAT 。。。
    EPr2hh6LADQWqRVH
        7
    EPr2hh6LADQWqRVH  
       Apr 10, 2020 via Android
    你 J 口进来的流量是访问哪里的呀,要是走默认路由的流量的话就全从 A 口走了啊,不走 K 口的。

    你这个情况是要 mangle 标记流量走另外的路由表的
    sNullp
        8
    sNullp  
       Apr 10, 2020
    楼主需要在 iptables -t mangle mark J 口进来的数据包,然后设置被 mark 的包走另一个路由表,其中指明 K 口抓发即可。
    NAT 只需要对内网 IP 做。不是很明白楼主 K 口的网段是否是内网,如果是的话你的 NAT 做反了。
    qazwsxkevin
        9
    qazwsxkevin  
    OP
       Apr 10, 2020
    @digimoon 嗯,其实我也是半模糊,同时做了 NAT,又要单独做一个路由指向。。。
    sNullp
        10
    sNullp  
       Apr 10, 2020
    @sNullp 抓发即可->转发即可
    qazwsxkevin
        11
    qazwsxkevin  
    OP
       Apr 10, 2020
    @avastms J 口 172.16.20/0/24 去往 0/0 (也就是全部流量),不走 eth0 出去,走 K 口去 192.168.33.254 。。。
    EPr2hh6LADQWqRVH
        12
    EPr2hh6LADQWqRVH  
       Apr 10, 2020 via Android
    @qazwsxkevin 你看上面 @sNullp 跟我说的一样,你这需要 mangle 标记然后让流量查另一个路由表,光 iptables 不行,得单开一张默认路由是 K 口的路由表
    ysc3839
        13
    ysc3839  
       Apr 10, 2020
    我不懂如何配置,不过如果条件允许的话改用 OpenWrt,也许会容易很多。
    bfdh
        14
    bfdh  
       Apr 10, 2020
    iptables -tmangle -I PREROUTING -s 172.16.20.0/24 -j MARK --set-mark 23
    ip ru add fwmark 23 table 12
    ip route add default via 192.168.33.254 dev eth8 table 12
    iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -o eth8 -j MASQUERADE

    这样应该可以了
    1 、根据源地址打 mark
    2 、根据 mark 选择路由表
    3 、在对应的路由表中设置默认路由
    4 、NAT
    weyou
        15
    weyou  
       Apr 10, 2020 via Android
    策略路由试试
    ip rule add iif eth7 lookup 100
    ip route add table 100 172.16.20.0/24 dev eth7
    ip route add table 100 default dev eth8
    weyou
        16
    weyou  
       Apr 10, 2020 via Android
    修正上楼:
    ip rule add iif eth7 lookup 100
    ip route add table 100 172.16.20.0/24 via 192.168.33.254 dev eth7
    ip route add table 100 default dev eth8
    qbqbqbqb
        17
    qbqbqbqb  
       Apr 10, 2020
    这个 iptable 的 NAT 设置应该没有问题
    检查一下:
    1. 路由表是否正确?检查路由表里面默认路由是不是从 192.那个接口出去的。如果有问题的话就要修改网络设置,172.那个网卡应该只配置 IP 不配置网关。
    2. 有没有启用 IP 转发功能?命令 sysctl net.ipv4.ip_forward 输出 1 才算成功。如果输出 0 的话就要修改配置,命令 sysctl -w net.ipv4.ip_forward=1 可临时启用,要永久启用还要修改 sysctl 相关配置文件。
    qbqbqbqb
        18
    qbqbqbqb  
       Apr 10, 2020
    补充一下,配置正确的话路由表里应该有这样几个条目:
    网段 掩码 下一跳 接口
    0.0.0.0 0.0.0.0(默认路由) 192.168.33.254 eth8
    172.16.20.0 255.255.255.0 0.0.0.0(直连) eth7
    192.168.33.0 255.255.255.0 0.0.0.0(直连) eth8

    如果两个网卡上都有默认路由那就是配置错了。

    如果不是纯手动命令配置,而是使用了某些网络配置工具(图形界面或者配置文件的),注意 eth7 (内网网卡 172 网段)上面应该只配置相应的 IP 地址,“默认网关”必须留空不配置。eth8 ( 192 外网网段)配置相应的 IP 地址,同时“默认网关”设置成下一跳 192.168.33.254 。
    qbqbqbqb
        19
    qbqbqbqb  
       Apr 10, 2020
    汗,写了这么多突然发现搞错了,还有个 A 网卡...

    如果没有 A 网卡的话,我这个配置是没问题的。
    有 A 网卡的话,就需要按照上面其它网友说的那样配置策略路由了。但是你这个 iptables 的配置应该是没有问题不需要改的。
    qbqbqbqb
        20
    qbqbqbqb  
       Apr 10, 2020
    因为 iptables 在这里只是起到一个 NAT 的作用,指定从 eth8 出去的数据包需要进行 IP 伪装。
    具体数据包的流向,还是由路由表负责的。
    qazwsxkevin
        21
    qazwsxkevin  
    OP
       Apr 13, 2020
    感谢各位热心解答,
    这个应用已经解决,
    正如各位所说的,做了 NAT 后,还要建新路由表+策略路由
    这个 linux 被打磨过,看不出是什么版本改出来的
    有 /etc/sysconfig,没有 issue 和 version_replease 之类的文件,反正文件结构就很像是 CentOS,也像是 Openwrt 改出来的
    关于:
    ip route add default via 192.168.33.254 dev eth8 table 12
    我这里用这句能写上去,但是不能工作
    但是如果不指定接口:
    ip route add default via 192.168.33.254 table 12
    就正常了,正常逻辑是指定接口会更细化,但实际指了不能工作,也不知道是什么原因了。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1078 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 23:56 · PVG 07:56 · LAX 16:56 · JFK 19:56
    ♥ Do have faith in what you're doing.