linux 高级路由及流量控制总结

本文详细介绍Linux下的策略路由配置方法,包括使用ip命令管理网络配置、实现策略路由功能、配置多出口策略路由等。通过实例演示如何实现流量分割与负载均衡。

linux 高级路由及流量控制总结


2009-02-28 22:40:27
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
看了这么多天的关于流量控制的资料后,现在大脑里还是很乱,理不清晰,只好将目前所能够理理的暂时总结一下。
在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
 
 
四、策略路由配置实例
 
实验拓扑如下:
  http://rhcss.blog.51cto.com
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 ;然后设置网卡 1IP 地址为 221.200.0.2CNC 分配网址),网卡 2 IP 地址为 58.56.0.2CTC 分配网址); ISP1 (联通)网关地址为 221.200.0.1ISP2 (电信)网关地址为 58.56.0.1 ;最后, ISP1 (联通)的网络地址为 211.200.0.0/30ISP2 (电信)的网络地址为 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 %,线路 170 %)
应该指出,由于均衡是基于路由进行的,而路由是经过缓冲的,所以这样的均衡并不是 100 %精确。也就是说,对于一个经常访问的站点,总是会使用同一个 ISP
中国的现状这样设置是有缺陷的:因为网通和电信等的线路在沟通上存在问题,就是说从网通线路访问电信的网址不如直接从电信访问快,从电信访问网通也是如此。因此对于拥有不同种线路的路由器我们需要做基于目标地址的策略路由,同种线路的可以做上面的策略路由。如果你拥有多个 ISP 且某个 ISP 有多条线路,则可以把负载均衡与基于目标的策略路由结合起来。
做这样的策略路由来自于《 QEL4.1 网吧版》,其相关说明部分如下:
从QEL4.1 版本开始,我们增加了多线路策略路由的功能。用户只需要简单地填写几个配置文件即可完成。
策略路由功能由qlcm 程序实现。这个程序在QEL4.0 上为1.0,包含了内核智能优化、抗DDOS、SYN 洪水攻击等功能。在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
目录 第1章 贡献 1 第2章 简介 2 2.1. 除外责任与许可 2 2.2. 预备知识 2 2.3. LINUX能为你做什么 3 2.4. 内务声明 3 2.5. 访问,CVS和提交更新 4 2.6. 邮件列表 4 2.7. 本文档的布局 4 第3章 介绍 IPROUTE2 6 3.1 为什么使用 IPROUTE2 6 3.2 IPROUTE2 概览 6 3.3 先决条件 6 3.4 浏览你的当前配置 7 3.4.1. 让ip显示我们的链路 7 3.4.2. 让ip显示我们的 IP 地址 7 3.4.3. 让ip显示路由 8 3.5. ARP 9 第4章 规则——路由策略数据库 11 4.1. 简单的源策略路由 11 4.2. 多重上连ISP的路由 12 4.2.1. 量分割 13 4.2.2. 负载均衡 14 第5章 GRE 和其他隧道 15 5.1. 关于隧道的几点注释 15 5.2. IP-IN-IP 隧道 15 5.3. GRE 隧道 16 4 5.3.1. IPv4隧道 16 5.3.2. IPv6隧道 18 5.4. 用户级隧道 18 第6章 用CISCO和6BONE实现IPV6隧道 19 6.1. IPV6隧道 19 第7章 IPSEC:INTERNET上安全的IP 22 7.1. 从手动密钥管理开始 22 7.2. 自动密钥管理 25 7.2.1. 理论 26 7.2.2. 举例 26 7.2.3. 使用X.509证书进行自动密钥管理 29 7.3. IPSEC隧道 32 7.4. 其它IPSEC软件 33 7.5. IPSEC与其它系统的互操作 33 7.5.1. Windows 33 第8章 多播路由 34 第9章 带宽管理的队列规定 36 9.1. 解释队列和队列规定 36 9.2. 简单的无类队列规定 37 9.2.1. pfifo_fast 37 9.2.2. 令牌桶过滤器(TBF) 39 9.2.3. 随机公平队列(SFQ) 41 9.3. 关于什么时候用哪种队列的建议 42 9.4. 术语 43 9.5. 分类的队列规定 45 9.5.1. 分类的队列规定及其类中的数据向 45 9.5.2. 队列规定家族:根,句柄,兄弟和父辈 45 9.5.3. PRIO队列规定 46 9.5.4. 著名的CBQ队列规定 48 9.5.5. HTB(Hierarchical Token Bucket, 分层的令牌桶) 54 5 9.6. 使用过滤器对数据包进行分类 55 9.6.1. 过滤器的一些简单范例 56 9.6.2. 常用到的过滤命令一览 57 9.7. IMQ(INTERMEDIATE QUEUEING DEVICE,中介队列设备) 58 9.7.1. 配置范例 58 第10章 多网卡的负载均衡 60 10.1. 告诫 61 10.2. 其它可能性 61 第11章 NETFILTER和IPROUTE——给数据包作标记 62 第12章 对包进行分类的高级过滤器 64 12.1. U32分类器 65 12.1.1. U32选择器 65 12.1.2. 普通选择器 66 12.1.3. 特殊选择器 67 12.2. 路由分类器 67 12.3. 管制分类器 68 12.3.1. 管制的方式 68 12.3.2. 越限动作 69 12.3.3. 范例 70 12.4. 当过滤器很多时如何使用散列表 70 第13章 内核网络参数 72 13.1. 反向路径过滤 72 13.2. 深层设置 73 13.2.1. ipv4一般设置 73 13.2.2. 网卡的分别设置 78 13.2.3. 邻居策略 79 13.2.4. 路由设置 80 第14章 不经常使用的高级队列规定 82 14.1. BFIFO/PFIFO 82 14.1.1. 参数与使用 82 6 14.2. CLARK-SHENKER-ZHANG算法 (CSZ) 82 14.3. DSMARK 83 14.3.1. 介绍 83 14.3.2. Dsmark与什么相关? 83 14.3.3. Differentiated Services指导 84 14.3.4. 使用Dsmark 84 14.3.5. SCH_DSMARK如何工作 84 14.3.6. TC_INDEX过滤器 85 14.4. 入口队列规定 87 14.4.1. 参数与使用 87 14.5. RED(RANDOM EARLY DETECTION,随机提前检测) 87 14.6. GRED(GENERIC RANDOM EARLY DETECTION,一般的随机提前检测) 88 14.7. VC/ATM模拟 89 14.8. WRR(WEIGHTED ROUND ROBIN,加权轮转) 89 第15章 方便菜谱 90 15.1. 用不同的SLA运行多个网站. 90 15.2. 防护SYN洪水攻击 90 15.3. 为防止DDOS而对ICMP限速 91 15.4. 为交互量设置优先权 92 15.5. 使用NETFILTER,IPROUTE2和SQUID实现WEB透明代理 93 15.5.1. 实现之后的数据图 96 15.6. 与PMTU发现有关的"基于路由的MTU设置" 96 15.6.1. 解决方案 97 15.7. 与PMTU发现有关的MSS箝位(给ADSL,CABLE,PPPOE和PPTP用户) 98 15.8. 终极的流量控制:低延迟,高速上/下载 98 15.8.1. 为什么缺省设置不让人满意 99 15.8.2. 实际的脚本(CBQ) 100 15.8.3. 实际的脚本(HTB) 102 15.9. 为单个主机或子网限速 103 15.10. 一个完全NAT和QOS的范例 104 7 15.10.1. 开始优化那不多的带宽 104 15.10.2. 对数据包分类 106 15.10.3. 改进设置 107 15.10.4. 让上面的设置开机时自动执行 108 第16章 构建网桥以及用ARP代理构建伪网桥 109 16.1. 桥接与IPTABLES的关系 109 16.2. 桥接与量整形 109 16.3. 用ARP代理实现伪网桥 109 16.3.1. ARP和ARP代理 110 16.3.2. 实现 110 第17章 动态路由——OSPF和BGP 112 17.1. 用ZEBRA设置OSPF 112 17.1.1. 必要条件 113 17.1.2. 配置Zebra 113 17.1.3. 运行Zebra 115 第18章 其它可能性 117 第19章 进一步学习 119 第20章 鸣谢 120
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值