mching 发表于 2010-9-13 14:14:41

【RouterOS】ADSL多线详解,无脚本更新IP,无脚本断线自动切换

本帖最后由 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=402、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/244、你可能不会标记,不明白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=yes5、最后将标记的内容用到路由策略中去。
以下的路由策略就是按照上面的标记分别走不同的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的报文,是由应用层来控制的,如看在线电影,丢掉一两个包也许没有问题,丢的多了可能会缓冲或者再发起一条连接这样。不过线路断了,本来就不是好的兆头,断了就应该处理,所以断线切换始终是一个临时的解决方案。

WGHBOY 发表于 2010-9-13 15:02:27

断线了游戏也不掉线么,太强了

9939781 发表于 2010-9-13 16:11:19

没有NAT规则?

mching 发表于 2010-9-13 16:25:17

回复 2# WGHBOY

游戏你连上以后正在玩的时候这条线断了,是有可能断的。也有可能不会断,这要看对方服务器设计的系统是如何操作的了。

如果对方的游戏服务器有再生机制,比如qq游戏的时候大家都知道,如果断线了你迅速连上来的时候还是可以玩的~~

mching 发表于 2010-9-13 16:26:03

没有NAT规则?
9939781 发表于 2010-9-13 16:11 http://bbs.routerclub.com/images/common/back.gif

有nat规则啊,就是/ip firewall nat
add action=masquerade chain=srcnat comment="" disabled=no src-address=192.168.0.0/24只需要这一条就足够了。

yjq635 发表于 2010-9-13 16:35:26

标记下,

luiwendi0329 发表于 2010-9-13 16:45:20

VLAN这部份没有看明白是如何设置的;

mching 发表于 2010-9-13 17:07:37

VLAN这部份没有看明白是如何设置的;
luiwendi0329 发表于 2010-9-13 16:45 http://bbs.routerclub.com/images/common/back.gif

各种交换机的型号设置是不一样的~~

luiwendi0329 发表于 2010-9-13 17:18:26

连接RouterOS外线网卡的端口设置成trunk模式,并且允许以上vlan通过

你说的TRUNK模式在那里,最好上个图哟

mching 发表于 2010-9-13 17:44:41

连接RouterOS外线网卡的端口设置成trunk模式,并且允许以上vlan通过

你说的TRUNK模式在那里,最好上个图 ...
luiwendi0329 发表于 2010-9-13 17:18 http://bbs.routerclub.com/images/common/back.gif

这个是在交换机上设置的,不是routeros上面的!

cracks 发表于 2010-9-24 13:07:03

很细心,很实用...这种分享精神无价..........

47771885 发表于 2010-9-24 14:30:24

本文转自mching08的空间写在后面的话:
1、本文只提供了一些负载均衡的思路,想直接套脚本的可能会让你失望 ...
mching 发表于 2010-9-13 14:14 http://bbs.routerclub.com/images/common/back.gif

2.x 的做法 3.x不用这样做了

imxch 发表于 2010-9-24 16:28:09

学习VLAN这个做法

qq3475534 发表于 2010-9-24 17:06:08

学习了啊。

skyer008 发表于 2010-12-11 14:27:29

帮顶一下。
页: [1] 2
查看完整版本: 【RouterOS】ADSL多线详解,无脚本更新IP,无脚本断线自动切换