目的:实现多线路由,本文用联通、电信和教育网三网分三线路由,不做NAT
实现限制:
1、本人没有实际的多线线路,所以提供的路由IP都是私有IP,实际用的时候要换成自己的IP。三网的IP段也仅提供了几个在网上搜索到的IP段,实际用的时候要数千条。
2、外网网关不能是同一个网段,否则会出现只走系统默认路由的情况。
实现原理:
FreeBSD7.1以后,都支持setfib,这是多路由的前提条件。每个fib号都可以有独立的路由表,包括默认网关。最关键的是,每个fib都可以有自己的默认网关。
有了多路由还不能完成多线路由,实现多线路由还需要把网络流量区分出来,到电信的发到电信的fib,到联通的发到联通的fib,完成这个任务的就是防火墙了,当然也是本文的主角之一:ipfw。
其实setfib还有另外一个用处,就是可以做流量均衡。
步骤:
1、启用setfib,默认不启用。可以用下列两种方法之一:
1)在内核配置文件中设置下面的变量,并重新编译内核:
options ROUTETABLES=N
2)在loader.conf中添加:
net.fibs="N"
注意N的取值,在FreeBSD10以前的版本,N的取值为0-15,最多有16个fib,10.0以后的版本,可以有65536个fib。目前网上的资料很多都说最多取16,是指的老版本。
2、设置不同的fib:
联通线路网关:192.168.0.1,对应fib为0
电信线路网关:192.168.1.1,对应fib为1
教育线路网关:192.168.2.1,对应fib为2
1)联通默认fib,也就是0,不需要加setfib命令:
# route add default 192.168.0.1
2)电信线路:
# setfib 1 route add default 192.168.1.1
2)教育线路:
# setfib 2 route add default 192.168.2.1
3、设置ipfw:
ipfw其实比较简单,一句话足矣:
ipfw add setfib tablearg ip from any to “table(1)”
注意几点:
1)tablearg为table的特有参数,下面将使用到
2)table是ipfw的一个功能模块,数千、上万个条目也能快速的处理掉,查询效率非常高。
3)setfib子命令不会中断ipfw的匹配,会继续在ipfw规则集中进行匹配,一般是继续下一条规则,所以可以后续进行NAT,fwd等动作。
4、设置table 1的条目
设置一下,你会发现即使五线六线的,也不是太麻烦,比其他的解决方案要简单多了。
1)设置联通IP条目,注意最后面的0代表fib号为0:
ipfw table 2 add 202.101.128.0/18 0
ipfw table 2 add 202.102.128.0/21 0
ipfw table 2 add 202.102.136.0/21 0
ipfw table 2 add 202.102.144.0/20 0
2)设置电信IP条目,fib号为1:
ipfw table 1 add 203.145.0.0/19 1
ipfw table 1 add 203.148.80.0/22 1
ipfw table 1 add 203.148.86.0/23 1
ipfw table 1 add 203.149.92.0/22 1
ipfw table 1 add 203.152.128.0/19 1
3)设置教育网IP条目,fib号为2:
ipfw table 1 add 59.64.0.0/14 2
ipfw table 1 add 59.68.0.0/14 2
ipfw table 1 add 59.72.0.0/15 2
ipfw table 1 add 59.77.0.0/16 2
5、测试注意事项
测试机要用另一台机器来发起测试,如果用本机测试的话,还会走fib 0,也就是默认的路由,我因为这个问题而折腾了大半夜。
比如在本机上发起ping的测试,icmp包只会走fib 0,而不走在fib 1 或其它的fib。
不知道这是不是一个bug,还没测试过FreeBSD10.1,起码在FreeBSD10.0以前的版本中都存在这个问题,某个国外的网页上也见到这方面的报告。
另外还需要注意测试的外网IP不能在同一个网段,比如fib 0 对应192.168.0.1;fib 1 对应192.168.0.2,这种IP设置会仍然走fib 0 ,不会有数据包走fib 1。