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 ?
Centos6 的话我记得应该是 2.4~2.6 的内核,
2.4 的内核 NAT 转发行为略有不同,建议升级系统后再试试。
这种复杂的网络关系一般是建议建立多个 chain 进行管理。
谢谢,我明天看看内核是多少版本的,再更新一下帖子,
其实网络并不复杂,就是现在这个需求比较难理解,按道理,这个
iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -o eth8 -j MASQUERADE
应该就可以做到的,
不过结果又不知道出了什么问题。。。。
MASQUERADE 不工作可以考虑直接指 IP 到 192.168.33.6,
我之前也遇见过 MASQUERADE 不工作,直接指 IP 可行的情况。
这个不是要设置策略路由么? iptables 是防火墙不干路由的事啊
其实我没能明白您意思,是指向 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 。。。
你 J 口进来的流量是访问哪里的呀,要是走默认路由的流量的话就全从 A 口走了啊,不走 K 口的。
你这个情况是要 mangle 标记流量走另外的路由表的
楼主需要在 iptables -t mangle mark J 口进来的数据包,然后设置被 mark 的包走另一个路由表,其中指明 K 口抓发即可。
NAT 只需要对内网 IP 做。不是很明白楼主 K 口的网段是否是内网,如果是的话你的 NAT 做反了。
嗯,其实我也是半模糊,同时做了 NAT,又要单独做一个路由指向。。。
抓发即可->转发即可
J 口 172.16.20/0/24 去往 0/0 (也就是全部流量),不走 eth0 出去,走 K 口去 192.168.33.254 。。。
你看上面 跟我说的一样,你这需要 mangle 标记然后让流量查另一个路由表,光 iptables 不行,得单开一张默认路由是 K 口的路由表
我不懂如何配置,不过如果条件允许的话改用 OpenWrt,也许会容易很多。
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
策略路由试试
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
修正上楼:
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
这个 iptable 的 NAT 设置应该没有问题
检查一下:
1. 路由表是否正确?检查路由表里面默认路由是不是从 192.那个接口出去的。如果有问题的话就要修改网络设置,172.那个网卡应该只配置 IP 不配置网关。
2. 有没有启用 IP 转发功能?命令 sysctl net.ipv4.ip_forward 输出 1 才算成功。如果输出 0 的话就要修改配置,命令 sysctl -w net.ipv4.ip_forward=1 可临时启用,要永久启用还要修改 sysctl 相关配置文件。
补充一下,配置正确的话路由表里应该有这样几个条目:
网段 掩码 下一跳 接口
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 。
汗,写了这么多突然发现搞错了,还有个 A 网卡...
如果没有 A 网卡的话,我这个配置是没问题的。
有 A 网卡的话,就需要按照上面其它网友说的那样配置策略路由了。但是你这个 iptables 的配置应该是没有问题不需要改的。
因为 iptables 在这里只是起到一个 NAT 的作用,指定从 eth8 出去的数据包需要进行 IP 伪装。
具体数据包的流向,还是由路由表负责的。
感谢各位热心解答,
这个应用已经解决,
正如各位所说的,做了 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
就正常了,正常逻辑是指定接口会更细化,但实际指了不能工作,也不知道是什么原因了。。。