之前有介绍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