lovellh 发表于 2004-10-17 11:50:18

Linux路由器的宽带复用 (图) (2003-1-1)       本文出自《网管员世界》2003年第1期 征文选登 栏目http://www.netadmin.com.cn/experience/20040609/2591.asp 宽带复用需求分析随着国内互联网络的蓬勃发展,ADSL与Cable-Modem接入已越来越普遍,同时资费也较传统的DDN和专线接入便宜许多。在实现多用户共享宽带接入的时候,用户的数量急剧增加会带来网络性能的下降,甚至拥塞。根据我们的经验,一条2M的DSL线路,当支持用户的数量超过100个后,在网络使用的高峰期就会产生严重的拥塞问题。因此,出于对网络性能的追求以及提高网络的费效比的目的,如何将资费较为便宜的DSL或Cable-Modem线路进行复用就成为我们面临的问题。根据实际的应用需求,一个切实可用的宽带复用方案需要达到以下目的:1.实现宽带接入的负载均衡。2.当部分线路出现故障时,只要有一条接入线路可用,则网络的使用不受影响。3.当故障排除后,系统能立即启用排除故障后的线路。4.所有操作均自动进行,无须管理员干预,并对用户透明。以我们的实际应用为例说明。如图1,首先配置一台装有四块网卡的Linux服务器,一块网卡接内网,其他三块接外网,目的是复用DSL线路1、DSL线路2和数字电路1,使得三条宽带接入线路(带宽均为2M)可协同工作。其中DSL线路1 IP为1.0.0.2,DSL线路2 IP为1.0.0.3,接入数字电路的网卡IP为3.0.0.2。从接入链路的物理性质来说,所复用DSL和Cable-Modem的带宽是无法累加的,目前Linux/BSD系统的实现方法是基于IP随机分配的策略,因此对单机而言,宽带复用没有任何意义,IP随机分配的优势只有在多用户访问的时候才能体现出来。由于多数提供DSL和Cable-Modem的ISP只提供一个IP甚至是动态分配IP地址,因此需要采用NAT技术实现IP地址转换。实现复用的简单方法由2.2内核开始,Linux便开始支持高级路由技术,提供策略路由,流量控制等多项高级路由功能,配合Netfilter包过滤软件,可实现许多专业路由器和防火墙才能实现的高级功能。Linux内核的网络部分代码由最开始模仿Sun OS的网络系统,到2.2版本,重写了全部内核网络代码并推出了实现高级路由管理的软件包iproute2,目前,许多Linux商业版本都配置了该软件。iproute2提供了整套网络管理的工具,提供了从网络配置、流量控制、策略路由等全面的网络功能。iproute的开发者还建议用户不再使用传统的 ifconfig、route等基于System V的网络命令,因为这些工具无法使用Linux系统的高级网络功能。基于iproute2,我们可以很容易地实现接入的负载均衡。首先删除系统的默认网关。然后运行ip route命令:# ip route add default equalize nexthop via 1.0.0.1 dev eth1 nexthop via 1.0.0.1 dev eth2 nexthop via 3.0.0.1 dev eth3该命令实现了系统在三个接入IP之间随机进行选择,并送往不同的ISP。但当其中一条或多条线路失效时,系统会删除该路由,不会自动将失效线路用户转至有效线路,并且当线路失效重建时,无法恢复该路由。因此,这个解决方案不能满足我们的需求。宽带复用的实现Linux系统中有多种路由类型,如下表:静态路由在失效后即被内核删除,重新生效后仍无法重建。内核路由由内核维护,对失效路由并不删除,只是标记,待线路恢复正常时可重新使用该路由。Julian Anastasov为Linux内核写了一个补丁,实现了内核管理STATIC路由的功能,从而可以实现我们所需要的线路自适应功能。2.4.19版本内核的补丁,可在 http://www.linuxvirtualserver.org/~julian/...s-2.4.19-8.diff 下载。编译前需要打开内核以下选项(对2.4内核),当然,最好选择网络部分的除实验功能外的所有选项:Networking options→[*]   IP: advanced router[*]   IP: policy routing[*]   IP: equal cost multipathRoutes补丁修补了4个头文件和12个内核的C源代码,但只是对系统的部分代码进行修改,没有新添任何新的功能。当然,打完补丁后需要重新编译内核和各个模块。在修改内核后,就可以实现真正的自适应宽带复用。① NAT的实现#echo 1 > /proc/sys/net/ipv4/ip_forward#iptables -t nat -A POSTROUTING -o ppp* -s 192.168.0.0/24 -j MASQUERADE#iptables -t nat -A POSTROUTING -o eth3 -s 192.168.0.0/24 -j MASQUERADE首先需要打开系统的IP转发功能(ip_forward)以实现路由功能,同时对所有内网IP进行伪装,其中ppp*指系统所有DSL线路。对于动态分配IP的网卡,使用MASQUERADE关键字,而对于获得了固定共网IP的网络,可使用SNAT对源地址进行伪装。然后加载必要的NAT模块:#depmod -a#insmod ip_nat_ftp#insmod ip_conntrack_ftp#insmod ip_nat_irc#insmod ip_conntrack_irc② 主路由表的维护在我们的设置中,主路由表维护系统本地网络,默认的主路由表优先级是32766,处于路由表的最下端,需要将其优先级提高,防止访问本地网络使用外部网络接口:#ip rule add prio 10 table main③ 外网接入路由表的维护在主路由表之后是外网接入路由表,我们设置了101、102、103三个表,分别对应DSL线路1、DSL线路2、和数字电路1,目的是设置外网各自的默认路由,同时设置prohibit关键字使用户在线路无法使用时获取网络失效信息,从而刷新后可改用其他线路。如DSL线路1设置如下:#ip rule add prio 101 from 1.0.0.2/24 table 101#ip route add default via 1.0.0.1 dev eth0 proto static table 101#ip route append prohibit default table 101 metric 1 proto static④ 等值路由表的设定设置等值路由表200于用户路由表的末端,提供三个接入线路的随机分配。其中 proto static关键字是我们补丁所实现的功能。#ip rule add prio 200 table 200#ip route add default table 200 proto static \nexthop via 1.0.0.1 dev eth1 \nexthop via 1.0.0.1 dev eth2 \nexthop via 3.0.0.1 dev eth3⑤ 线路检测系统已经可以自动检测失效路由并自动调整路由表,但当线路恢复正常时还无法自动起用该线路,因此需要定期对所有外网线路进行检测,我们可以使用以下脚本发送ICMP包检测线路并且使用 cron定时(每分钟)执行。#!/bin/shping -c 1 1.0.0.1ping -c 1 3.0.0.1路由性能监测使用MRTG工具监测路由器带宽可以直观地看出网络高峰时的使用情况,如图2,在没有实现复用前,单个DSL线路(DSL线路1,带宽2M)是十分拥塞的:图2经过复用后,该线路(DSL线路1,带宽2M)的流量由三条宽带线路分担,明显缓解了带宽的压力(如图3):图3由于MRTG只能监控三条独立的线路,监测结果不是很直观,因此我们用PERL编写了一个MRTG扩展程序(virtual_line.pl),使之能够将三条2M线路逻辑累加为一条6M的虚拟线路,便于管理员的监测。基于NAT的流量监控事实上是对Iptables的FORWARD链进行计量,因此我们可以对每一条宽带线路进行监控,在Iptables中为每一条线路添加流入和流出计量(如对数字电路1):#iptables -N FORW-IN1#iptables -N FORW-OUT1#iptables -A FORWARD -i eth3 -j FORW-IN1#iptables -A FORWARD -o eth3 -j FORW-OUT1然后在MRTG中定时运行我们的virtual_line.pl,即可对三条线路逻辑累加虚拟线路进行监控。virtual_line.pl的源代码如下:#!/usr/bin/perl#==========初始化设置============$iptables =“/sbin/iptables”;$uptime =“/usr/bin/uptime”;$host =“server.gic.ac.cn”;#对三条线路进行流入和流出流量统计@chain_in=(“FORW-IN1”,“FORW-IN2”,“FORW-IN3”);foreach (@chain_in) {$_=‘$iptables -nvxL | grep $_ | grep -v Chain’;s/^\s+\d+\s+(\d+).*$/$1\n/s;$in=$in+$_;}print“$in\n”;@chain_out=(“FORW-OUT1”,“FORW-OUT2”,“FORW-OUT3”);foreach (@chain_out) {$_=‘$iptables -nvxL | grep $_ | grep -v Chain’;s/^\s+\d+\s+(\d+).*$/$1\n/s;$out=$out+$_;}print“$out\n”;#显示系统时间与主机名($uptime = ‘$uptime’) =~ s/^.*up (.*,[\d: ]+),.*$/$1/s;print “$uptime$host\n”;#============ end ==============由虚拟线路的监测图可以看出,网络总体对带宽的最大需求为3M,我们的总带宽有6M,所以该复用线路完全可以满足要求。图4方案讨论通过以上讨论,最终切实可行的宽带复用方案如下:1.首先对Linux内核升级,使内核能够对STATIC路由表进行管理;2.设置NAT和加载必要的模块;3.提高主路由表的优先级,并建立外网接入路由表;4.建立等值路由表;5.设置定时检测线路;6.使用MRTG对线路进行监测。由于复用技术基于IP随机分配算法,在一个缓存期内,对任何内网的访问需求,内核根据其目的IP地址随机分配一个外网IP,因此对某些网站的高强度访问会带来线路的部分不均衡,实际的使用过程中,不平衡值会高达15%以上。我们可以通过设置透明代理,使用SQUID代理服务器来平衡线路负载,可使多条线路的流量更加均衡。理论上,可复用无限多条宽带线路,上限仅与Linux主机的PCI插槽数量有关。由于Linux系统良好的稳定性和路由功能的日益完善,并且随着计算机硬件的价格下降,基于Linux系统的路由应用越来越广泛。在中国科技网广州节点,近十台Linux路由器与其他Cisco路由器一起,承担着繁重的路由交换和高层网关工作,几年的良好运行,证明了Linux系统良好的稳定性和出色的网络性能。

luannan 发表于 2004-10-17 11:54:29

怎么改为内网的????

DreamCat 发表于 2004-10-17 12:08:52

能否通过计算路由以及响应速度的方式对具体应用调整路由?
页: [1]
查看完整版本: Linux路由器的宽带复用 (转)