单线多拨是一个很诱人的东西,之前听都没听说过。我刷Openwrt的初衷比较简单,就是折腾一下linux系统,顺便做做文件服务器什么的。但是在论坛里面看了一下,发现好多人刷Openwrt的主要的目的,一个是翻墙,还有一个就是这个单线多拨了。因为之前一点都不了解,Google了一下,才发现,这个功能确实看起来是那么的诱人!
简单的说,多拨的概念是,一个路由器能同时连接多个ISP,从而使得带宽能够得到叠加。比如说家里面开通了一条电信的宽带,又开通了一个联通的宽带,那么路由器就可以用一个网口接电信的线路,另外一个网口接联通的线路,如果路由器支持多拨的话,那么这两条线路的带宽就可以叠加,家里的上网速度就嗖嗖嗖的上去了。除了这个功能之外,还可以做负载均衡,特定的流量走特定的线路之类的事情。这样的情形,应该叫做多线多拨。
不过,这种同时开通几个宽带的事情,不知道企业里面会不会做,家庭用户应该是不会这样做的吧,有这个必要吗?太能折腾了吧。
多线多拨,对于只是用来上上网的家庭用户的话,只要不是吃饱了撑着,实在没事干,基本上是没有这个需求的。但是如果是单线多拨呢?我觉得只要大家了解了这是干嘛的,估计立马会噌的一下血压升高,脑门发烫,忍不住咽个不自觉留下的口水。好吧,也不至于都这么的x丝,可能只有我是这样的。单线多拨的概念是,在同一个ISP链路上,同时建立多个连接。这实际上并不是一个什么新奇的东西,我们家用的电信的宽带,在没有破解电信猫之前,电信提供的服务是很没意思的,它限制使用用户的数量,只允许家里面4个设备同时上网,每个设备上网的话都需要单独拨号。这种情况实际上就是在一条链路上建了多个PPPOE的连接。只不过后来我们家的电信猫被破解了,电信猫改成了路由模式之后,就不需要每个设备单独拨号了。这里说这个,只是说明单线多拨什么的,其实也没有什么特殊的地方,一直以来,一条物理链路上都是允许建立多个逻辑链路的。但是如果跟刚才举的那个例子对比,单线多拨有一个特殊的地方,那就是,同样是建立多个pppoe的连接,刚才举的例子是,每个设备都只能建立一个自己的pppoe连接,而单线多拨是在同一个设备上(路由器)建立了多个pppoe的连接!
在刷了Openwrt的路由器上,是有软件能够实现这个单线多拨的功能的。但是,多拨了,带宽就一定能叠加吗?这可不一定。我们家宽带是50M的,那我来弄个10拨,同时建10个pppoe连接,那带宽就能到500M吗?太牛逼了吧。一般正常的情况下,大多数的多拨是起不了作用的,因为ISP也不是傻叉,哪有这好事?但是根据网上的说法,在某些时候,某些城市,某些运营商,由于自己的网络配置的问题,多拨就会产生梦寐以求的带宽能叠加的效果!所以,这个单线多拨能不能成功实现带宽叠加,主要不是看技术,拼运气,拼人品,才是最重要的!
上网搜搜,就会发现,有一种说法是,如果端口速度和签约速率不匹配,那么,多拨速率叠加就是可能的。所谓签约速率,就是我们跟ISP签约的时候,告诉我们的速率,比如我们家原来是电信的4M宽带,现在老用户免费升级到了50M。端口速率是我们终端用户不知道的一个运营商内部设置的参数,比如说100M。如果端口速率大于签约速率的话,那么多拨速率叠加就是可能的。
上面的这个说法,不知道是真是假。不管怎么样,反正是拼人品的事,怎么着也得先折腾折腾,说不定就成了呢?所以,先不管这个不可控的因素,咱可以先来研究研究技术上,怎么实现多拨,其他的丢给现实去吧。
关于openwrt上的多拨,实际上有好多个方案。不同的人开发了好几款不同的软件,比如NWan,MWan,MutiWan,M-Route(摘自google…),都能实现单线多拨。我没有研究比较过所有的这几个软件,只使用过mwan3。从我的WR720N的表现来说,mwan3是可以正常工作的。已经记不清楚为什么使用mwan3这个软件了,可能是openwrt的wiki上有关于这个工具的介绍吧。然后我记得在openwrt的论坛里面,这个软件的作者也对这个软件的原理和使用做了比较详细的说明,觉得比较靠谱。
首先mwan3是由openwrt论坛上的一个叫做Adze的用户发布的,我不太了解历史,这个人应该之前已经发布了mwan2软件,mwan3是他发布的最新版本。参考这个链接,里面有Adze对自己的这个软件的描述。我之前也看了他的这个帖子,对软件的基本原来有了一点大概的了解。
实际上mwan3这个软件,并不仅仅局限于用于单线多拨,从Adze的描述来看,mwan3实际上主要是应用于多线多拨,也就是我们一开头描述的那种情况。并且带了一系列复杂的配置参数,主要是应付不同的应用场景的。它采用的技术,就是功能非常强大的linux策略路(ip工具)加上iptables这两个牛逼的东东。根据不同的配置,mwan3能够实现各种各样的流量分流,负载均衡,QOS等等复杂的功能。针对我们的单线多拨需求,实际上仅仅使用了mwan3提供的负载均衡功能。
说到底,要实现单线多拨,我们需要在openwrt上做些什么?其实说起来也不复杂,基本的需求就三个。
- 在一个物理网口上虚拟出多个“逻辑”网口
- 每个“逻辑”网口单独拨号各自建立跟ISP的连接
- 多个“逻辑”网口上建立的多个连接之间做负载均衡
需要做的事情就是上面列出来的这么多,而mwan3所起的作用就是上面的第三个,做负载均衡。
操作的话按照下面的流程来,基本上是参考的恩山论坛上的叫worker的会员提供的操作手册来操作的,参考这个链接,worker还提供了一个pdf版本的操作手册,在链接上应该能够下载到,他已经把整个流程说的很清楚了。
第一步:安装相应的软件包
安装相应的软件模块ip/macvlan/mwan3
# opkg update # opkg install ip kmod-macvlan mwan3,luci-app-mwan3
ip工具包是基本的软件包,应该是自带的(记不清了),在我们这个需求里面,它主要提供网络配置和策略路由功能,macvlan模块主要提供虚拟网卡功能,mwan3提供负载均衡功能。luci-app-mwan3是mwan3的图形化管理工具。
第二步:创建多个虚拟网卡
使用下面的命令创建一个新的虚拟网卡并激活它。
# ip link add link eth0 name macvlan0 type macvlan # ifconfig macvlan0 hw ether FE:BC:51:C4:0A:23 # ifconfig macvlan0 up
其中eth0需要换成路由器上实际的对外的网口(正常的话应该也是eth0),macvlan0就是新生成的虚拟网卡的名称,可以随便命令,还有ether参数,虚拟网卡的以太网的地址,随便给一个就行了。这样,一个虚拟网卡就生成好。
接下来,还可以用同样的方法生成多个虚拟网卡,就看我们需要几拨了。我的WR720N使用了三拨,所以使用的命令最终是下面的这样。
# ip link add link eth0 name macvlan0 type macvlan # ifconfig macvlan0 hw ether FE:AD:51:C4:0A:23 # ifconfig macvlan0 up # ip link add link eth0 name macvlan1 type macvlan # ifconfig macvlan1 hw ether BB:EF:12:C4:0A:23 # ifconfig macvlan1 up # ip link add link eth0 name macvlan2 type macvlan # ifconfig macvlan2 hw ether AA:01:AA:1C:0A:23 # ifconfig macvlan2 up
因为每次系统启动的时候都需要将上面的这些命令全部执行一遍,将所有的虚拟网卡都生成一下,所以需要将上面的这些个命令放到系统初始化脚本里面去。
编辑/etc/rc.local文件,将上面的命令放到文件的exit 0之前就行了。
# vi /etc/rc.local
重启一下路由器,在系统中使用ifconfig -a 命令就能够看到虚拟网卡已经被系统识别了。
第三步:配置虚拟网卡
虚拟网卡创建好了之后,下面就需要配置虚拟网卡。所谓配置虚拟网卡,对于我的WR720N来说,就是让每一个虚拟网卡建立起一个pppoe连接。当时我配置的时候是通过luci图形界面进行配置的,参考的也是worker的那个pdf文件。但是如果熟悉命令行的话,配置起来一样的简单。这里我只描述命令行下的配置,luci下的配置,可以直接参考上面介绍的worker的pdf文档,里面有详细的描述。其实对于每一个虚拟网卡,需要做的事情其实就两件,一是建立起pppoe连接,二是在防火墙中将这个pppoe连接归类为wan类型。
编辑network的配置文件
# vi /etc/config/network
对于每一个虚拟网卡,在network文件中增加一段下面这样的配置。
config interface 'VWAN1' option proto 'pppoe' option username '宽带用户名' option password '宽带密码' option _orig_ifname 'macvlan1' option _orig_bridge 'false' option ifname 'eth0' option metric '5'
其中interface名字是pope连接的名字,可以随便起一个就行了。
username和password分别为宽带的用户名和密码。
_orig_ifname里面需要填上虚拟网卡的设备名字。
ifname需要填上虚拟网卡对应的真实网卡的设备名。
metric随便填一个数字,但是要注意的是,对于每一个虚拟网卡,这个数字要不一样。
对于我的WR720N来说,虚拟了三个虚拟网卡,最终在network配置文件中添加的配置信息就如下所示。
config interface 'VWAN1' option proto 'pppoe' option username '宽带用户名' option password '宽带密码' option _orig_ifname 'macvlan1' option _orig_bridge 'false' option ifname 'eth0' option metric '5' config interface 'VWAN2' option proto 'pppoe' option username '宽带用户名' option password '宽带密码' option _orig_ifname 'macvlan2' option _orig_bridge 'false' option ifname 'eth0' option metric '10' config interface 'VWAN3' option proto 'pppoe' option username '宽带用户名' option password '宽带密码' option _orig_ifname 'macvlan3' option _orig_bridge 'false' option ifname 'eth0' option metric '15'
在配置了eth0上的三个虚拟网卡之后,需要将eth0自己的那个pppoe的连接给停掉。这一步操作是不是必须的,还不是太清楚,之前是一步步的参照worker的文档操作的。
所以在network配置文件里面,eth0自己的配置要改成下面这样。
config interface 'wan' option ifname 'eth0' option _orig_ifname 'eth0' option _orig_bridge 'false' option proto 'none'
在这些配置结束之后,需要把创建的3个pppoe的连接(VWAN1,VWAN2,VWAN3)加入到防火墙的WAN域中。
# vi /etc/config/network
将其中wan部分的配置中,加入VWAN1,VWAN2,VWAN3.
config zone option name 'wan' option input 'REJECT' option output 'ACCEPT' option forward 'REJECT' option masq '1' option mtu_fix '1' option network 'wan wan6 VWAN1 VWAN2 VWAN3'
OK.到此为止,虚拟网卡的配置就结束了,使用ifconfig命令查看,就应该能够看到三个虚拟网口上,都建立起了各自的pppoe连接了!
但是,这个时候,应该海是不能够上网的,因为此时mwan3已经起了作用,但是我们对mwan3还没有进行配置,相应的路由规则和iptable规则还没有正确的建立起来。
所以下一步,我们必须要对mwan3进行配置了!
第四步:配置MWAN3
mwan3的配置,说实话,一开始接触的话,看起来还是满繁琐的。Adze在设计配置系统的时候,将选项拆成了好几个步骤,也引入了几个概念,我觉得这样的好处可能是对于配置的每一步来说,灵活性更大,从而能够实现多种多样的配置。对于一开始接触这个工具,不了解它的体系的人来说,还是有些困惑。不过正是因为其配置工具的复杂和规范,所以能组合出的不同的功能也会相当的强大。
因为在mwan3的配置系统里面,引入了一些有特殊含义的概念,所以了解一下这些概念的含义还是很有必要的。
在配置mwan3的时候,总共有四个概念。
- rule
- policy
- member
- interface
画了一个简图表示这四个概念之间的关系。
对于mwan3的配置而言,
rule是处于最顶端的概念,一个完整的配置文件就是由1个或者多个rule组成的。
对于每一个rule,需要依赖于一个特定的policy.
对于每一个policy,它是由1个或者多个member组成的。
对于每一个member,它依赖于一个特定的interface.
而每一个特定的interface,实际上对应的是一个网络连接(上面提到了VWAN1,VWAN2,VWAN3).
在openwrt的wiki里面,对于这几个概念有非常详细的描述,可以参考wiki文章。
rule configuration
一条(rule)匹配某种特定类型的连接,并将这个连接交给一个特定的policy去处理。可选的类型一般是源ip地址,源port类型,协议类型。目的ip地址,目的port类型。
Policy configuration
policy的概念在这里比较的让人难以理解,其实所谓的policy就是一个组合,一个policy只是定义了这个policy会有哪些member组成。member可以有一个或者多个。为什么把这个组合叫做Policy呢?如果一条连接被某个rule匹配了,然后交给某个policy去处理,那么这条连接上的数据就会通过policy里面的members去发送和接受。比如说有多个member,那么数据到底优先从哪个member走?数据量怎么分配?如果有负载平衡的话,哪个member负担的多一点,那个member负担的少一点?解决这些问题,就是policy的意思.在分配到同一个policy里面的不同的member,会被比较优先级,在实际承载数据流量的时候,会根据优先级分配任务。这就是这个组合为什么会被叫做policy的原因。
member configuration
一个policy会包含一个或者多个member,并比较member之间的优先级。那么在member configuration的时候,实际上做的事情就是两个。一个事情是指定这个member是映射到哪个interface的,还有一个事情就是指定member的优先级。
policy会比较优先级,但是policy本身并不对每个member指定优先级。每个member在定义自己的时候,就确定了自己的优先级,然后,policy的阶段,只是单纯的比较一下所有的member的优先级,排序。
interface configuration
一个interface实际上就是一个特定的网络连接(我们上面说到的VWAN1,VWAN2,,)。只不过在配置interface的时候,mwan3使用了ping的技术,以便网络连接断开的时候,能够让mwan3知道。就是这么简单。
看看上面的四个概念,再看看描述,我觉得Adze有点把配置给复杂化了,实际上一个很直观的配置,有点被硬生生的拆开来,然后又硬生生的被耦合在一起的感觉,而且policy/member/interface这样的概念,其实它们实际的意义并不像它们的名字那样的直观。但是不管怎么样,使用别人的软件,也只有遵循别人定下来的规则。所以我们要做的事情就是熟悉和了解这些概念,这样才能在应用的时候正确的配置,以满足我们的需求。
那么,对于我们所说的单线多拨,我们的对mwan3的需求是什么?其实也很简单,就是在所有虚拟的网卡上建立的连接之间做负载均衡。对于我这个WR720N的具体例子来说,就是在虚拟出来的3个网卡上分别建立的pppoe连接(VWAN1,VWAN2,VWAN3)之间做负载均衡。
操作如下。
编辑mwan3的配置文件。
# vi /etc/config/mwan3
将内容配置为下面的这样。
config rule 'default_rule' option dest_ip '0.0.0.0/0' option use_policy 'balanced' config policy 'balanced' option last_resort 'unreachable' list use_member 'vwan1_m1_w1' list use_member 'vwan2_m1_w1' list use_member 'vwan3_m1_w1' config member 'vwan1_m1_w1' option interface 'VWAN1' option metric '1' option weight '1' config member 'vwan2_m1_w1' option interface 'VWAN2' option metric '1' option weight '1' config member 'vwan3_m1_w1' option interface 'VWAN3' option metric '1' option weight '1' config interface 'VWAN1' option enabled '1' option reliability '1' option count '1' option up '3' list track_ip '180.76.76.76' option timeout '3' option interval '300' option down '2' config interface 'VWAN2' option enabled '1' option reliability '1' option count '1' option up '3' list track_ip '180.76.76.76' option timeout '3' option interval '300' option down '2' config interface 'VWAN3' option enabled '1' option reliability '1' option count '1' option up '3' option timeout '3' list track_ip '180.76.76.76' option interval '300' option down '2'
上面的配置文件,可以解读为:
- rule方面,整个系统只配置了一个叫做default的rule,而且所有的流量都按照”balanced”这个policy走
- policy方面,“balanced”包含了3个member,分别为”vwan1_m1_w1″,”vwan2_m1_w1″,”vwan3_m1_w1″
- member方面,vwan1_m1_w1,对应于interface VWAN1,并且metric为1,weight也为1.vwan2_m1_w1和vwan3_m1_w1类似,只是分别对应的interface是VWAN2和VWAN3.由此可见,balanced中的这三个member的优先级是一样的,所以在这三个member之间,系统就是做的负载均衡。
- interface方面,建立了三个interface,分别为VWAN1, VWAN2,VWAN3。分别对应虚拟出来的三个网口上建立的pppoe连接。
这样一来,所有的配置就完成啦!
等一会儿或者将路由器重启一下,拼人品的时候到啦,等系统启动成功,所有的虚拟网卡的连接都建好之后,测试一下网速有没有叠加!
第五步:扩展话题--https连接的mwan3配置
按照前面四步的设置,上网是没有问题了,而且所有的流量是在3个虚拟连接上做负载均衡的。而Adez也解释的比较清楚了,mwan3实现的负载均衡是基于每一次连接的。就是说,如果说路由器对于外部有三个连接请求,那么三个虚拟连接各自会被分到一个。这种情况对于一般的连接来说是没有问题的。但是,按照恩山论坛上worker的说法,这个机制,对于https的连接来说是有问题的,因为“似乎”(我对https没有研究)对于https连接来说,它不能忍受一会儿是从VWAN1走,一会儿又从VWAN2走,再过一会儿又从VWAN3走这样的现实。对于https来说,所有的traffic,只能固定从一个连接走。
所以,这里又有了一个新需求,那就是对于https的连接来说,路由器不能做负载均衡,而应该将这样的连接固定到某一个连接上。
所以,在mwan3的配置文件中,又要增加下面的内容。
config rule 'sticky_even' option dest_port '443' option proto 'tcp' option use_policy 'vwan1_only' option src_ip '0.0.0.0/0.0.0.1' config rule 'sticky_odd' option src_ip '0.0.0.1/0.0.0.1' option dest_port '443' option proto 'tcp' option use_policy 'vwan2_only' config policy 'vwan1_only' list use_member 'vwan1_m1_w1' option last_resort 'unreachable' config policy 'vwan2_only' list use_member 'vwan2_m1_w1' option last_resort 'unreachable'
上面的这个配置文件所做的事情,实际上就是对端口为443的数据请求做特殊的处理,让其固定的从VWAN1或者VWAN2走。不详细解释了。只是需要注意的是,这两个rule,在mwan3的配置文件里面的放置的位置,需要放到default rule的前面!