0背景考虑一个网络拓扑应用场景。内部局域网中的多台服务器提供不同的服务,如web服务、FTP服务、ssh、telnet等,并通过服务器(或网关、防火墙)连接到外部网络。如果外网主机需要访问这些服务器,需要在网关上实现转发。再翻译成另一个应用场景,多个设备连接到一个服务器,服务器有2块网卡,分别连接内网和外网。外部网络无法直接访问设备上的数据和服务。在服务器上实现转发后,就可以达到目的了。网络拓扑如下:例如可以通过服务器的8081端口访问1号设备的web服务,通??过8082端口访问2号设备的web服务,这样就可以配置和调整内网设备在外网的参数。同样使用2321访问1号设备的telnet服务,2322访问2号设备的telnet服务,实现登录设备系统、监控设备状态、日志处理等。本文将直接引用此网络拓扑图中的名称和IP地址。实际使用配置根据实际情况修改。此外,不必拘泥于本文给出的名称。和拓扑图中的“设备”一样,可以用安装了Linux的服务器代替。其他类似。一、原理利用Linux系统中的iptables实现防火墙、数据转发等功能。iptables有不同的表(tables),每个表有不同的链(chain),每个链有一个或多个规则(rule)。本文采用NAT(networkaddresstranslation,网络地址转换)表来转发数据包。iptables命令需要使用-t来指定表,如果不指定,将使用系统默认表“filter”。所以在使用NAT时,使用“-tnat”选项。NAT表有3条默认链,分别是PREROUTING、POSTROUTING和OUTPUT。先给出NAT结构,如下图所示:PREROUTING:当一个数据包进来的时候,进入PREROUTIING链。这条链执行的是修改数据包中的目的IP地址,即DNAT(changedestinationIPaddress)。PREROUTING只能进行DNAT。因为有了DNAT,才有可能在路由表中做出判断,决定是发送到本地还是其他网络端口。POSTROUTING:相对来说,在POSTROUTING链之后,传输数据包,链是整个NAT结构的末端。执行的是修改数据包的源IP地址,即SNAT。POSTROUTING只能做SNAT。OUTPUT:为本地生成的数据包定义目的地NAT规则。每个数据包都会依次经过三种不同的机制,先是PREROUTING(DNAT),然后到路由表,最后到POSTROUTING(SNAT)。下面给出数据包流向:本文网络拓扑图中所示的数据包是从eth0输入,从eth1输出。但是无论是从eth0到eth1,还是从eth1到eth0,都遵循以上原则。也就是说,SNAT和DNAT并没有规定只能在某个网口(一侧)。顺便给出netfilter的完整结构图:2.实现为了安全起见,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或将FORWARD_IPV4=添加到/etc/sysconfig/network脚本"YES”,但是我的系统中没有这两个文件,所以可以修改/etc/sysctl.conf文件,取消net.ipv4.ip_forward=1的注释,然后实现不同的IP和不同的Port映射,以下命令是示例形式:#第一个设备的telnet服务iptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport2321-jDNAT--to100.100。100.101:23iptables-tnat-APOSTROUTING-oeth1-d100.100.100.101-ptcp--dport23-jSNAT--to100.100.100.44#第二台设备的Telnet服务iptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport2322-jDNAT--to100.100.100.102:23iptables-tnat-APOSTROUTING-oeth1-d100.100.100.102-ptcp--dport23-jSNAT--to100.100.100.44#第一个设备的网络服务iptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport8081-jDNAT--to100.100.100.101:80iptables-tnat-APOSTROUTING-oeth1-d100.100.100.101-ptcp--dport80-jSNAT--to100.100.100.44#第二台设备的web服务iptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport8082-jDNAT--to100.100.100.102:80iptables-tnat-APOSTROUTING-oeth1-d100.100.100.102-ptcp--dport80-jSNAT--to100.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,webserviceiptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport2321-jDNAT--to100.100.100.101:23iptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport8081-jDNAT--to100.100.100.101:80#第二台设备的telnet和web服务iptables-tnat-APREROUTING-ieth0-d172.18.44.44-ptcp--dport2322-jDNAT--to100.100.100.102:23iptables-tnat-APREROUTING-ieth0-d172.18.44.44-p--dport8082-jDNAT--to100.100。100.102:80#源IP地址SNATiptables-tnat-APOSTROUTING-oeth1-d100.100.100.0/24-jSNAT--to100.100.100.44实际使用的命令可能会有变化(简化),在此未展示文章。3.测试为了保证文中的正确性,本节列出了运行结果和实验过程的相关信息。服务器(网络)上的路由表如下:root@latelee:test#routeKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface100.100.100.0*255.255.255.0U000eth1172.18.0.0*255.255.0.0U000eth0eth0网卡在服务器上有不同的网段可以看到。iptables的nat表:root@latele:?#iptables-l-tnatchainpreterouting(策略接受)targetotototoptoptopt源目标dnattcp-任何地方172.18.44.44.44.44tcpdpt:2324to:100.100.100.100.101:23chainintpo接受)目标protOPT源目标链输出(策略接受)目标蛋白质optOpt源目标链上延伸(策略接受)目标protOptoptopt源目标snat全部-100.100.100.0.0.0/24to:100.100.100.100.44可以POSTROUTING各有一条规则,由上述命令生成。对应的查看第一台设备的路由信息??,如下:root@Latelee:~#RoutekernelipRoutingTabledinationGatewayGENMASKFLAGSMETRICREFUSE100.100.100.0*255.255.0U00ETH0172.172.0172.0172.0172.0172.0172.0172.0172.0172.0172.0172.172.0255.255.0.0U000eth1default100.100.100.440.0.0.0UG000eth0可以看到这个设备有2个网卡,默认网关是服务器的IP地址。但是其中一个网卡eth1居然和PC在同一个网段!如果源IP地址没有被修改(伪装),会匹配网口eth1,但不能匹配eth0。在外网PC上telnet设备,设备抓包信息如下:IP100.100.100.44.32253>100.100.100.101.2323:Flags[P.],seq1:4,ack16,win256,长度3IP100.100。100.101.2323>100.100.100.44.32253:Flags[P.],seq16:19,ack4,win2190,length3IP100.100.100.44.32253>100.100.100.101.2323:Pseq4,sq4.1.101010.1.2323:sq4,25,ack19,win256,length21IP100.100.100.101.2323>100.100.100.44.32253:Flags[P.],seq19:34,ack25,win2190,length15可见,全部数据包具有相同的IP段。在服务器上抓包内网eth1。由于DNAT和SNAT,网卡包的IP地址还是100.100.100.0/24,如下:IP100.100.100.44.32253>100.100.100.101.telnet:Flags[.],ack1,win256,length0IP100.100.100.101.telnet>100.100.100.44.32253:Flags[P.],seq1:16,ack1,win2190,length15IP100.100.100.44.325>01100.101.telnet:Flags[P.],seq1:4,ack16,win256,length3IP100.100.100.101.telnet>100.100.100.44.32253:Flags[P.],seq16:19,ack4,win2190,length3但是如果抓包在eth0服务器上,会是172.18.0.0/16的网段包:IP172.18.44.142.32253>172.18.44.44.2324:Flags[P.],seq18:20,ack154,win255,length2IP172.18.44.44.2324>172.18.44.142.32253:Flags[P.],seq154:156,ack20,win2190,length2IP172.18.44.44.23422.3.1>:Flags[F.],seq156,ack20,win2190,长度0IP172.18.44.142.32253>172.18.44.44.2324:标志[.],ack157,win255,长度0IP172.18.34.28>172.18.34.25.44.44.2324:标志[F.],seq20,ack157,win255,长度0IP172.18.44.44.2324>172.18.44.142.32253:Flags[.],ack21,win2190,length0从抓包分析,本文使用的命令已经能够正确执行DNAT和SNAT4.其他建议使用iptabls命令,使用root用户操作,否则容易失败.rulesecho-e'#!/bin/bashn/sbin/iptables-restore/etc/network/if-pre-up.d/iptableschmod+x/etc/network/if-pre-up.d/iptableslocal测试命令iptables-tnat-APREROUTING-iwlan0-d192.168.11.100-ptcp--dport8081-jDNAT--to192.168.10.101:80iptables-tnat-APOSTROUTING-oeth0-d192.101.10。ptcp--dport80-jSNAT--to192.168.10.52转自:ZONG_XPhttps://blog.csdn.net/zong596...
