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 版本开始,我们增加了多线路策略路由的功能。用户只需要简单地填写几个配置文件即可完成。
策略路由功能由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采用相同的结构。
由于电信和网通之间互联互通的问题,很多人选择双线路机房,所谓双线路机房就是拥有两条出口,一条电信一条网通。最近在一个双线路机房测试一台服务器,打 算作为论坛的数据库服务器使用,服务器操作系统为Linux。计划配置为双IP,双域名,使得浏览者通过电信和网通两条线路都能正常访问服务器,而且各走 各的,互不影响。在配置网络的时候遇到了问题,由于Linux默认只有一个网关,在网络上查询了很久,找到一个解决方案,因此整理了一下。感谢原文作者 jac003ke。
1. vi /etc/iproute2/rt_tables,增加网通和电信两个路由表
251 tel 电信路由表
252 cnc 网通路由表
2. 给网卡绑定两个地址用于电信和网通两个线路
ip addr add 117.22.255.30/29 dev eth0
ip addr add 210.74.133.77/29 dev eth1
3、分别设置电信和网通的路由表
电信路由表:
#确保找到本地子网
ip route add 117.22.255.24/29 via 117.22.255.30 dev eth0 table tel
#内部回环网络
ip route add 127.0.0.0/8 dev lo table tel
#117.22.255.73为电信网络默认网关地址
ip route add default via 117.22.255.73 dev eth0 table tel
网通线路路由表:
#确保找到本地子网
ip route add 210.74.133.72/29 via 210.74.133.77 dev eth1 table cnc
#内部回环网络
ip route add 127.0.0.0/8 dev lo table cnc
#210.74.133.73是网通的默认网关
ip route add default via 210.74.133.73 dev eth1 table cnc
4、电信和网通各有自己的路由表,制定策略,让117.22.255.30的回应数据包走电信的路由表路由,210.74.133.77的回应数据包走网通的路由表路由
ip rule add from 117.22.255.25table tel
ip rule add from 210.74.133.73 table cnc
假设有两个网卡,eth0 eth1,分别用两个ISP的地址IPA,IPB,分别有自己的网关GWA,GWB。
现在,加上了静态路由,那么该主机访问外网的时候,就会按照设定的路由,分别走不同的网络接口,同时也会分别使用各自网络接口的IP地址作为源IP。
而现在当有外网访问该主机的时候,比如是从教育网来的主机,访问电信的IP,那么按照路由表,回应的数据包就会从教育网的接口出去,但是其源IP为电信的 IP,如果这一路上没有地址转换,没有路由限制(即所经过的路由器只是负责按照指定的目的IP转发数据包,不做任何访问控制),那么访回应的数据包仍然是 可以正常到达对方的主机的。但是现在的网络环境太复杂了,一个数据包能够不经过任何干扰就到达对方的主机几乎是不可能的。
因此就需要做一些策略路由,使得访问哪个接口的时候,回应的数据包仍然从这个接口出去。
ip route add default via GWA dev eth0 src IPA table 100
ip route add default via GWB dev eth1 src IPB table 200
ip rule add from IPA table 100
ip rule add from IPB table 200
文章出处 http://www.dirtysea.com/viewthread.php?tid=809
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,包含了内核智能优化、抗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采用相同的结构。
由于电信和网通之间互联互通的问题,很多人选择双线路机房,所谓双线路机房就是拥有两条出口,一条电信一条网通。最近在一个双线路机房测试一台服务器,打 算作为论坛的数据库服务器使用,服务器操作系统为Linux。计划配置为双IP,双域名,使得浏览者通过电信和网通两条线路都能正常访问服务器,而且各走 各的,互不影响。在配置网络的时候遇到了问题,由于Linux默认只有一个网关,在网络上查询了很久,找到一个解决方案,因此整理了一下。感谢原文作者 jac003ke。
1. vi /etc/iproute2/rt_tables,增加网通和电信两个路由表
251 tel 电信路由表
252 cnc 网通路由表
2. 给网卡绑定两个地址用于电信和网通两个线路
ip addr add 117.22.255.30/29 dev eth0
ip addr add 210.74.133.77/29 dev eth1
3、分别设置电信和网通的路由表
电信路由表:
#确保找到本地子网
ip route add 117.22.255.24/29 via 117.22.255.30 dev eth0 table tel
#内部回环网络
ip route add 127.0.0.0/8 dev lo table tel
#117.22.255.73为电信网络默认网关地址
ip route add default via 117.22.255.73 dev eth0 table tel
网通线路路由表:
#确保找到本地子网
ip route add 210.74.133.72/29 via 210.74.133.77 dev eth1 table cnc
#内部回环网络
ip route add 127.0.0.0/8 dev lo table cnc
#210.74.133.73是网通的默认网关
ip route add default via 210.74.133.73 dev eth1 table cnc
4、电信和网通各有自己的路由表,制定策略,让117.22.255.30的回应数据包走电信的路由表路由,210.74.133.77的回应数据包走网通的路由表路由
ip rule add from 117.22.255.25table tel
ip rule add from 210.74.133.73 table cnc
假设有两个网卡,eth0 eth1,分别用两个ISP的地址IPA,IPB,分别有自己的网关GWA,GWB。
现在,加上了静态路由,那么该主机访问外网的时候,就会按照设定的路由,分别走不同的网络接口,同时也会分别使用各自网络接口的IP地址作为源IP。
而现在当有外网访问该主机的时候,比如是从教育网来的主机,访问电信的IP,那么按照路由表,回应的数据包就会从教育网的接口出去,但是其源IP为电信的 IP,如果这一路上没有地址转换,没有路由限制(即所经过的路由器只是负责按照指定的目的IP转发数据包,不做任何访问控制),那么访回应的数据包仍然是 可以正常到达对方的主机的。但是现在的网络环境太复杂了,一个数据包能够不经过任何干扰就到达对方的主机几乎是不可能的。
因此就需要做一些策略路由,使得访问哪个接口的时候,回应的数据包仍然从这个接口出去。
ip route add default via GWA dev eth0 src IPA table 100
ip route add default via GWB dev eth1 src IPB table 200
ip rule add from IPA table 100
ip rule add from IPB table 200
文章出处 http://www.dirtysea.com/viewthread.php?tid=809