多网卡Iptables端口转发

文中的网络拓扑图所示的数据包,是从eth0入,eth1出。但是,无论从eth0到eth1,还是从eth1到eth0,均遵守上述的原理。就是说,SNAT和DNAT并没有规定只能在某一个网口(某一侧)。

顺便给出netfilter的完整结构图:

Linux之iptables端口转发(外网访问内网)4

二、实现

====

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。

配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能

cat /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo “1” > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可将命令echo “1” > /proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local 或者在**/etc/sysconfig/network脚本中添加 FORWARD_IPV4=“YES”**

但在我的系统中没有这两个文件,因此可以修改/etc/sysctl.conf文件,将net.ipv4.ip_forward=1的注释取消即可

根据拓扑图,一一实现不同IP、不同端口的映射,如下命令为一种示例形式:

第一台设备的telnet服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23

iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 23 -j SNAT --to 100.100.100.44

第二台设备的telnet服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23

iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 23 -j SNAT --to 100.100.100.44

第一台设备的web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80

iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 100.100.100.44

第二台设备的web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80

iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 80 -j SNAT --to 100.100.100.44

以第一台设备转发命令为例,用白话解释一下。

  • 第一条是PREROUTING链,只能进行DNAT,该命令对从eth0进入且目的IP为172.18.44.44(注:可以用-s指明数据包来源地址,但这时无法知道来源IP是多少,虽然可以用网段的做法,但用-d则指定必须一定唯一的是本机的eth0地址,相对好一点),端口号为2321的数据包进行目的地址更改,更改为100.100.100.101,端口为23,亦即此包的目的地为第一台设备的telnet服务。

  • 第二条是POSTROUTING链,只能进行SNAT,即对先前已经DNAT过的数据包修改源IP地址。这样,这个数据包达到第一台设备时,源IP地址、目的IP地址,均为100.100.100.0/24网段了。

上述命令的SNAT有些冗余,可以做简化,命令如下:

第一台设备的telnet、web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80

第二台设备的telnet、web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80

源IP地址SNAT

iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44

实际中使用的命令可能还有变化(简化),本文不再展示。

三、测试

====

为了保证文中所述的正确性,本节列出操作结果,以及实验过程的信息。服务器(网关)上的路由表如下:

root@latelee:test# route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

100.100.100.0 * 255.255.255.0 U 0 0 0 eth1

172.18.0.0 * 255.255.0.0 U 0 0 0 eth0

可以看到服务器上有2个网卡,网段都不相同。iptables的NAT表如下:

root@latelee:~# iptables -L -t nat

Chain PREROUTING (policy ACCEPT)

target prot opt source destination DNAT tcp – anywhere 172.18.44.44 tcp dpt:2324 to:100.100.100.101:23

Chain INPUT (policy ACCEPT)

target prot opt source destination Chain OUTPUT (policy ACCEPT)

target prot opt source destination Chain POSTROUTING (policy ACCEPT)

target prot opt source destination SNAT all – anywhere 100.100.100.0/24 to:100.100.100.44

可以看到,PREROUTING和POSTROUTING各有一条规则,这些规则由上文命令所产生。对应的,在第一号设备上查看路由信息,如下:

root@latelee:~# route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

100.100.100.0 * 255.255.255.0 U 0 0 0 eth0

172.18.0.0 * 255.255.0.0 U 0 0 0 eth1

default 100.100.100.44 0.0.0.0 UG 0 0 0 eth0

可以看到这台设备有2个网卡,默认网关为服务器的IP地址。但是,其中一个网卡eth1竟然和PC所在网段相同!如果没有进行源IP地址修改(伪装),会匹配到eth1这个网口,无法匹配eth0。

在外网的PC上对设备进行telnet,设备抓包信息如下:

IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 1:4, ack 16, win 256, length 3

IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3

IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21

IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 19:34, ack 25, win 2190, length 15

可见,所有包的IP段都相同。在服务器上对内网eth1进行抓包,由于进行了DNAT和SNAT,此网卡数据包IP地址还是100.100.100.0/24网段,如下:

IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [.], ack 1, win 256, length 0

IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15

IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3

IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3

但是,在服务器eth0抓包,将会是172.18.0.0/16的网段数据包:

IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [P.], seq 18:20, ack 154, win 255, length 2

IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2

IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0

IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0

IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0

IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0

最后的最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的

最后,互联网不存在所谓的寒冬,只是你没有努力罢了!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的

[外链图片转存中…(img-uUCyvLUz-1715044479722)]

最后,互联网不存在所谓的寒冬,只是你没有努力罢了!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中实现双网卡端口转发,可以使用iptables命令来进行配置。以下是一个简单的配置示例: 1. 首先,确保你的Linux系统上已经安装了iptables工具。 2. 打开终端,使用root用户或者使用sudo命令以管理员权限登录。 3. 启用IP转发功能,可以通过编辑/sysctl.conf文件并将net.ipv4.ip_forward设置为1来实现。 4. 使用以下命令加载新的sysctl.conf设置,使其生效: ``` sudo sysctl -p ``` 5. 使用以下命令创建一个新的iptables规则,将来自第一个网卡的流量转发到第二个网卡的指定端口: ``` sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport <源端口> -j DNAT --to-destination <目标IP地址>:<目标端口> ``` 这里,eth0是第一个网卡的接口名称,<源端口>是来自该端口的流量,<目标IP地址>是第二个网卡的IP地址,<目标端口>是要转发到的端口。 6. 使用以下命令允许转发的流量通过第二个网卡: ``` sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport <目标端口> -j ACCEPT ``` 这里,eth0是第一个网卡的接口名称,eth1是第二个网卡的接口名称,<目标端口>是要转发的端口。 7. 最后,保存iptables规则以便重启后生效: ``` sudo iptables-save > /etc/iptables.rules ``` 请注意,这只是一个简单的示例配置,实际配置可能因网络环境和需求的不同而有所变化。你可能还需要进行更多的配置以满足你的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值