潘永才 張尚徽 王富 單文斌湖北大學物理學與電子技術學院,湖北 武漢 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實現數據轉發,不但簡單而且穩定性很好。
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映射來進行數據轉發。
上面演示了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程序兩部分,在此不做詳細敘述。
筆者在裝有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