源IP路由
缺省情况下,TCP/IP数据包是通过检测目的IP地址,然后在路由表中查找一个到达目的地的路径。路由表可以通过netstat –r command命令来查看。如果发现了一个路径,数据包就会被送到网卡,否则,数据包就会被送到缺省的网关。对于大多数直接连入Internet的主机来说,缺省网关一般是某一个ISP。在本例中,这就意味着所有向外的Internet连接都通过DSL接口。这不是一个冗余Internet连接所希望发生的。很显然,当你在系统中加入一个线缆Modem后,你并不希望由DSL连接来响应你的线缆Modem连接。
要解决这个问题,我们使用ip命令建立一个多路由表。而路由表的选择是基于流出数据包的IP地址的。这可以通过以下的命令来实现:
# Setup source IP routing rules for DSL
ip rule add from 63.89.102.157 lookup 1
ip route add 10.0.0.0/24 via 10.0.0.1 table 1
ip route add 0/0 via 63.89.102.1 table 1
# Setup source IP routing rules for cable modem
ip rule add from 65.3.17.133 lookup 2
ip route add 10.0.0.0/24 via 10.0.0.1 table 2
ip route add 0/0 via 65.3.17.1 table 2 |
如果一个流出的数据包的源IP地址为63.89.102.157 (DSL),那么就在路由表1中选择,它有两条路径:
> ip route list table 1
10.0.0.0/24 via 10.0.0.1 dev eth0
default via 63.89.102.1 dev eth1 |
第一行把本地数据流路由到内部网,第二行则捕获所有剩下的数据包并通过DSL接口将其送到ISP。线缆Modem的路由表2使用的也是同样的方法。
负载平衡
在内部网中实现流出负载平衡,使用的是CONFIG_IP_ROUTE_MULTIPATH内核选项,它可以让系统有多个默认的网关。可以使用以下命令从/etc/sysconfig/network文件中删除默认网关,然后再使用高级路由功能设置缺省网关:
# ip route add default equalize
nexthop via 63.89.102.1 dev eth1
nexthop via 65.3.17.1 dev eth2 |
要查看高级路由表,使用以下命令:
> ip route list
255.255.255.255 dev eth0 scope link
255.255.255.255 dev eth2 scope link
255.255.255.255 dev eth1 scope link
10.0.0.1 dev eth0 scope link
63.89.102.157 dev eth1 scope link
65.3.17.133 dev eth2 scope link
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
63.89.102.0/24 dev eth1 proto kernel scope link src 63.89.102.157
65.3.17.0/24 dev eth2 proto kernel scope link src 65.3.17.133
127.0.0.0/8 dev lo scope link
default equalize
nexthop via 63.89.102.1 dev eth1 weight 1
nexthop via 65.3.17.1 dev eth2 weight 1 |