在linux平台上用iptables实现数据转发
2012-10-27潘永才张尚徽王富单文斌湖北大学物理学与电子技术学院湖北武汉430062
潘永才 张尚徽 王富 单文斌湖北大学物理学与电子技术学院,湖北 武汉 430062
在linux平台上用iptables实现数据转发
潘永才 张尚徽 王富 单文斌
湖北大学物理学与电子技术学院,湖北 武汉 430062
网络地址转换(NAT)可以实现透明代理、端口重定向和负载平衡等功能,iptables具有NAT功能,本文叙述了NAT的工作原理,然后介绍了如何利用iptables的nat功能实现数据转发功能。
NAT;Iptables; IP映射;数据转发
NAT;Iptables; IP Map;Data Forward
引言
由于生活和工业上的特殊应用,经常需要数据转发和透传功能,路由器可以实现数据转发,但实际生活中是在某一平台上做数据转发同时实现其它功能,所以要自己开发具有数据转发功能的平台。在应用开发中可以使用scoket编程实现数据转发,但这样做费时费力,而且转发的稳定性不敢保证。NAT可以对数据包的源IP地址、目的IP地址、源端口、目的端口等进行改写[1],从而可以实现数据转发。Iptables具有nat功能,iptables是linux系统自带的防火墙系统,利用iptables实现数据转发,不但简单而且稳定性很好。
1.NAT的工作原理
NAT的基本原理:改变IP包头,使目的地址、源地址或两个地址在包头中被不同地址替换。
NAT的工作原理:下图所示,是两个公司通过Internet网络互相交流,是NAT的典型应用,通过它来认识NAT工作原理。我们清楚,在局域网内部的私有地址是不能访问外网的,必须转换成公有地址才可以访问Internet,我们以PC1: 192. 168.2.4访问User1: 192.168.2.4为例说明访问过程。
1.1 PC1向RA(网关)发送请求,告诉自己的私有IP地址和MAC地址,并且要求自己要到达User1主机。
1.2 RA收到请求后,把PC1的源IP地址进行转换,变成内部全局地址,即公有地址202.16.58.1,并且为PC1指定一个随机产生的端口号,发送到Inter网。
1.3 Inter网络收到了内部全局IP地址的请求,进行路由选择,被RB接收,RB通过查看RA发送过来的内部全局IP地址和端口号等信息,直接发送给192.168. 2.4网络的网关。
1.4 网关路由器RB收到了信息,根据对方发过来的目标主机信息,把数据传输给 User1主机。
1.5 根据ICMP协议,user1主机需要回应,对数据进行相应的处理,把数据封装后发送给网关。
1.6 网关把user1的私有IP地址转换成外部局部IP地址,即公有地址202.16. 58.2,通过这个公有地址,转发到路由器RA。
1.7 RA收到数据包,查看自己缓存里的对应的主机和端口,并对PC1进行转发。
图1所示是两个公司通过Internet网络互相交流,实际过程也就是ip映射来进行数据转发。
2.iptables数据转发脚本 [2][4]
上面演示了NAT工作原理,现在介绍如何用iptables实现上面过程,为了便于结果的验证,笔者把中间的internet公网ip,换成局域网ip,原理上还是一样的。
首先我们需要一台l i n u x的双网卡PC/嵌入式平台。接下来按照图2所示,搭建实验环境。设置A、B网段的子网掩码为255.255.255.0, PC1的IP地址为192. 168.1.4, User1的IP地址为192.168.2.4,这样两个网段的机器是不能相互访问的。现要使PC1和User1互相访问,主要实现脚本如下。
2.1 Linux平台网口1接A网段,网口2接B网段。设置两个网卡的ip,命令如下:
ifconfig eth0192.168.1.2netmask 255.255.255.0up //设置A网段任意可用ip,命令根据具体平台改变
ifconfig eth1192.168.2.2netmask 255.255.255.0up //设置B网段任意可用ip
2.2 实现linux数据包转发,把文件/ proc/sys/net/ipv4/ip_forward的值设定为1,命令如下:echo "1" > /proc/sys/net/ ipv4/ip_forward。
2.3 清空原有的iptables的表(主要是filter表和nat表)和表中的链:
iptables -F
iptables -X
iptables -Z
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
2.4 为了不影响其他机子访问linux平台,给网卡添加ip地址,这样,访问A网段192.168.1.3的时候,就会转发到B网段的192.168.2.4上去,而访问192.168. 1.2则不会受影响。
ip address add 192.168.1.3 brd + dev eth0
ip address add 192.168.2.3 brd + dev eth1
2.5 设置filter表中三个链的默认规则,进入(INPUT)发出(OUTPUT)都是允许ACCE PT,转发(FO RWAR D)是丢弃DROP。
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
2.6 设置允许对机器192.168.1.4和192.168.2.4的访问
iptables -A FORWARD -s 192. 168.1.4-j ACCEPT
iptables -A FORWARD -d 192. 168.1.4-j ACCEPT
iptables -A FORWARD -s 192. 168.2.4-j ACCEPT
iptables -A FORWARD -d 192. 168.2.4-j ACCEPT
2.7 下面命令的意义是nat标的三条链默认接受任何数据传输
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
2.8 真正实现地址转换的语句,意义为:在PREROUTING链中(也就是刚进入lin ux服务器的数据包),将目的地址为192.168.1.3的数据包进行修改,使得其目的地址变为 192.168.2.4;在POSTROUTING链中(要送出linux服务器的数据包),将源地址为192.168.2.4的数据包的源地址改为192.168.1.3[3];
iptables -t nat -A PREROUTING -d 192.168.1.3-j DNAT --to 192. 168.2.4
iptables -t nat -A POSTROUTING -s 192.168.2.4-j SNAT --to 192. 168.1.3
iptables -t nat -A PREROUTING -d 192.168.2.3-j DNAT --to 192. 168.1.4
iptables -t nat -A POSTROUTING -s 192.168.1.4-j SNAT --to 192. 168.2.3
图1
图2
自此已经完成脚本的编写,如果上图中间的平台为PC机,那么直接执行上述脚本,PC1和User1就可以互相访问。比如:PC1要ping User1,在PC1终端执行ping 192.168.1.3实际上ping的就是User1,类似的User1访问PC1也是通过访问192. 168.2.3来转发实现。如果上图中间平台为嵌入式平台,那么还要进行iptables移植操作。Iptables移植过程包括移植交叉编译支持iptables内核和移植交叉编译的iptables程序两部分,在此不做详细叙述。
3.实验结果
笔者在装有linux系统PC平台和嵌入式平台都做了测试。
PC平台:选用装有linux系统的笔记本,笔记本有线网连接A网段、无线网连接B网段,相应的上述脚本设置IP命令的网卡eth1换成wlan0。
嵌入式平台:选用SBC6020(SBC6020具有双网卡),SBC6020原始内核和文件系统不支持iptables,所以要移植交叉编译过的支持iptables的内核、和移植交叉编译的iptables和自己编写iptables转发脚本到嵌入式平台。
依照图2连接好各硬件平台,运行iptables转发脚本,使用PC平台和嵌入式平台效果一样,测试结果如下:
A网段pc1(IP:192.168.1.4)通过终端telnet 192.168.1.3结果登录到B网段User1(IP:192.168.2.4)的机子上,在pc1上ping 192.168.1.3,在User1上用Wireshark软件可以捕获到由开发板IP:192.168.2.3转发过来的消息,这些足以说明通过以上方法实现了数据转发。为了验证数据转发的可靠性,我通过在pc1上安装视频监控客户端,在客户端上添加IP为192.168.1.3的设备,把User1设为IP Camera (IP:192.168.2.4),所有设置好以后,pc1机子上的客户端可以预览和控制IP Camera (IP:192.168.2.4),通过长时间测试,视频转发不丢帧,非常稳定。
[1]阮元生,陶虹才,林霞.网络地址转换技术及其在校园网中的应用.现代计算机[J],2004(2):47~50
[2](美)Michael Rash著;陈健译. Linux防火墙[M].北京:人民邮电出版社,2009
[3]张金良,用 iptables 实现 NAT. 唐山师范学院学报[J],2007.29(2):74~76
[4]Rusty Russell.Linux 2.4Nat HOWTO.2000(5)
In the Linux Platform to Realize Data Forwarding Based on Iptables
Network Address Translation(NAT) would allow hosts in a private network to transparently access the external network,which has the function of port redirection and load balance. Iptables have NAT function.This paper discusses the mechanism of NAT, and illustrates how to use Iptables on linux platform to achieve data forwarding.
10.3969/j.issn.1001-8972.2012.04.026