海运的博客

OpenWRT/Linux多WAN带宽叠加使用iptables标记策略路由负载均衡

发布时间:November 7, 2012 // 分类:OpenWrt // 18 Comments

之前有介绍OpenWrt下ADSL多拨使用nexthop负载均衡,负载不是很理想,本次使用iptable标记数据包并配合策略路由实现负载均衡。
WAN1数据标记:

iptables -t mangle -N WAN1
#标记数据包
iptables -t mangle -A WAN1 -j MARK --set-mark 1 
#把数据包中的mark设置到整个连接中
iptables -t mangle -A WAN1 -j CONNMARK --save-mark 

WAN2数据标记:

iptables -t mangle -N WAN2
iptables -t mangle -A WAN2 -j MARK --set-mark 1 
iptables -t mangle -A WAN2 -j CONNMARK --save-mark 

把已存在连接中的mark设置到数据包中,实现同个连接同个宽带IP出:

iptables -t mangle -N RESTORE
iptables -t mangle -A RESTORE -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m state --state ESTABLISHED,RELATED -j RESTORE

使用NTH模块公平分发新数据包到WAN1和WAN2:

iptables -t mangle -A PREROUTING -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j WAN1
iptables -t mangle -A PREROUTING -m state --state NEW -m statistic --mode nth --every 2 --packet 1 -j WAN2

设置路由表:

cat /etc/iproute2/rt_tables 
#https://www.haiyun.me
255    local
254    main
253    default
0    unspec
252 WAN1
251 WAN2

设置路由表默认路由:

ip route flush table WAN1
ip route add table WAN1 default via 2.2.2.2 dev ppp0
ip route flush table WAN2
ip route add table WAN2 default via 1.1.1.1 dev ppp1

根据iptables标记应用路由:

ip rule del from all fwmark 2 2>/dev/null
ip rule del from all fwmark 1 2>/dev/null
ip rule add fwmark 1 table my_wan0
ip rule add fwmark 2 table my_wan1
ip route flush cache

禁用源地址验证:

cat /etc/sysctl.conf 
net.ipv4.conf.default.rp_filter = 0

标签:iptables, linux, openwrt, 策略路由, nth, nth负载均衡

有 18 条 关于" OpenWRT/Linux多WAN带宽叠加使用iptables标记策略路由负载均衡 "的评论

  1. 重庆体检

    文章不错,不过太理论了一点,怎么自动更新路由表呢

    1. 海运

      可以写脚本。

  2. 李喃

    楼主好,第一句代码是不是应该改为iptables -t mangle -N WAN0吧?还有第二段给wan1打mark值应该把iptables -t mangle -A WAN2 -j MARK --set-mark 1 改为--set-mark2吧?

    1. 海运

      是的,多谢纠正。

  3. 李喃

    楼主好,我最近在研究更智能的多wan负载均衡方法,该想法是根据网卡的拥塞状况来选择相对空闲的网卡,但一直不知道在linux中怎么得到网卡的拥塞状况,楼主有没有这方面的建议

    1. 海运

      可根据端口带宽占用或TC数据包队列动态调整。

      1. 李喃

        请问所谓的TC数据包队列,是不是tc -s qdisc ls dev eth0 这条命令获取的当前网卡发送数据包数量呢

  4. bbc

    博主,我按照你这边文章表达的思路以及iptables规则,在虚拟机中进行试验,虚拟机里的系统是centos 6.5 x64,不管怎么配置都不能成功,难道openwrt的内核与centos6的内核还能有什么选项不一样的吗?

    1. bbc

      但是在这个虚拟机中使用基于iptables MARK和CONNMARK的策略路由完全没有问题。能否指点一二?

  5. xiedaier

    设置默认路由那一块 2.2.2.2 1.1.1.1是什么东西呢,是ppp0,ppp1的网关么?是怎样获得的啊,求大神指点

    1. 海运

      是ppp0或ppp1的IP,可以简写成:
      ip route add table WAN2 default via 1.1.1.1
      ip route add table WAN2 default dev ppp1

  6. xiedaier

    楼主你好,我按照你得设置,在最后一步fwmark之前还能上网,但是在fwmark后,就不能上网了,主机能ping通网关,ping不通外网,网关能分别从两张网卡ping通,这是怎么回事?

  7. track

    NAT 部分没处理,这块感觉有问题。

  8. lee

    你好,我执行这条语句
    iptables -t mangle -A PREROUTING -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j WAN1
    总是打印
    iptables: No chain/target/match by that name.

    请问这是什么情况呀?

    1. 海运

      缺少相应模块?

    2. CQ

      -m state --state NEW 替换成-m conntrack --ctstate NEW

  9. CQ

    你好,我入站已经成功分流,但是不知道出站怎么设置,PREROUTING替换成POSTROUTING不成功,他的轮询需要禁用额外的吗

    1. 海运

      不好意思,这个是很多年前的,现在也许已经不适用,我现在也不用多线了。

评论已关闭

分类
最新文章
最近回复
  • 海运: 恩山有很多。
  • swsend: 大佬可以分享一下固件吗,谢谢。
  • Jimmy: 方法一 nghtp3步骤需要改成如下才能编译成功: git clone https://git...
  • 海运: 地址格式和udpxy一样,udpxy和msd_lite能用这个就能用。
  • 1: 怎么用 编译后的程序在家里路由器内任意一台设备上运行就可以吗?比如笔记本电脑 m参数是笔记本的...
  • 孤狼: ups_status_set: seems that UPS [BK650M2-CH] is ...
  • 孤狼: 擦。。。。apcupsd会失联 nut在冲到到100的时候会ONBATT进入关机状态,我想想办...
  • 海运: 网络,找到相应的url编辑重发请求,firefox有此功能,其它未知。
  • knetxp: 用浏览器F12网络拦截或监听后编辑重发请求,修改url中的set为set_super,将POS...
  • Albert: 啊啊啊啊啊啊啊啊啊 我太激动了,终于好了英文区搜索了半天,翻遍了 pve 论坛没找到好方法,博...