1、【RouterOS】 ADSL 多线详解,无脚本更新 IP,无脚本断线自动切换前言:当你手里面有多条 ADSL 的时候,你会如何去利用他们呢?同时,怎么最大化利用他们呢?今天我们就来说说这个话题。说到多线策略,就需要提及到两个概念,一个是负载均衡一个是带宽叠加。就我个人理解,负载均衡是在多个人用有限的几条线时,如何使这几条线的利用率都最大化。比如我有A、B、C、D 四条线,在做负载均衡以前,可能 A、B 是满负荷工作,而 C、D 是空的;做了负载均衡以后,A、B、C、D 都有流量,而不会出现一个压的喘不过气,一个没事做的情况了。带宽叠加是在一个人用多条线的时候,能将多条线的带宽加起来,从而达到
2、提高下载速度或减少网页打开的时间。在 ROS 中,以该路由器为中心,可以分为上下两部分,下面一部分是内网限速(最典型的就是 DSCP Over HTB),这里不做讨论,如有需要以后分析;另一部分就是 ADSL 向上的那一部分,下面我就以 ADSL 这部分的 NTH 均衡来做下实例,希望抛砖引玉,希望更好的策略能够提供给有需要的读者。在设置 ADSL 多线的时候,你将可能会遇到以下问题:1、你可能没有四张网卡,需要用到 Vlan 交换机;这个需要你的交换机支持 802.1Q,所需要拨号的四个交换机端口(也就是连着四个 ADSL猫的端口)都设置成 access 模式,vlanID 分别是 10、2
3、0、30、40(当然,其他的数字也可以)。连接 RouterOS 外线网卡的端口设置成 trunk 模式,并且允许以上 vlan 通过,在routeros 的 wan 口建立 4 个 vlan,vlanID 分别为 10、20、30、40(需要与交换机上的对应),这样就保证的了多个猫之间不会互相干扰,但是都可以和 routeros 上的虚拟 vlan接口通讯。 1. /interface vlan2. add arp=enabled disabled=no interface=wan mtu=1500 name=vlan10 vlan-id=103. add arp=enabled disab
4、led=no interface=wan mtu=1500 name=vlan20 vlan-id=204. add arp=enabled disabled=no interface=wan mtu=1500 name=vlan30 vlan-id=305. add arp=enabled disabled=no interface=wan mtu=1500 name=vlan40 vlan-id=40复制代码2、ADSL 无法拨上号,因为用来拨号的 mac 都一样;如果你的 vlan 都是附着在 wan 口上面的,因此所有 vlan 虚拟接口的 MAC 地址都是同一个,因此电信局端检测到两
5、个相同的 mac 在尝试用两个不同的账号同时拨号的时候就会断掉其中一个,这也是为什么有的无法同时拨号的原因。解决办法就是通过添加桥即 bridge,我感觉添加图片太麻烦,给出个脚本吧: 1. /interface bridge2. add name=bridge10 admin-mac=11:11:11:11:11:11 disabled=no3. add name=bridge20 admin-mac=22:22:22:22:22:22 disabled=no4. add name=bridge30 admin-mac=33:33:33:33:33:33 disabled=no5. add
6、name=bridge40 admin-mac=44:44:44:44:44:44 disabled=no6. /interface bridge port7. add bridge=bridge10 interface=vlan10 disabled=no8. add bridge=bridge20 interface=vlan20 disabled=no9. add bridge=bridge30 interface=vlan30 disabled=no10.add bridge=bridge40 interface=vlan40 disabled=no复制代码这样,设置拨号的时候,选择
7、interface 为 bridge10- bridge40,而不是 vlan10-vlan40,这样子的话,拨号就不会存在 mac 地址冲突而无法拨号的情况了。3、你可能不会写脚本来动态更新路由的网关,即 ADSL 的 IP;因为 ADSL 是动态拨号的,貌似电信设置的为每两天断一次,然后拨号又获得一个新的 IP地址,那样话网关也变了,如果我们用脚本来监测的话,未免有些浪费资源。其实只需要改变 pppoe 拨号的 profile 就可以将动态 IP 当静态来用。首先需要建立四个 ppp profiles: 1. /ppp profile2. add change-tcp-mss=defaul
8、t comment=“ name=ppp1 only-one=default 3. remote-address=1.1.1.1 use-compression=default use-encryption=default 4. use-vj-compression=default5. add change-tcp-mss=default comment=“ name=ppp2 only-one=default 6. remote-address=2.2.2.2 use-compression=default use-encryption=default 7. use-vj-compressi
9、on=default8. add change-tcp-mss=default comment=“ name=ppp3 only-one=default 9. remote-address=3.3.3.3 use-compression=default use-encryption=default 10.use-vj-compression=default11.add change-tcp-mss=default comment=“ name=ppp4 only-one=default 12.remote-address=4.4.4.4 use-compression=default use-
10、encryption=default 13.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 即可。 1. /ip firewall nat2. add action=masquerade chain=srcnat comment=“ disabled=no src-address=192
11、.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。 1. /ip firewall mangle2. add action=mark-connection chain=prerouting connection-state=new disabled=no3. in-interface=l
12、an new-connection-mark=1 nth=4,1 passthrough=yes4. add action=mark-routing chain=prerouting comment=“ connection-mark=1 5. disabled=no in-interface=lan new-routing-mark=1 passthrough=yes6. add action=mark-connection chain=prerouting connection-state=new disabled=no7. in-interface=lan new-connection-
13、mark=2 nth=4,2 passthrough=yes8. add action=mark-routing chain=prerouting comment=“ connection-mark=2 9. disabled=no in-interface=lan new-routing-mark=2 passthrough=yes10.add action=mark-connection chain=prerouting connection-state=new disabled=no11.in-interface=lan new-connection-mark=3 nth=4,3 pas
14、sthrough=yes12.add action=mark-routing chain=prerouting comment=“ connection-mark=3 13.disabled=no in-interface=lan new-routing-mark=3 passthrough=yes14.add action=mark-connection chain=prerouting connection-state=new disabled=no15.in-interface=lan new-connection-mark=4 nth=4,4 passthrough=yes16.add
15、 action=mark-routing chain=prerouting comment=“ connection-mark=4 17.disabled=no in-interface=lan new-routing-mark=4 passthrough=yes复制代码5、最后将标记的内容用到路由策略中去。以下的路由策略就是按照上面的标记分别走不同的 ADSL 线路。 1. /ip route2. add comment=“ disabled=no distance=1 dst-address=0.0.0.0/0 gateway=1.1.1.1 3. routing-mark=1 scope
16、=255 target-scope=104. add comment=“ disabled=no distance=1 dst-address=0.0.0.0/0 gateway=3.3.3.3 5. routing-mark=3 scope=255 target-scope=106. add comment=“ disabled=no distance=1 dst-address=0.0.0.0/0 gateway=2.2.2.2 7. routing-mark=2 scope=255 target-scope=108. add comment=“ disabled=no distance=
17、1 dst-address=0.0.0.0/0 gateway=4.4.4.4 9. routing-mark=4 scope=255 target-scope=1010.add comment=“ disabled=no distance=1 dst-address=0.0.0.0/0 gateway=11.1.1.1.1,2.2.2.2,3.3.3.3,4.4.4.4 scope=255 target-scope=10复制代码写在后面的话:1、本文只提供了一些负载均衡的思路,想直接套脚本的可能会让你失望。2、为什么可以带宽叠加?因为在用迅雷下载或者其他下载工具的时候,通常会发起多个线程同时
18、下载,每发起的一个连接占用一条线路,这样就可以起到带宽叠加的作用,而直接IE 右键另存为下载的时候,是由 IE 发起的单线程下载,因此并不会起到叠加的作用。用IE 打开网页的时候,也并不是只有一个连接,也是有多个连接同时发起的,所以也可以看到有带宽叠加的效果。3、为什么其中一条线断了不管,照样可以用?因为根据 TCP 的原理,它是有重传机制的,如果某一条连接不可用了,它重传的时候会被自动标记到下一条连接,而下一条连接不可用时,再递归到下一条,这样就能保证不会断线,不过会增加一点延时。而对于 UDP 的报文,是由应用层来控制的,如看在线电影,丢掉一两个包也许没有问题,丢的多了可能会缓冲或者再发起一条连接这样。不过线路断了,本来就不是好的兆头,断了就应该处理,所以断线切换始终是一个临时的解决方案。