Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
qazwsxkevin
V2EX  ›  Linux

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

  •  1
     
  •   qazwsxkevin · Apr 10, 2020 · 6168 views
    This topic created in 2400 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
    zealic
    Apr 10, 2020
    1
    Centos6 的话我记得应该是 2.4~2.6 的内核,
    2.4 的内核 NAT 转发行为略有不同,建议升级系统后再试试。

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

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

    你这个情况是要 mangle 标记流量走另外的路由表的
    sNullp
    sNullp
    Apr 10, 2020
    8
    楼主需要在 iptables -t mangle mark J 口进来的数据包,然后设置被 mark 的包走另一个路由表,其中指明 K 口抓发即可。
    NAT 只需要对内网 IP 做。不是很明白楼主 K 口的网段是否是内网,如果是的话你的 NAT 做反了。
    qazwsxkevin
    qazwsxkevin
    OP
    Apr 10, 2020
    9
    @digimoon 嗯,其实我也是半模糊,同时做了 NAT,又要单独做一个路由指向。。。
    sNullp
    sNullp
    Apr 10, 2020
    10
    @sNullp 抓发即可->转发即可
    qazwsxkevin
    qazwsxkevin
    OP
    Apr 10, 2020
    11
    @avastms J 口 172.16.20/0/24 去往 0/0 (也就是全部流量),不走 eth0 出去,走 K 口去 192.168.33.254 。。。
    EPr2hh6LADQWqRVH
    EPr2hh6LADQWqRVH
    Apr 10, 2020 via Android
    12
    @qazwsxkevin 你看上面 @sNullp 跟我说的一样,你这需要 mangle 标记然后让流量查另一个路由表,光 iptables 不行,得单开一张默认路由是 K 口的路由表
    ysc3839
    ysc3839
    Apr 10, 2020
    13
    我不懂如何配置,不过如果条件允许的话改用 OpenWrt,也许会容易很多。
    bfdh
    bfdh
    Apr 10, 2020
    14
    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
    weyou
    Apr 10, 2020 via Android
    15
    策略路由试试
    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
    weyou
    Apr 10, 2020 via Android
    16
    修正上楼:
    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
    qbqbqbqb
    Apr 10, 2020
    17
    这个 iptable 的 NAT 设置应该没有问题
    检查一下:
    1. 路由表是否正确?检查路由表里面默认路由是不是从 192.那个接口出去的。如果有问题的话就要修改网络设置,172.那个网卡应该只配置 IP 不配置网关。
    2. 有没有启用 IP 转发功能?命令 sysctl net.ipv4.ip_forward 输出 1 才算成功。如果输出 0 的话就要修改配置,命令 sysctl -w net.ipv4.ip_forward=1 可临时启用,要永久启用还要修改 sysctl 相关配置文件。
    qbqbqbqb
    qbqbqbqb
    Apr 10, 2020
    18
    补充一下,配置正确的话路由表里应该有这样几个条目:
    网段 掩码 下一跳 接口
    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
    qbqbqbqb
    Apr 10, 2020
    19
    汗,写了这么多突然发现搞错了,还有个 A 网卡...

    如果没有 A 网卡的话,我这个配置是没问题的。
    有 A 网卡的话,就需要按照上面其它网友说的那样配置策略路由了。但是你这个 iptables 的配置应该是没有问题不需要改的。
    qbqbqbqb
    qbqbqbqb
    Apr 10, 2020
    20
    因为 iptables 在这里只是起到一个 NAT 的作用,指定从 eth8 出去的数据包需要进行 IP 伪装。
    具体数据包的流向,还是由路由表负责的。
    qazwsxkevin
    qazwsxkevin
    OP
    Apr 13, 2020
    21
    感谢各位热心解答,
    这个应用已经解决,
    正如各位所说的,做了 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   ·   Privacy   ·   Solana   ·   5050 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    ♥ Do have faith in what you're doing.