mwan3 analysis
mwan3 analysis
简介
mwan3提供了如下功能:
- 提供了基于权重分配的多WAN口下出站WAN流量负载均衡
- 通过重复的ping测试(ping|arping|httping)来监控每个WAN连接,并能自动路由出站流量到另外的WAN口如果第一个WAN口丢失连接
- 提供了特定出站流量规则来定制哪些出站连接应该使用哪个WAN口,这些规则可以基于源IP,目的IP,源端口,目的端口,IP协议类型
- 通过LuCI来管理和配置
- 支持多大250个物理或逻辑WAN口
- 用来标记出站数据包的netfilter的mask(默认0x3F00)可以在/etc/config/mwan3的全局配置里修改,方便和其它使用mask的其它软件包兼容并存,比如QoS script,VPN等
负载均衡的工作原理
mwan3使用标准Linux策略路由来负载均衡多WAN口下的出站流量,Linux出站流量负载均衡以每个IP连接为单位,它不是channel-bonding, 这里一个单个连接(例如,一个单个下载)将同时使用多个WAN连接,因此它将帮助加速多个单独下载或来自一组源PC能访问到的不同网站的流量,但是不能加速来自同一个PC的单个下载(除非下载是跨多个IP流下载)
mwan3构架
mwan3由hotplug事件驱动,当一个接口打开,它将创建一个定制的路由表和iptables的规则。一个新的路由表被创建给每个接口,然后创建iptables规则,并使用iptables MARK来某些流量。基于这些规则,内核决定使用哪个路由表。当一个接口关闭,mwan3就删除掉这些规则和到这个接口的路由
一旦所有如有和规则初始化建立,mwan3就退出了。内核来处理所有的路由决定。如果一个新接口的hotplug事件发生,mwan3将再次启动如果需要就调整路由和表
另外提供了一个监控脚本(mwan3track)在后台运行,使用ping测试来检查每个打开的WAN口的连接情况。如果一个接口下线,这个脚本模拟发送一个Hotplug事件来触发mwan3调整这个接口对应的路由表
mwan3的路由
每个到来的包(包含路由器发起的流量)被iptables的mwan3_hook来做如下处理:
iptables只是标记包,它不做路由选择。下面是按顺序创建的ip rules:
- ip rules 1001 - 1250分别对应wan接口1-250. 这个路由规则说,如果包是从wan口进来的,使用主路由表,而不是mark。
- ip rules 2001 - 2250分贝对应wan接口1-250. 这个路由规则说,如果包标记了iface_id[1-252],使用对应的wan口路由表
- ip rules 2253为blackhole规则,这个路由规则说,如果包标记了iface_id253(blackhole),那么就丢掉
- ip rules 2254为blackhole/unreachable规则,这个路由规则说,如果包标记了iface_id254(unreachable),丢掉包并返回icmp不可达
然后是路由表,这里有标准主路由表和一个包含每个wan口网关的路由表。路由表1给第一个wan,路由表2给第二个wan,以此类推.
mwan3主要使用的工具
mwan3的代码组成
mwan3配置文件
mwan3配置文件分为五个部分:
- global
- interface
- member
- policy
- rule
global配置
必须要有,否则mwan3默认关闭
- mmx_mask '0x3F00' # netlink mark mask
- local_source 'none' # ?
- rtmon_interval '5' # -
interface配置
为每个wan口配置一个interface section,并定义如何测试wan口的up/down状态,每个interface section的name必须与network配置的一致
- interface section name # 与network里配置一致
- enabled # 是否mwan3运行在这个接口上
member配置
每个member代表带有metric和weight的接口,member配置在policy配置中引用,来定义带有相关metric和load balancing weight的一个接口池,member不能直接被rule配置使用。
- interface # 对应interface section name
- metric # 在一个policy中的member,带小的metric要优先于带大的metric
- weight # 一样的metric的member通过这个weight值来分配负载
policy配置
policy定义了流量如何路由到不同的wan口。每个policy必须有一个或多个member分配给它,它定义了policy的流量行为。如果一个policy只有一个member, 流量将指出去到这个member.
如果一个policy有多个member,它将在多个member中做负载均衡,或者fail-over
rule配置引用这个policy,policy才生效
- list user_member # 引用member配置
rule配置
一个rule描述了匹配的流量和分配给这个流量的policy。
- use_policy # 引用policy配置
- src_ip # 匹配特定源IP
- src_port # 匹配特定源端口
- proto # 匹配给定协议
- dest_ip # 匹配目的ip
- dest_port # 匹配目的端口
- ipset # 匹配给定目的ip到ipset
- sticky # 允许同一个源IP过来的流量在timeout内和之前session用同一个wan接口
- timeout # stickiness超时时间
stickiness and ipset
stickiness让你路由新session在同一个wan口上跟之前session一致,直到超过timeout,这个能解决https不允许新源IP用同一个cookie/https session.
当sticky是1时,这个rule就启用了sticky。当新session的一个包匹配了rule,它的源ip和interface mark被保存在ipmark set。当第二个新session的包从同一个lan主机匹配了这个rule,
它将使用同样的wan接口。
rule的评估是从上到下,有顺序,第一个匹配的rule被应用, 如果没有匹配的,路由选择通过default路由表完成。
2018-10-13 - nicephil@gmail.com