百万级并发连接的NAT关键技术研究

2016-06-30 03:28杨怀江李向龙

王 石,杨怀江,董 琰,李向龙

(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