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 ?
1
zealic 2020-04-10 00:59:05 +08:00
Centos6 的话我记得应该是 2.4~2.6 的内核,
2.4 的内核 NAT 转发行为略有不同,建议升级系统后再试试。 这种复杂的网络关系一般是建议建立多个 chain 进行管理。 |
2
qazwsxkevin OP @zealic 谢谢,我明天看看内核是多少版本的,再更新一下帖子,
其实网络并不复杂,就是现在这个需求比较难理解,按道理,这个 iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -o eth8 -j MASQUERADE 应该就可以做到的, 不过结果又不知道出了什么问题。。。。 |
3
zealic 2020-04-10 01:15:25 +08:00
MASQUERADE 不工作可以考虑直接指 IP 到 192.168.33.6,
我之前也遇见过 MASQUERADE 不工作,直接指 IP 可行的情况。 |
4
digimoon 2020-04-10 01:16:22 +08:00
这个不是要设置策略路由么? iptables 是防火墙不干路由的事啊
|
6
qazwsxkevin OP @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 。。。 |
7
EPr2hh6LADQWqRVH 2020-04-10 01:20:27 +08:00 via Android
你 J 口进来的流量是访问哪里的呀,要是走默认路由的流量的话就全从 A 口走了啊,不走 K 口的。
你这个情况是要 mangle 标记流量走另外的路由表的 |
8
sNullp 2020-04-10 01:20:47 +08:00
楼主需要在 iptables -t mangle mark J 口进来的数据包,然后设置被 mark 的包走另一个路由表,其中指明 K 口抓发即可。
NAT 只需要对内网 IP 做。不是很明白楼主 K 口的网段是否是内网,如果是的话你的 NAT 做反了。 |
9
qazwsxkevin OP @digimoon 嗯,其实我也是半模糊,同时做了 NAT,又要单独做一个路由指向。。。
|
11
qazwsxkevin OP @avastms J 口 172.16.20/0/24 去往 0/0 (也就是全部流量),不走 eth0 出去,走 K 口去 192.168.33.254 。。。
|
12
EPr2hh6LADQWqRVH 2020-04-10 01:28:44 +08:00 via Android
@qazwsxkevin 你看上面 @sNullp 跟我说的一样,你这需要 mangle 标记然后让流量查另一个路由表,光 iptables 不行,得单开一张默认路由是 K 口的路由表
|
13
ysc3839 2020-04-10 01:51:45 +08:00
我不懂如何配置,不过如果条件允许的话改用 OpenWrt,也许会容易很多。
|
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 |
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 |
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 |
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 相关配置文件。 |
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 。 |
19
qbqbqbqb 2020-04-10 14:05:32 +08:00
汗,写了这么多突然发现搞错了,还有个 A 网卡...
如果没有 A 网卡的话,我这个配置是没问题的。 有 A 网卡的话,就需要按照上面其它网友说的那样配置策略路由了。但是你这个 iptables 的配置应该是没有问题不需要改的。 |
20
qbqbqbqb 2020-04-10 14:09:48 +08:00
因为 iptables 在这里只是起到一个 NAT 的作用,指定从 eth8 出去的数据包需要进行 IP 伪装。
具体数据包的流向,还是由路由表负责的。 |
21
qazwsxkevin OP 感谢各位热心解答,
这个应用已经解决, 正如各位所说的,做了 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 就正常了,正常逻辑是指定接口会更细化,但实际指了不能工作,也不知道是什么原因了。。。 |