|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 mching 于 2010-9-13 14:25 编辑
本文转自mching08的空间http://mching08.com,作者michael。
原文链接http://mching08.com/routeros/201009196.html
前言:当你手里面有多条ADSL的时候,你会如何去利用他们呢?同时,怎么最大化利用他们呢?今天我们就来说说这个话题。
说到多线策略,就需要提及到两个概念,一个是负载均衡一个是带宽叠加。就我个人理解,负载均衡是在多个人用有限的几条线时,如何使这几条线的利用率都最大化。比如我有A、B、C、D四条线,在做负载均衡以前,可能A、B是满负荷工作,而C、D是空的;做了负载均衡以后,A、B、C、D都有流量,而不会出现一个压的喘不过气,一个没事做的情况了。带宽叠加是在一个人用多条线的时候,能将多条线的带宽加起来,从而达到提高下载速度或减少网页打开的时间。
在ros中,以该路由器为中心,可以分为上下两部分,下面一部分是内网限速(最典型的就是DSCP Over HTB),这里不做讨论,如有需要以后分析;另一部分就是ADSL向上的那一部分,下面我就以ADSL这部分的NTH均衡来做下实例,希望抛砖引玉,希望更好的策略能够提供给有需要的读者。
在设置ADSL多线的时候,你将可能会遇到以下问题:
1、你可能没有四张网卡,需要用到Vlan交换机;
这个需要你的交换机支持802.1Q,所需要拨号的四个交换机端口(也就是连着四个ADSL猫的端口)都设置成access模式,vlanID分别是10、20、30、40(当然,其他的数字也可以)。连接routeros外线网卡的端口设置成trunk模式,并且允许以上vlan通过,在RouterOS的wan口建立4个vlan,vlanID分别为10、20、30、40(需要与交换机上的对应),这样就保证的了多个猫之间不会互相干扰,但是都可以和routeROS上的虚拟vlan接口通讯。- /interface vlan
- add arp=enabled disabled=no interface=wan mtu=1500 name=vlan10 vlan-id=10
- add arp=enabled disabled=no interface=wan mtu=1500 name=vlan20 vlan-id=20
- add arp=enabled disabled=no interface=wan mtu=1500 name=vlan30 vlan-id=30
- add arp=enabled disabled=no interface=wan mtu=1500 name=vlan40 vlan-id=40
复制代码 2、ADSL无法拨上号,因为用来拨号的mac都一样;
如果你的vlan都是附着在wan口上面的,因此所有vlan虚拟接口的MAC地址都是同一个,因此电信局端检测到两个相同的mac在尝试用两个不同的账号同时拨号的时候就会断掉其中一个,这也是为什么有的无法同时拨号的原因。
解决办法就是通过添加桥即bridge,我感觉添加图片太麻烦,给出个脚本吧:- /interface bridge
- add name=bridge10 admin-mac=11:11:11:11:11:11 disabled=no
- add name=bridge20 admin-mac=22:22:22:22:22:22 disabled=no
- add name=bridge30 admin-mac=33:33:33:33:33:33 disabled=no
- add name=bridge40 admin-mac=44:44:44:44:44:44 disabled=no
- /interface bridge port
- add bridge=bridge10 interface=vlan10 disabled=no
- add bridge=bridge20 interface=vlan20 disabled=no
- add bridge=bridge30 interface=vlan30 disabled=no
- add bridge=bridge40 interface=vlan40 disabled=no
复制代码 这样,设置拨号的时候,选择interface为bridge10- bridge40,而不是vlan10-vlan40,这样子的话,拨号就不会存在mac地址冲突而无法拨号的情况了。
3、你可能不会写脚本来动态更新路由的网关,即ADSL的IP;
因为ADSL是动态拨号的,貌似电信设置的为每两天断一次,然后拨号又获得一个新的IP地址,那样话网关也变了,如果我们用脚本来监测的话,未免有些浪费资源。其实只需要改变pppoe拨号的profile就可以将动态IP当静态来用。
首先需要建立四个ppp profiles:- /ppp profile
- add change-tcp-mss=default comment="" name=ppp1 only-one=default \
- remote-address=1.1.1.1 use-compression=default use-encryption=default \
- use-vj-compression=default
- add change-tcp-mss=default comment="" name=ppp2 only-one=default \
- remote-address=2.2.2.2 use-compression=default use-encryption=default \
- use-vj-compression=default
- add change-tcp-mss=default comment="" name=ppp3 only-one=default \
- remote-address=3.3.3.3 use-compression=default use-encryption=default \
- use-vj-compression=default
- add change-tcp-mss=default comment="" name=ppp4 only-one=default \
- remote-address=4.4.4.4 use-compression=default use-encryption=default \
- use-vj-compression=default
复制代码 在设置pppoe拨号的时候,profile不要选择default,而是选择ppp1-ppp4。然后我们ADSL的网关就可以变成1.1.1.1,2.2.2.2,3.3.3.3和4.4.4.4了。
在建立NAT的时候,只需要将伪装内网地址,action选为masquerade即可。- /ip firewall nat
- add action=masquerade chain=srcnat comment="" disabled=no src-address=192.168.0.0/24
复制代码 4、你可能不会标记,不明白NTH是什么;
以下脚本的含义为当建立一个新连接的时候,标记为1,在建立一条的时候标记为2,一直到4,然后回到1,以此反复(1 2 3 4)(1 2 3 4) (1 2 3 4)(1 2 3 4)……
注意,我这里用的是连接,而不是数据包,passthrough全部是yes,测试的版本为3.22。- /ip firewall mangle
- add action=mark-connection chain=prerouting connection-state=new disabled=no
- in-interface=lan new-connection-mark=1 nth=4,1 passthrough=yes
- add action=mark-routing chain=prerouting comment="" connection-mark=1 \
- disabled=no in-interface=lan new-routing-mark=1 passthrough=yes
- add action=mark-connection chain=prerouting connection-state=new disabled=no
- in-interface=lan new-connection-mark=2 nth=4,2 passthrough=yes
- add action=mark-routing chain=prerouting comment="" connection-mark=2 \
- disabled=no in-interface=lan new-routing-mark=2 passthrough=yes
- add action=mark-connection chain=prerouting connection-state=new disabled=no
- in-interface=lan new-connection-mark=3 nth=4,3 passthrough=yes
- add action=mark-routing chain=prerouting comment="" connection-mark=3 \
- disabled=no in-interface=lan new-routing-mark=3 passthrough=yes
- add action=mark-connection chain=prerouting connection-state=new disabled=no
- in-interface=lan new-connection-mark=4 nth=4,4 passthrough=yes
- add action=mark-routing chain=prerouting comment="" connection-mark=4 \
- disabled=no in-interface=lan new-routing-mark=4 passthrough=yes
复制代码 5、最后将标记的内容用到路由策略中去。
以下的路由策略就是按照上面的标记分别走不同的ADSL线路。- /ip route
- add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 \
- routing-mark=1 scope=255 target-scope=10
- add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=3.3.3.3 \
- routing-mark=3 scope=255 target-scope=10
- add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=2.2.2.2 \
- routing-mark=2 scope=255 target-scope=10
- add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=4.4.4.4 \
- routing-mark=4 scope=255 target-scope=10
- add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=\
- 1.1.1.1,2.2.2.2,3.3.3.3,4.4.4.4 scope=255 target-scope=10
复制代码 写在后面的话:
1、本文只提供了一些负载均衡的思路,想直接套脚本的可能会让你失望。
2、为什么可以带宽叠加?因为在用迅雷下载或者其他下载工具的时候,通常会发起多个线程同时下载,每发起的一个连接占用一条线路,这样就可以起到带宽叠加的作用,而直接IE右键另存为下载的时候,是由IE发起的单线程下载,因此并不会起到叠加的作用。用IE打开网页的时候,也并不是只有一个连接,也是有多个连接同时发起的,所以也可以看到有带宽叠加的效果。
3、为什么其中一条线断了不管,照样可以用?因为根据TCP的原理,它是有重传机制的,如果某一条连接不可用了,它重传的时候会被自动标记到下一条连接,而下一条连接不可用时,再递归到下一条,这样就能保证不会断线,不过会增加一点延时。而对于UDP的报文,是由应用层来控制的,如看在线电影,丢掉一两个包也许没有问题,丢的多了可能会缓冲或者再发起一条连接这样。不过线路断了,本来就不是好的兆头,断了就应该处理,所以断线切换始终是一个临时的解决方案。 |
|