姚 炯 (yaojiongcn@yahoo.com.cn), 网络工程师, 杭州师范大学理学院
本文介绍了 Linux 软路由的工作原理,并使用普通 PC 计算机作为硬件设备,在实际网络环境中测试和讨论了 Linux 软路由的性能。实验证明,在百兆以太网络环境中, Linux 软路由的数据报转发速度取决于网络卡的实际速度,并随着软路由系统的应用层服务的增加而降低。该结果为 Linux 软路由的应用和普及提供依据。
0、引言
随着开源软件的发展,越来越多的人开始了解、使用和研究 Linux。目前 Linux 环境下的软路由设计和应用案例已有很多;但是对于实际网络环境中 Linux 软路由的负载性能一直缺乏相关的实测和讨论。本文从 Linux 软路由的框架和实验两部分进行讨论,并给出结论。
1、Netfilter 框架
Netfilter 框架上是整个 Linux 软路由运作的体系,是 Linux2.4 内核处理数据报的流水操作系统。它能够运做在 IPv4、IPv6 及 Decnet 等网络栈中。Netfilter 框架的概念的提出及主要实现者是 Rusty Russell。
Netfilter 框架如图所示:
Figure xxx. Requires a heading
(1)Netfilter 为每种网络协议定义一套钩子函数,其中为 IPv4 定义了以下5个钩子函数:
[1]NF_IP_PRE_ROUTING.
[2]NF_IP_LOCAL_IN
[3]NF_IP_FORWARD
[4]NF_IP_POST_ROUTING
[5]NF_IP_LOCAL_OUT
(2)这些钩子函数在 Linux 内核的模块中注册,并与之挂接。当数据报流入框架的网络层时,内核模块在框架的钩子函数处[1]接收数据报,并对它进行检查、转发、丢弃或指示 Netfilter 将该数据报通过[2]传入用户空间队列。
(3)如果该数据报被传递给用户空间,将在应用层被异步处理。该层的用户进程(Local Process)在对数据报进行更加精细的检查,修改和装配之后,通过钩子函数[4]把它重新递交给网络层。
Netfilter 框架的数据报分流结构使它极大地降低了数据报转发的延迟,提高了数据报控制的精度;在节省系统开销,提高数据报的处理效率上超越了工作在 Windows 平台的路由软件。
2、Iptables 指令系统
如果 Netfilter 框架是一个数据报流水线,那么我们就需要有能控制流水线作业的指令系统,这个指令系统在 Linux2.4 内核及以上版本中被称为 Iptables。Iptables 的指令由表和规则组成,它直接控制着钩函数和 Linux 内核模块完成数据报的过滤、转发和修改工作。
(1)数据报过滤(Packet Filter): Iptables 中 filter 表格负责检查数据报,并根据规则决定放行或丢弃资料报,它工作在 Netfilter 框架的 Local Process 中。
(2)网络地址转换(NAT:Network Address Translation):Iptables 中的 NAT 表格实现对需要转发的数据报的源地址和目的地址的转换。NAT 表格不同于 filter 表,它只将新连接的第一个数据报遍历表格,而随后的资料报将根据第一个数据报的结果进行同样的转换处理。这使得 NAT 表能在网络层上高速的转发数据报。
(3)数据报处理(Packet Mangling):Iptables 中的 mangle 表格可以实现对数据报的修改或给资料报附上一些额外数据。随着 Iptables 的升级,这个操作将越来越精确。
3、测试代码和计算机配置
Linux 软路由的硬设备采用普通 PC 计算机,计算机的其中一块网络卡(eth0)设置为内网网关,IP 地址为10.1.10.1;另一块网络卡(eth1)设置为外网 IP ,IP 地址为211.155.226.121
3.1、Iptables 代码
iptables –F
iptables -t nat –F
iptables -t mangle –F
##清空原有 Iptables 规则。
echo “1” > /proc/sys/net/ipv4/ip_forward
##打开 Linux 内核数据报转发功能
iptables -t nat -A POSTROUTING -s 10.1.10.0/24 -j SNAT –to 211.155.226.121
##把原地址为局域网内的数据报通过 Linux 软路由转发出去
#log-level:debug,info,notice,warn/warning,err/error,crit,alert,emerg/panic
iptables -A FORWARD -p tcp -m limit –limit 6/minute –limit-burst 1 -j LOG \
–log-level debug –log-prefix “NAT:”
##开启日志记录功能
iptables -t nat -A PREROUTING -d 211.155.226.121 -p tcp –dport 80 \
-j DNAT –to 10.1.10.2:80
##映像 HTTP 协议80端口
modprobe ip_nat_ftp
iptables -t nat -A PREROUTING -d 211.155.226.121 -p tcp –dport 21 \
-j DNAT –to 10.1.10.3:21
##映射 FTP 端口
3.2、计算机配置
表1.硬件配置
设备 型号 实际带宽约
100M 网络卡×2 DLink DFE-530TX 10.7 MBps
32位33MHz PCI总线 MSI865PE 60.0 MBps
7200rpm 硬盘 SAMSUNG SP0812C 39.3 MBps
400MHz 内存 威刚512M DDR400 405.8 MHz
800MHz System Bus Pentium4 2.4c 811.5 MHz
带宽估算
网络卡和硬盘实际带宽利用 IIS 服务的网络和本地回路分别传输文件得出。
CPU、内存频率采用 CPU-Z软件测试得出平均值。
普通 PC 计算机的 PCI 总线带宽约为 60MBps。
由表1可知,网络卡的实际数据传输速度为 10.7MBps,若使用两块 PCI 网络卡则带宽需 2×10.7MBps =21.4MBps,小于 32 位 33MHz PCI 总线带宽 60MBps;而计算机 CPU 、内存传输速度远远大于 PCI 总线和网络卡数据传输速度,因此理论上软路由数据报转发速度取决于网络卡速度。
4、测试结果
软路由稳定运行10天后系统性能:
内核空间 CPU 占用率(sy)为 0.3%,空闲 CPU(id)为 99.7%
系统占用物理内存稳定在 198M(系统启动时占用物理内存 74M)
5Min 内 TCP 连接数最大值为 4120
网络卡eth0平均数据流量 2.77MBps,网络卡 eth1 平均数据流量 2.45MBps,网络负载较轻
通过网关传输文件实测平均速度约为 7.64MBps,最高速度 10.8MBps,较好的符合了表 1 中的实际带宽。这个数值约为网络卡理论速度的 86.4%(网络卡理论速度为12.5 MBps)
开启并使用 VPN 和 DHCP 服务 10 天后,测试系统性能:
内核空间 CPU 占用率(sy)为 0.7%
系统占用物理内存稳定在 297M
5Min 内 TCP 连接数最大值为 4108
网络卡 eth0 平均数据流量 2.81MBps,网络卡 eth1 平均数据流量 2.52MBps,网络负载较轻
通过网关传输文件实测平均速度约为 7.57MBps;最高速度即 10.21MBps。这个数值约为网络卡理论速度的 81.68%
加载 Linux 软路由防火墙策略,测试系统性能:
内核空间 CPU 占用率 0.9%
系统占用物理内存提升为在 301M
通过网关传输文件实测平均速度约为 7.31MBps,最高速度 9.64MBps。这个数值约为网络卡理论速度的 77.1%
5、带宽和并发连接数讨论
5.1、带宽的分配和计算
由测试结果可知,Linux 软路由 CPU 占用率极低,内存稳定。而网络传输平均速度 7.64MBps+2.77MBps=10.41MBps,最高速度 10.8MBps,较好符合表1中的网络卡的实际速度 10.7MBps。因此,百兆的网络中软路由数据报转发速度取决于网络卡速度。在网络繁忙时期,软路由的网络卡负载会很重,损耗几率也大大增加。实际使用中,某些网络卡在高负载下往往容易坏。
如果软路由为纯 NAT 应用,由于 NAT 表工作在网络层,理论上应比应用层服务 IIS 测出的网络卡实际速度要高,估计可以接近或达到网络卡理论速度的 90%,即 11.25MBps 带宽。但如果在软路由中配置高级应用服务,如 VPN,DHCP,HTTP 等和复杂防火墙策略;那么就会占用掉有限的网络卡资源,降低软路由数据报转发速度。根据高级应用服务的数量、开销等实际情况差异,Linux 软路由实际数据报转发速度大约为网络卡理论速度的 70%-90%。
假如纯 NAT 总带宽约为 11.25MBps,某时刻有200台机器共享网络,那么平均每台机器可分到带宽 57.6Kbytes/sec,实际带宽由软路由根据每台 PC 计算机的 TCP 连接数量动态分配。57.6Kbytes/sec 是一个比较理想的数值,因为这样的速度可以保留充足的带宽以预防 P2P 软件的增多和蠕虫病毒突发所带来的冲击。
5.2、局域网并发连接数计算
在 Linux 中运行“cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max”命令可得到 ip_conntrack_max 值,该参数标志着 Linux 软路由可承受的TCP最大并发连接数,它随着计算机物理内存增加而增加,256M 内存时为 16384个;512M 为 32696;1G 为 65392…
在局域网任意 PC 计算机上运行“netstat –s”可得到该计算机的当前 TCP 连接数。当一台 PC 计算机仅为浏览网页,聊天和单线程下载檔等应用,实际 TCP 连接数量不会大于 20 个。当它运行 P2P 软件时,根据实际使用情况,TCP 连接数约为200~400个。以200台 PC 计算机共享网络为例,正常情况下有15%的 PC 计算机正在使用 P2P 软件,则并发 TCP 连接可能会达到 400×30+170×20=12190个。该数量随 P2P 软件使用数量和对外 WEB、FTP 网站流量情况而有所变化。
6、结论
软路由的 CPU、内存处理速度已经远远超过网络卡和 PCI 总线速度;在百兆以太网中软路由数据报转发速度仅决定于网络卡的线速度。笔者曾用赛扬450MHZ 的 CPU,256M 的旧机器架构,软路由在数据包转发性能上完全没有损失。因此 Linux 软路由完全可以采用更低主频率的内存和 CPU 的旧机器来架构。
软路由数据报转发速度与机器应用情况相关,在软路由上运行较多的高级应用服务会占据有限的网络卡资源,降低数据报转发速度。若采用文中的测试代码和计算机配置,Linux 软路由能带200~300台 PC 计算机,该数量因实际网络情况稍有不同。
参考资料
http://www.netfilter.org 介绍了 Netfilter 框架的发展历史和运作原理。
http://iptables-tutorial.frozentux.net 提供了 Iptables 的详细教程。
在 developerWorks Linux 专区 中可以找到为 Linux 开发人员准备的更多参考资料(包括为 Linux 新手准备的 new to Linux),还可以查阅 最受欢迎的文章和教程。
在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
关于作者
姚炯,网络工程师,工作于浙大网新软件产业集团,目前在杭州师范大学理学院攻读硕士学位。