王 石,楊懷江,董 琰,李向龍
(1.中國科學院長春光學精密機械與物理研究所,吉林 長春 130033;2.中國科學院大學,北京 100039;3.東北師范大學信息化管理與規劃辦公室,吉林 長春 130024)
百萬級并發連接的NAT關鍵技術研究
王石1,2,3,楊懷江1,董琰3,李向龍3
(1.中國科學院長春光學精密機械與物理研究所,吉林 長春 130033;2.中國科學院大學,北京 100039;3.東北師范大學信息化管理與規劃辦公室,吉林 長春 130024)
[摘要]利用Linux服務器iptables工具實現了NAT功能.通過對Linux內核參數的修改使NAT形成百萬級并發連接,利用bonding技術聚合塊網卡提升了數據的轉發能力.啟用路由功能后,將服務器應用到某高校校園網出口,可以作為邊界設備代替路由器,而且運行穩定.
[關鍵詞]NAT;Linux bonding;Linux內核參數優化
2011年2月,全球互聯網地址分配機構IANA宣布IPv4地址已經分配完畢,這意味著新入網用戶將使用網絡地址轉換技術(NAT)實現互聯網接入.NAT技術采用多對一的動態映射方式實現了園區網可重用本地地址的功能,在IPv4地址資源有限的情況下無限拓展了其適用范圍,因而得到了廣泛應用.目前,對NAT技術的研究主要在NAT-PT及NAT穿越等方面.利用有限資源構建大容量NAT服務的實際應用研究很少,本文利用Linux服務器iptables工具使NAT實現了功能級.通過對Linux內核參數的修改使NAT的并發連接達到百萬級;利用bonding技術聚合塊網卡提升數據轉發能力;啟用路由功能后,將服務器應用到某高校校園網出口,在不限制具體網絡應用的前提下,可以作為邊界設備代替路由器,而且運行穩定.
1NAT的工作原理
NAT英文全稱Network Address Translation,即網絡地址轉換.于1994年在RFC1631中[1]首次被提出,是目前為解決IPv4地址枯竭和放大應用問題最廣泛的解決方案[2],優點是不需要更改主機和路由器而進行增量安裝.IP地址按使用范圍可分為本地地址和全局地址[3].本地地址即可重用地址,包括10.0.0.0/8、172.16.0.0/12和192.168.0.0/16;全局地址即全球唯一地址.一個地址要么是本地地址,要么是全局地址,沒有重疊.NAT的類型可以分為多種形式,本文選取應用廣泛的NAPT類型[4-5],也稱為“多對一”的NAT,NAPT英文全稱Network Address Port Translation,即網絡端口地址轉換,是一種動態轉換,可以完成多個本地地址轉換成同一全局地址,使用不同的端口號來區分不同的主機、不同的進程.NAT的基本原理是改變IP包頭,使目的地址、原地址或2個地址在包頭中被不同地址替換.
NAT的基本操作過程[6]如圖1所示.當PC 1(10.10.10.3)希望發送數據包到Internet節點(61.138.177.1)時,數據包經過Switch(網關)轉發至NAT SERVER, NAT SERVER檢查數據包的IP包頭,得到數據包的IP源地址、源端口,從NAT POOL中選取一個全局地址61.138.177.3分配給PC 1,將10.10.10.3和61.138.177.3的映射關系及相應端口信息存儲于內存的NAT映射表中,同時將數據包上的本地地址10.10.10.3 替換成全局地址61.138.177.3.此時PC 1的數據包以源地址61.138.177.3與Internet節點61.138.177.1進行通信.61.138.177.1的回應數據包查找NAT SERVER映射表及IP地址的替換過程并發送到PC 1,從而完成數據通信.映射表中的映射信息會有一定的生命周期,以防止映射表過大,超過生命周期相應的映射信息會被自動刪除.PC 1在生命周期內發送數據包至Internet節點時,會使用之前分配的全局地址61.138.177.3,超過生命周期時NAT SERVER會分配新的全局地址,形成新的映射信息.

圖1 NAT的基本操作過程
2bonding技術實現
實際使用NAT SERVER作為邊界設備布置于某高校校園網出口,出口聯通帶寬為2 GB/s.而啟用NAT服務的Linux服務器一般為千兆網卡,這就需要進行網卡捆綁操作配合交換機的端口聚合以倍增數據轉發能力.本文利用了Linux bonding驅動提供一個把多個網絡接口設備捆綁為單個的網絡接口的功能,實現了網絡負載均衡[7].Linux服務器需要配置4塊物理網卡eth0、eth1、eth2和eth3,其中eth0和eth1綁定后的虛擬口是bond0,物理線路上聯是聯通2G出口;eth2和eth3綁定后的虛擬口是bond0,物理線路下聯是交換機聚合端口.當NAT POOL中地址數量超過物理網卡數量,需使用虛擬網卡技術[8].實現步驟如下(以圖1為例):
(1)綁定物理網卡eth0、eth1至虛擬口bond0.
編輯/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=bond0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
編輯/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=bond0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
(2)配置虛擬口bond0,并設置一網卡多地址.
編輯/etc/sysconfig/network-scripts/ifcfg-bond0:3
DEVICE=bond0:3
BOOTPROTO=static
ONBOOT=yes
IPADDR=61.138.177.3
NETMASK=255.255.255.224
…
編輯/etc/sysconfig/network-scripts/ifcfg-bond0:30
DEVICE=bond0:30
BOOTPROTO=static
ONBOOT=yes
IPADDR=61.138.177.30
NETMASK=255.255.255.224
(3)綁定物理網卡eth2、eth3至虛擬口bond1.
步驟與綁定物理網卡eth0、eth1類似.
(4)配置網關.
編輯/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=Nat.localdomain
GATEWAY=61.138.177.1
(5)配置bonding功能.
編輯/etc/modprobe/bonding.conf
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=0
其中:miimon=200表示監視網絡連接的頻度,單位是ms;mode=0表示提供負載均衡功能,按順序輪流把數據包發送給包含在bonding口內物理網卡.
3百萬級并發連接的NAT技術實現
Linux下NAT功能是通過netfilter網絡架構下NAT模塊實現的[9].netfilter是Linux 2.4.x引入的一個子系統,它作為一個通用的、抽象的框架,提供一整套的hook函數的管理機制,為內核模塊參與IP層數據包處理提供了很大的方便,內核的防火墻模塊(ip_tables)正是通過把自己所編寫的一些鉤子函數注冊到netfilter所監控的5個關鍵點中,以這種方式介入到對數據包的處理.鉤子函數按功能可分為連接跟蹤、數據包過濾、網絡地址轉換(NAT)和數據包的修改.在Netfilter下conntrack模塊維護連接狀態信息代表了NAT轉換能力.為了更充分地利用netfilter下NAT模塊功能,需要對ip_conntrack_max和hashsize等參數進行優化.ip_conntrack_max代表netfilter模塊能夠同時處理最大conntrack條目.hashsize 代表存儲conntrack條目的hash表大小.查看/proc/net/ip_conntrack里的conntrack記錄,這些記錄表示當前被跟蹤的連接,如:
tcp6117SYN_SENTsrc=61.138.177.3dst=61.138.177.1sport=32 775 dport=22[UNREPLIED]src=61.138.177.1dst=61.138.177.3sport=22 dport=32 775 use=2.
這個例子體現了conntrack模塊維護的某個連接狀態.其中使用協議tcp,文中6表示協議類型代碼,177代表生存時間,然后是源地址、源端口、目的地址、目的端口等.
參數修改依據以下理論:以圖1為例,NAT POOL中包含25個IP地址,內網主機訪問外網服務器,每次訪問經過NAT做地址轉換,以NAPT方式實現,分配的IP:Port必須各不相同,此時NAT轉換的上限次數為NAT POOL中IP地址數乘以可以轉換的端口數,即:25×(65 536-1 024)=1 612 800.需要NAT SERVER的轉換能力在1.6×106以上.而對超過1 GB RAM的系統,默認conntrack_max值不超過65 536,實驗環境下未進行參數調優前,NAT轉換條目也確實無法超過65 536.為實現大容量并發的NAT功能,需要對linux內核的一些參數進行修改,主要涉及3個默認的參數為ip_conntrack_max、hashsize和tcp_timeout_established.
在i386架構下的conntrack_max的計算方法為conntrack_max=(x/32)×RAM容量(單位為B)/16 384,x表示處理器位數.Hashsize=conntrack_max/8.以64位CPU和16 GB內存為例:
ip_contrack_max=(64/32)×16×1 024^3/16 384=2 097 152;
Hashsize=ip_contrack_max/8=262 144.
查看內核文件net/ipv4/netfilter/ip_conntrack_proto_tcp.c,可知系統默認設置tcp_timeout_established是5 d,其數值過大將占用大量內存,導致系統死機,故改為300 s.同時調整內核所允許的最大路由條目為
route.max_size=2 097 152.
通過以上調整,Linux SERVER理論上可以完成2×106并發連接的NAT轉換,并具備相應的數據轉發能力.
4仿真實驗
實驗環境為某高校校園網,部署NAT SERVER于網絡邊界以替代路由器.NAT SERVER配置64位4核CPU 2個、16 GB內存、4塊PCI-E千兆獨立網卡,操作系統為CentOS6.4,內核版本為2.6.32,網絡拓撲如圖1.操作步驟如下:
(1)配置NAT,回指路由,hashsize參數優化.
編輯/root/nat
IPPOOL=61.138.177.3-61.138.177.30
iptables-t nat-F
iptables-t nat-A POSTROUTING-s 10.10.10.0/24-o bond0-j SNAT —to $IPPOOL
iptables-save-c >/etc/sysconfig/iptables
route add-add-net 10.10.10.0/24 gw 10.10.10.1
echo“2097152”> /sys/module/nf_conntrack/parameters/hashsize
sysctl-p.
(2)使/root/nat開機自動執行.
編輯/etc/rc.local
/root/nat.
(3)使能ip轉發功能、參數優化.
編輯/etc/sysctl.conf
net.ipv4.ip_forward = 1
net.netfilter.nf_conntrack_max = 2 097 152
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.route.max_size = 2 097 152.
(4)依據第2節bonding技術實現配置網卡.
校園網聯通、電信出口分別架設一臺NAT SERVER,聯通出口帶寬1.4 GB/s,電信出口帶寬1 GB/s,校園網用網高峰同時在線10 000人,單臺NAT SERVER最高并發連接數達到1.7×106.發現NAT SERVER運行穩定,校園網整體狀況未見明顯異常,滿足使用需求.
5結束語
Linux系統自帶的NAT功能強大,但是系統默認的參數配置并沒有完全發揮其使用能力.本文通過對Linux系統NAT相關參數的優化大大擴充了NAT轉換能力,同時應用bonding技術解決了常用NAT SERVER數據轉發能力存在瓶頸的問題.通過實際網絡環境的驗證,證明了NAT SERVER的有效性和實用性.值得注意的是NAT SERVER最好與流控設備互相配合使用,這樣可以使基于應用層的網絡管理更加智能與靈活.另外,由于校園網在線人數多,出口帶寬高,數據量大,選用的獨立網卡的質量和工作能力決定整個NAT SERVER的性能,針對網卡的參數優化和選取標準將是今后的研究內容.
[參考文獻]
[1]EGEVANG K,FRANCIS P.The IP Network Address Translator(NAT)[S].IETF RFC 1631,May 1994[2015-03-01].http://www.rfc-editor.org/rfc/rfc1631.txt.
[2]孫中廷.NAT技術解決IP地址短缺問題的實現[J].辦公自動化,2013,14:42-44.
[3]EDWARDS W,PADJEN R,SKANDIERT.CCNP四合一:學習指南(中文版)[M].張波,謝琳,譯.北京:電子工業出版社,2005:58-77.
[4]王秀欣,戚宇林,王鼎.基于目前NAPT的一種改進算法[J].微型電腦應用,2008,9:18-20.
[5]SRISURESH P,EGEVANG K.Traditional IP network address translator[S].IETF RFC 3022,January 2001[2015-03-01].http://www.rfc-editor.org/rfc/rfc3022.txt.
[6]包亮,潘金貴.網絡地址翻譯系統的原理和應用[J].計算機科學,2001,28(7):36-41.
[7]李騫,彭海云.基于bonding技術的負載均衡研究[J].計算機與數字工程,2011,12:151-153,170.
[8]魏華,鄒鵬.虛擬網卡及設備別名的配置[J].數字技術與應用,2013,12:216.
[9]馮富霞,李森貴.基于Netfilter改善網絡性能的研究與實現[J].安徽工程科技學院學報(自然科學版),2008,23(3):61-64.
(責任編輯:石紹慶)
Research on the key technologies for million concurrent connections of NAT
WANG Shi1,2,3,YANG Huai-jiang1,DONG Yan3,LI Xiang-long3
(1.Changchun Institute of Optics,Fine Mechanics and Physics,Chinese Academy of Sciences,Changchun 130033,China;2.University of Chinese Academy of Sciences,Beijing 100039,China;3.Office of Information Management and Planning,Northeast Normal University,Changchun 130024,China)
Abstract:NAT technology has been widely applied for alleviating the shortage of IPv4 address.In this paper,the NAT function is achieved by using the Linux server iptables tools.Million concurrent connections of NAT are reached via modifing Linux kernel parameters.The bonding technology of polymerization NIC is used in order to improve data forwarding capability.The NAT server is applied to the campus network as boundary router and stable after enabling routing function.
Keywords:NAT;Linux bonding;Linux kernel parameters optimization
[文章編號]1000-1832(2016)02-0089-04
[收稿日期]2015-03-08
[基金項目]吉林省自然科學基金資助項目(20140101189JC,20140101190JC);吉林省教育廳“十二五”社會科學研究項目(2014B053).
[作者簡介]王石(1979—),男,工程師,主要從事信息安全研究.
[中圖分類號]TP 393[學科代碼]520·3040
[文獻標志碼]A
[DOI]10.16163/j.cnki.22-1123/n.2016.02.019