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

2020-04-10 00:43:26 +08:00
 qazwsxkevin

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 ?

5312 次点击
所在节点    Linux
21 条回复
zealic
2020-04-10 00:59:05 +08:00
Centos6 的话我记得应该是 2.4~2.6 的内核,
2.4 的内核 NAT 转发行为略有不同,建议升级系统后再试试。

这种复杂的网络关系一般是建议建立多个 chain 进行管理。
qazwsxkevin
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
2020-04-10 01:15:25 +08:00
MASQUERADE 不工作可以考虑直接指 IP 到 192.168.33.6,
我之前也遇见过 MASQUERADE 不工作,直接指 IP 可行的情况。
digimoon
2020-04-10 01:16:22 +08:00
这个不是要设置策略路由么? iptables 是防火墙不干路由的事啊
nadoo
2020-04-10 01:17:30 +08:00
1. 添加多个路由表 /etc/iproute2/rt_tables
2. 为每个路由表添加路由;默认路由不同;
3. iptables 中,在 mangle 表 PREROUTING 链中将不同 interface 进来的数据包,使用-j MARK --set-mark NUM 打上不同的标记;
4. ip rule 中,设置具有特定 mark 的数据包走不同的路由表;( from all fwmark NUM lookup tableA)
qazwsxkevin
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
2020-04-10 01:20:27 +08:00
你 J 口进来的流量是访问哪里的呀,要是走默认路由的流量的话就全从 A 口走了啊,不走 K 口的。

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

如果没有 A 网卡的话,我这个配置是没问题的。
有 A 网卡的话,就需要按照上面其它网友说的那样配置策略路由了。但是你这个 iptables 的配置应该是没有问题不需要改的。
qbqbqbqb
2020-04-10 14:09:48 +08:00
因为 iptables 在这里只是起到一个 NAT 的作用,指定从 eth8 出去的数据包需要进行 IP 伪装。
具体数据包的流向,还是由路由表负责的。

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

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

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

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

© 2021 V2EX