我们用一台ubuntu 7.10服务器为企业客户提供语音服务,由于语音占用带宽较多,有客户打算从一根adsl扩到两根adsl。
首先规划网络,两个路由器带两个子网,比如192.168.1.0/24,192.168.3.0/24,路由器分别是192.168.1.1,192.168.3.1,把两个子网接到同一个switch上。
然后修改IP,原来eth0 = 192.168.1.160,现在加上一个 eth0:1 = 192.168.3.160。
root@dailu-ubuntu:~# vi /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.160
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
auto eth0:0
iface eth0:0 inet static
address 192.168.3.160
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255
gateway 192.168.3.81
程序本身也是很好改的,原来bind socket的时候,ip_addr = 0,让系统自己去填IP,反正也只有一个IP,没什么好选的。现在指定bind 192.168.1.160或192.168.3.160。
配好了一运行,才发现大谬不然,不管是以哪个为source IP,包都发到192.168.1.1去了。
分析下来,我们是受到以前多网卡多IP思路的影响了。以前是两块网卡,各配一个IP,各接一个路由器,两个子网互相不通,这样只要指定IP,就指定了网卡,就必然会通过对应的路由器出去了。
但现在我们只有一块网卡,就无法通过硬件来选择,只有配置路由了。
费了好大的力气,终于配成 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1,192.168.3.0 netmask 255.255.255.0 gw 192.168.3.1,结果发现仍然是所有的包都从192.168.1.1出去。
man route一看,哑然失笑,route表是以destination IP为依据作路由的,我的destination IP是外网IP,既不是.1网段也不是.2网段,它自然要用default gw,也就是.1.1了。
于是又上网一查,终于查到了ip route 和 ip rule,最后配置如下:
修改/etc/iproute2/rt_tables,加入自己的路由表:
251 subnet3
设置路由表subnet3:使用192.168.3.1作为gateway。
ip route add default via 192.168.3.1 table subnet3 proto static
设置ip rule,凡是192.168.3.0/24网段发出的包,都使用路由表subnet3。
ip rule add from 192.168.3.0/24 pref 15001 table subnet3
配置后:
root@dailu-ubuntu:~# ip rule
0: from all lookup local
15001: from 192.168.3.0/24 lookup subnet3
32766: from all lookup main
32767: from all lookup default
该rule优先级为15001,必须排在main和default这两条rule之前。
再试验,两个IP就大路朝天,各走一边了。
以上是自己摸出来的配置办法,请高手指正。