看了这么多天的关于流量控制的资料后,现在大脑里还是很乱,理不清晰,只好将目前所能够理理的暂时总结一下。
在Linux系统中,有一个非常重要的路由的包文件-----iproute,其中包含了两个最重要的工具ip和tc。
iproute的程序站点为: http://www.linuxfoundation.org/en/Net:Iproute2
iproute的文档站点为: http://lartc.org/
ip命令主要用于配置接口,ARP,tunnel(隧道)以及策略路由等等。
tc命令主要用于配置流量控制和策略管理,两者可以单独使用,也可以相互结合使用
二、ip命令的使用
root@router :~# ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
where OBJECT := { link | addr | route | rule | neigh | tunnel |
maddr | mroute | monitor | xfrm }
OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] |
-f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }

 
ip link 命令主要用于显示网络配置信息,ip link set 主要用于配置网络信息。
例:显示当前接口配置信息。
route@linux#  ip  link  list
 
ip addr 命令用于配置IP地址信息,其能够使用ip addr add为网络设备添加主或从IP地址,ip addr show用于显示每个网络设备的IP地址,ip addr del用于删除接口的IP地址,可以通过不同的命令清空相关的IP地址信息,例如:ip addr flush dynamic可以删除所有通过动态路由协议加入至linux内核中的路由条目。
例:显示IP地址信息。
route@linux# ip  address  show
 
ip neighbor用于管理neighbor/arp表,下列的一些命令将会被用到:add, change, replace, delete, and flush。
例:显示ARP缓存信息以及删除ARP缓存信息。
route@linux# ip neigh  show
route@linux# ip neigh  delete  10.10.10.1  dev eth0
 
ip tunnel命令用于管理隧道连接,隧道协议有gre,ipip,sit等,在后面的章节中将会介绍如何建立IP 隧道的实例。
 
ip route命令是一个非常重要并最常使用的命令,它几乎可以在内核路由表上执行任何操作,主要的命令有:add, change, replace, delete, show, flush, and get routes
例:显示IP路由表。
route@linux# ip  route show
 
ip monitor:监控路由, rtmon:监控地址, rtacct:实时监控网络设备。
 
关于IP命令的详细使用请参考: http://www.policyrouting.org/iproute2.doc.html#ss9.1.1
 
此外,在iproute2中最重要的功能就是通过ip rule和ip route来实现linux的策略路由功能。
 
三、策略路由的实现
在实现策略路由的内核上必须支持IP: advanced router"  和 "IP: policy routing"  两项
 
实现方法:在Linux中可以设置多张路由表,并为不同的表设置不同的出口(即网关),当内核在实现路由选择时,可以让其平均的通过几张路由表将数据发送出去或者将不同的数据通过不同的路由表发送出去。
 
默认情况下,Linux内核自带了三张路由表,可以通过 route@linux# ip rule list进行查看,三张表分另为local对就编号为0,main对应编号为32766,default对应编号为32766,用户在正常创建创建条目时如果没有指定加入哪一个表时,数据通通加入至main表,所以当用户使用route  -n看到的信息全部来自于main表中。
例:显示当前内核的路由表。
kuznet@amber~ $ ip rule list
0 from all lookup local
32766 from all lookup main
32767 from all lookup default
 
用户可以通过 ip route list table 表名 的方法来查看表中的具体路由条目,如下所示:
router@linux#  ip route list table main
................................................
 
/etc/iproute2/rt_tables 文件用于保存表名和编号的对应关系。这里需要添加T1和T2两个表,编号为200和300,具体操作如下:
echo 200 T1 >> /etc/iproute2/rt_tables
echo 300 T2 >> /etc/iproute2/rt_tables  
 
接下来,使用ip rule add命令来创建具体的表,并可以在表中添加源地址或目标地址等参数。如下实例,创建表T1和T2。
例:route@linux# ip rule add from 1.1.1.1 table T1
       route@linux# ip rule add from 192.203.80.0/24 table T1
       route@linux# ip rule add to 192.203.80.0/24 table T2
       route@linux# ip rule add  table T2
上述内容表示这些源地址/目的地址/所有地址将应用于T1/T2表中的路由规则。
 
在使用ip rule add创建表时,可以指定的参数有:type TYPE (default),from PREFIX,to PREFIX,iif NAME,tos TOS or dsfield TOS,fwmark MARK,priority PREFERENCE,table TABLEID,realms FROM/TO,nat ADDRESS。
 
 
最后,创建具体的路由条目至指定的表中(默认为main表),如下所示:
route@linux# ip route add default via 192.168.0.1 dev eth0 table T1
route@linux # ip route add default via 192.168.1.1 dev eth1 table T2
 
 
四、策略路由配置实例
 
实验拓扑如下:
  linux 高级路由及流量控制总结_第1张图片
1、创建两个表,分别为dianxin,wangtong,编辑为300和400.
route@linux #echo  300  dianxin  >>/etc/iproute/rt_tables
route@linux # echo  400  wangtong  >>/etc/iproute/rt_tables
route@linux #ip rule add from $IP1 table dianxing
route@linux #ip rule add from $IP2 table wangtong
 
2、添加相关路由至两个表中。
 
3、实现负载均衡。
 
策略路由总结:
1、添加路由表,编号至系统中。
2、添加具体的路由条目并指向用户自定义的路由表中(如默认路由)。
3、添加具体的规则至路由表中,如什么样的源地址以及对应的优先级。
4、在路由表中通过nexthop参数实现负载均衡,或者可以为数据打mask,然后设置标记1的数据从哪个表走,标记2的数据从哪个表。
 
Linux下网通、电信、教育多出口策略路由配置详解
一、处理流量分割的问题;二、解决双线负载均衡的问题。原文如下:
1 、流量分割
首先是如何保证:回应来自某一个 ISP 的数据包时,仍然使用相同的 ISP
让我们先定义一些符号。令第一块网卡的名字叫 eth1 ,而第二块网卡叫做 eth2 ;然后设置网卡 1 IP 地址为 221.200.0.2 CNC 分配网址),网卡 2 IP 地址为 58.56.0.2 CTC 分配网址); ISP1 (联通)网关地址为 221.200.0.1 ISP2 (电信)网关地址为 58.56.0.1 ;最后, ISP1 (联通)的网络地址为 211.200.0.0/30 ISP2 (电信)的网络地址为 58.56.0.0/30
额外创建两个路由表, T1 T2 ,加入到 /etc//iproute2/rt_tables 中。然后如下设置两个路由表中的路由:
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table T1
ip route add default via 221.200.0.1 table T1
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table T2
ip route add default via 58.56.0.1 table T2
没什么大不了的,不过是建立了通向该网关的一台路由,并使之成为默认网关,分别负责一个单独的上行流,并且为这两个 ISP 都作这样的配置。要指出的是,那条网络路由是必要条件,因为它能让我们找到那个子网内的主机,也包括上述的那台网关。
下一步,我们设置“ main ”路由表,把包通过网卡直接路由到与网卡相连的局域网上不失为一个好办法。要注意“ src ”参数,他们能够保证选择正确的出口 IP 地址。
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table main
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table main
然后,设置你的缺省路由:
ip route add default via 221.200.0.1
接着,设置路由规则。这实际上在选择用什么路由表进行路由。你需要确认当你从一个给定接口路由出数据包时,是否已经有了相应的源地址:你需要保证的就是如果你已经有了相应的源地址,就应该把数据包从相应的网卡路由出去:
ip rule add from 221.200.0.2 table T1
ip rule add from 58.56.0.2 table T2
以上命令保证了所有的回应数据都会从他们来的那块网卡原路返回。
现在,完成了非常基本的配置。这将对于所有运行在路由器上的所有进程起作用,实现 IP 伪装后,对本地局域网也将起作用。如果不进行伪装,那么你要么拥有两个 ISP 的地址空间,要么你想对两个 ISP 中的一个进行伪装。无论哪种情况,你都要添加规则,基于发包的主机在局域网内的 IP 地址,选择从哪个 ISP 路由出去。
2 、负载均衡
第二个问题就是如何对通过两个 ISP 流出的数据进行负责均衡。如果你已经成功地实现了流量分割。这件事不难。
与选择两个 ISP 中的一个作为缺省路由不同,这次是设置缺省路由为多线路路由。在缺省内核中,这会均衡两个 ISP 的路由。像下面这样做(基于前面的流量分割实验):
ip route add default scope global nexthop via 221.200.0.1 dev eth1 weight 30 \
nexthop via 58.56.0.1 dev eth2 weight 70 (注意:与上面为同一行命令)
这样可以均衡两个 ISP 的路由。通过调整“ weight ”参数我们可以指定其中的一个 ISP 的优先权高于另一个。(具体:线路 1 的流量约占 30 %,线路 1 70 %)
应该指出,由于均衡是基于路由进行的,而路由是经过缓冲的,所以这样的均衡并不是 100 %精确。也就是说,对于一个经常访问的站点,总是会使用同一个 ISP
中国的现状这样设置是有缺陷的:因为网通和电信等的线路在沟通上存在问题,就是说从网通线路访问电信的网址不如直接从电信访问快,从电信访问网通也是如此。因此对于拥有不同种线路的路由器我们需要做基于目标地址的策略路由,同种线路的可以做上面的策略路由。如果你拥有多个 ISP 且某个 ISP 有多条线路,则可以把负载均衡与基于目标的策略路由结合起来。
做这样的策略路由来自于《 QEL4.1 网吧版》,其相关说明部分如下:
QEL4.1 版本开始,我们增加了多线路策略路由的功能。用户只需要简单地填写几个配置文件即可完成。
策略路由功能由qlcm 程序实现。这个程序在QEL4.0 上为1.0,包含了内核智能优化、抗DDOSSYN 洪水***等功能。在4.1 版上,qlcm 版本为2.0,增加了arp 绑定,多线路策略路由功能。
qlcm 服务是QEL 服务器的核心服务,您可以restart qlcm 服务,但在任何情况下您都不应该停止它。关闭它会造成无法预料的后果,比如出现大量丢包,某些服务停止等。这样的故障不在我们技术支持的范围内。
qlcm 2.0 支持最大8 路外网线路,根据用户定义的配置文件自动判断工作模式,可以为每个外网出口单独定义路由表,也可以实现实现多条线路的负载均衡(即多链路带宽捆绑)。一般的硬件路由器只能支持23路外网线路,而且价格不菲。硬件路由器使用嵌入式CPU 和少量内存,处理性能有限,在处理过多路由时会超出处理能力。而使用PC 做路由则不受此限制。
QEL4.1 内核最大可以支持到255 路外线,我们随时可以修改qlcm,支持32 路或者更多的外线。
我们再来看一个具体例子的实现:
3 .我们有三条固定IP 线路,一条是eth0(电信),网关为202.102.14.1,一条eth1(网通),网关为60.12.5.1,一条是教育网线路,网关为125.216.44.1,将etho(电信线路)作为默认网关,访问网通的数据走eth1,访问教育网的走eth2
配置如下:
wan1.conf:
interface=eth0
gateway=202.102.14.1
defaultgw=yes
wan2.conf:
interface=eth1
gateway= 60.12.5.1
routefile=/etc/quick/IP_CNC.list
wan3.conf:
interface=eth2
gateway=125.216.44.1
routefile=/etc/quick/IP_EDU.list
这样就OK 了。新建一个IP_EDU.list 文本文件,其中定义了教育网的IP 段。
在这样的环境下,defaultgw=yes 只设定在某个网卡接口上。当访问已定义的路由时,走指定的网卡出去,否则走默认网关。
routefile= 后面填该线路对应的路由表文件。在安装时我们已经为您默认安装了两个文件:IP_CNC.list IP_CTC.list,这两个文件都在/etc/quick 目录下,其中IP_CNC.list 文件是网通路由表文件,IP_CTC.list 为电信路由表文件。
这两个文件的格式也很简单,每行一个IP 段,示例如下:
58.16.0.0/16
58.17.0.0/17
58.17.128.0/17
qlcm 只能运行在《 QEL4.1 网吧版》上,如果移植到其它 Linux 下会因为版本的不同而造成系统的崩溃。在不想更换系统的前提下,我们可以自己用 IP 命令来实现 qlcm 的功能模拟。
我们仍然以文章开始的实例来进行说明基于目的的策略路由设置。
1 、首先建立通向不同 ISP 的路由表
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table 50
ip route add default via 221.200.0.1 table 50
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table 51
ip route add default via 58.56.0.1 table 51
没什么可说的,与前面相同,只是仅用数字表示路由表。
2 、针对我们要访问的目标地址,选择不同的路由表,进行路由
因为有大量的网络地址需要设置不同的规则,采用命令模式不便于修改,所以做了一个简单的脚本文件,配置文件与 qlcm 采用相同的结构。
 
关于策略路由的详细使用,可以参考书籍: Policy Routing Using Linux