mwan3 analysis

mwan3 analysis

简介

mwan3提供了如下功能:

  1. 提供了基于权重分配的多WAN口下出站WAN流量负载均衡
  2. 通过重复的ping测试(ping|arping|httping)来监控每个WAN连接,并能自动路由出站流量到另外的WAN口如果第一个WAN口丢失连接
  3. 提供了特定出站流量规则来定制哪些出站连接应该使用哪个WAN口,这些规则可以基于源IP,目的IP,源端口,目的端口,IP协议类型
  4. 通过LuCI来管理和配置
  5. 支持多大250个物理或逻辑WAN口
  6. 用来标记出站数据包的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:

  1. ip rules 1001 - 1250分别对应wan接口1-250. 这个路由规则说,如果包是从wan口进来的,使用主路由表,而不是mark。
  2. ip rules 2001 - 2250分贝对应wan接口1-250. 这个路由规则说,如果包标记了iface_id[1-252],使用对应的wan口路由表
  3. ip rules 2253为blackhole规则,这个路由规则说,如果包标记了iface_id253(blackhole),那么就丢掉
  4. ip rules 2254为blackhole/unreachable规则,这个路由规则说,如果包标记了iface_id254(unreachable),丢掉包并返回icmp不可达

然后是路由表,这里有标准主路由表和一个包含每个wan口网关的路由表。路由表1给第一个wan,路由表2给第二个wan,以此类推.

mwan3主要使用的工具

mwan3的代码组成

mwan3配置文件

mwan3配置文件分为五个部分:

  1. global
  2. interface
  3. member
  4. policy
  5. rule

global配置

必须要有,否则mwan3默认关闭

  1. mmx_mask '0x3F00' # netlink mark mask 
  2. local_source 'none' # ? 
  3. rtmon_interval '5' # - 

interface配置

为每个wan口配置一个interface section,并定义如何测试wan口的up/down状态,每个interface section的name必须与network配置的一致

  1. interface section name # 与network里配置一致 
  2. enabled # 是否mwan3运行在这个接口上 

member配置

每个member代表带有metric和weight的接口,member配置在policy配置中引用,来定义带有相关metric和load balancing weight的一个接口池,member不能直接被rule配置使用。

  1. interface # 对应interface section name 
  2. metric # 在一个policy中的member,带小的metric要优先于带大的metric 
  3. weight # 一样的metric的member通过这个weight值来分配负载 

policy配置

policy定义了流量如何路由到不同的wan口。每个policy必须有一个或多个member分配给它,它定义了policy的流量行为。如果一个policy只有一个member, 流量将指出去到这个member.
如果一个policy有多个member,它将在多个member中做负载均衡,或者fail-over
rule配置引用这个policy,policy才生效

  1. list user_member # 引用member配置 

rule配置

一个rule描述了匹配的流量和分配给这个流量的policy。

  1. use_policy # 引用policy配置 
  2. src_ip # 匹配特定源IP 
  3. src_port # 匹配特定源端口 
  4. proto # 匹配给定协议 
  5. dest_ip # 匹配目的ip 
  6. dest_port # 匹配目的端口 
  7. ipset # 匹配给定目的ip到ipset 
  8. sticky # 允许同一个源IP过来的流量在timeout内和之前session用同一个wan接口 
  9. 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

posted on 2018-12-24 13:18  nicephil  阅读(2530)  评论(0编辑  收藏  举报

导航