V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
qazwsxkevin
V2EX  ›  Linux

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

  •  1
     
  •   qazwsxkevin · 2020-04-10 00:43:26 +08:00 · 5323 次点击
    这是一个创建于 1695 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条回复    2020-04-13 08:55:39 +08:00
    zealic
        1
    zealic  
       2020-04-10 00:59:05 +08:00
    Centos6 的话我记得应该是 2.4~2.6 的内核,
    2.4 的内核 NAT 转发行为略有不同,建议升级系统后再试试。

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

    其实网络并不复杂,就是现在这个需求比较难理解,按道理,这个
    iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -o eth8 -j MASQUERADE
    应该就可以做到的,
    不过结果又不知道出了什么问题。。。。
    zealic
        3
    zealic  
       2020-04-10 01:15:25 +08:00
    MASQUERADE 不工作可以考虑直接指 IP 到 192.168.33.6,
    我之前也遇见过 MASQUERADE 不工作,直接指 IP 可行的情况。
    digimoon
        4
    digimoon  
       2020-04-10 01:16:22 +08:00
    这个不是要设置策略路由么? iptables 是防火墙不干路由的事啊
    qazwsxkevin
        6
    qazwsxkevin  
    OP
       2020-04-10 01:20:16 +08:00
    @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  
       2020-04-10 01:20:27 +08:00 via Android
    你 J 口进来的流量是访问哪里的呀,要是走默认路由的流量的话就全从 A 口走了啊,不走 K 口的。

    你这个情况是要 mangle 标记流量走另外的路由表的
    sNullp
        8
    sNullp  
       2020-04-10 01:20:47 +08:00
    楼主需要在 iptables -t mangle mark J 口进来的数据包,然后设置被 mark 的包走另一个路由表,其中指明 K 口抓发即可。
    NAT 只需要对内网 IP 做。不是很明白楼主 K 口的网段是否是内网,如果是的话你的 NAT 做反了。
    qazwsxkevin
        9
    qazwsxkevin  
    OP
       2020-04-10 01:21:36 +08:00
    @digimoon 嗯,其实我也是半模糊,同时做了 NAT,又要单独做一个路由指向。。。
    sNullp
        10
    sNullp  
       2020-04-10 01:21:40 +08:00
    @sNullp 抓发即可->转发即可
    qazwsxkevin
        11
    qazwsxkevin  
    OP
       2020-04-10 01:23:48 +08:00
    @avastms J 口 172.16.20/0/24 去往 0/0 (也就是全部流量),不走 eth0 出去,走 K 口去 192.168.33.254 。。。
    EPr2hh6LADQWqRVH
        12
    EPr2hh6LADQWqRVH  
       2020-04-10 01:28:44 +08:00 via Android
    @qazwsxkevin 你看上面 @sNullp 跟我说的一样,你这需要 mangle 标记然后让流量查另一个路由表,光 iptables 不行,得单开一张默认路由是 K 口的路由表
    ysc3839
        13
    ysc3839  
       2020-04-10 01:51:45 +08:00
    我不懂如何配置,不过如果条件允许的话改用 OpenWrt,也许会容易很多。
    bfdh
        14
    bfdh  
       2020-04-10 09:21:55 +08:00
    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  
       2020-04-10 09:45:05 +08:00 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  
       2020-04-10 09:48:51 +08:00 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  
       2020-04-10 13:45:31 +08:00
    这个 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  
       2020-04-10 13:56:57 +08:00
    补充一下,配置正确的话路由表里应该有这样几个条目:
    网段 掩码 下一跳 接口
    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  
       2020-04-10 14:05:32 +08:00
    汗,写了这么多突然发现搞错了,还有个 A 网卡...

    如果没有 A 网卡的话,我这个配置是没问题的。
    有 A 网卡的话,就需要按照上面其它网友说的那样配置策略路由了。但是你这个 iptables 的配置应该是没有问题不需要改的。
    qbqbqbqb
        20
    qbqbqbqb  
       2020-04-10 14:09:48 +08:00
    因为 iptables 在这里只是起到一个 NAT 的作用,指定从 eth8 出去的数据包需要进行 IP 伪装。
    具体数据包的流向,还是由路由表负责的。
    qazwsxkevin
        21
    qazwsxkevin  
    OP
       2020-04-13 08:55:39 +08:00
    感谢各位热心解答,
    这个应用已经解决,
    正如各位所说的,做了 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
    就正常了,正常逻辑是指定接口会更细化,但实际指了不能工作,也不知道是什么原因了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.