ADSL单线多拨,负载均衡
前题
目标效果图
步骤
使用SSH 登陆路由器。I.e. ssh root@192.168.2.1
运行/usr/bin/duobo。日志类似:
sh: 2: unknown operand Killed Warning: Unable to locate ipset utility, disabling ipset support * Flushing IPv4 filter table * Flushing IPv4 nat table * Flushing IPv4 mangle table * Flushing IPv4 raw table * Flushing conntrack table … * Populating IPv4 filter table * Zone ‘lan’ * Zone ‘wan’ * Rule ‘Allow-DHCP-Renew’ * Rule ‘Allow-Ping’ * Rule ‘51413’ * Rule ‘9091’ * Rule ‘9000’ * Rule ‘6800’ * Forward ‘lan’ -> ‘wan’ * Populating IPv4 nat table * Zone ‘lan’ * Zone ‘wan’ * Populating IPv4 mangle table * Zone ‘lan’ * Zone ‘wan’ * Populating IPv4 raw table * Zone ‘lan’ * Zone ‘wan’ * Set tcp_ecn to off * Set tcp_syncookies to on * Set tcp_window_scaling to on * Running script ‘/etc/firewall.user’ * Running script ‘/usr/share/miniupnpd/firewall.include’ * Running script ‘/usr/share/qos_gargoyle/firewall.include’ ! Failed with exit code 1 ___________________________________________________ 开始第1次拔号……….. 正在并发拔号中…………. 等待3秒…………. [3]拔[0]拔成功, 小于设定的[2]拔,将重新拔号…
_________________________
View Code
_如果没有成功并发多播,根据提示信息调整duobo的内部参数设置,重新运行_。分享一些技巧:
number=10 #number是重拔次数,本脚本启动后一共尝试的次数 n=7 #n是几拔,同时发出几拨,理论上设置越大成功概率越大! ok=2 #ok是拔上几次后退出拔号, 要实现的预期目标 wait=5 #wait time 每次单线多拨失败后,重试的等待时间
原则: 失败多次以后,建议冷重启路由器,多个运行中的脚本会互相冲突,把问题复杂化。
多拨失败以后,耐心等上1分钟;很多次的多播成功都是脚本完成以后退出,然后60秒内获取了超过预期的多条链接。
把n调到7,这样会虚拟出很多wan接口,根据硬件性能,理论上设置越大成功概率越大!
将ok调低一点,比如2。我觉得别太贪心,如果能稳定多播2个ADSL的IP,那其实概率上更折中了稳定性和高负载下的带宽均衡。
wait的时间我感觉5秒-8秒差不多,这个要看运行日志,做相应调整。
看懂程序的原理,根据实际情况调整脚本程序。比如:这个版本的程序是这么多播的,ifup $prefix$i
遗留问题
1 开始第3次拔号……….. 2 正在并发拔号中…………. 3 等待10秒…………. 4 pppoe-wan Link encap:Point-to-Point Protocol 5 pppoe-wan3 Link encap:Point-to-Point Protocol 6 [3]拔[2]拔成功, 大于或等于设定的[2]拨,退出拔号… 7 Error: an inet address is expected rather than “dev”. 8 iptables v1.4.10: Couldn’t load target `zone_wan_notrack’:File not found 9 10 Try `iptables -h’ or ‘iptables –help’ for more information. 11 iptables v1.4.10: Couldn’t load target `zone_wan_nat’:File not found 12 13 Try `iptables -h’ or ‘iptables –help’ for more information. 14 iptables: No chain/target/match by that name. 15 iptables v1.4.10: Couldn’t load target `zone_wan’:File not found 16 17 Try `iptables -h’ or ‘iptables –help’ for more information. 18 iptables: No chain/target/match by that name. 19 iptables: No chain/target/match by that name. 20 iptables: No chain/target/match by that name. 21 iptables: No chain/target/match by that name. 22 iptables: No chain/target/match by that name. 23 iptables: No chain/target/match by that name. 24 iptables: No chain/target/match by that name. 25 Error: an inet address is expected rather than “dev”. 26 iptables v1.4.10: Couldn’t load target `zone_wan_notrack’:File not found 27 28 Try `iptables -h’ or ‘iptables –help’ for more information. 29 iptables v1.4.10: Couldn’t load target `zone_wan_nat’:File not found 30 31 Try `iptables -h’ or ‘iptables –help’ for more information. 32 iptables: No chain/target/match by that name. 33 iptables v1.4.10: Couldn’t load target `zone_wan’:File not found 34 35 Try `iptables -h’ or ‘iptables –help’ for more information. 36 iptables: No chain/target/match by that name. 37 iptables: No chain/target/match by that name. 38 iptables: No chain/target/match by that name. 39 iptables: No chain/target/match by that name. 40 iptables: No chain/target/match by that name. 41 iptables: No chain/target/match by that name. 42 iptables: No chain/target/match by that name. 43 Error: an IP address is expected rather than “dev” 44 192.168.2.0/24 dev br-lan proto kernel scope link src 192.168.2.1 45 221.218.232.1 dev pppoe-wan3 proto kernel scope link src 123.112.248.148 46 221.218.232.1 dev pppoe-wan proto kernel scope link src 221.218.236.51 47 Kernel IP routing table 48 Destination Gateway Genmask Flags Metric Ref Use Iface 49 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan 50 221.218.232.1 0.0.0.0 255.255.255.255 UH 0 0 0 pppoe-wan3 51 221.218.232.1 0.0.0.0 255.255.255.255 UH 0 0 0 pppoe-wan
View Error Code
显然这个0.3版本的脚本不完全适用于我的路由器,有时间我需要查查原因。
估计都是关于iptables
有没有大侠探讨一下?
修正了下面版本中的一个错误
line 19:if [ $j -ge $ok ] ;
多拨代码(V0.3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 1 #!/bin/sh 2 #modified by muziling v0.3 3 #并发多拨脚本 4 5 #number是重拔次数 6 #n是几拔 7 #ok是拔上几次后退出拔号 8 #wait time 9 10 number=10 11 n=3 12 ok=2 13 wait\=5 14 # avoid same with feixiang's N-WAN naming and must start with "wan" 15 prefix=wan 16 vthprefix=vth 17 18 j=$(ifconfig | grep pppoe-wan | wc -l) 19 if \[ "$j" >= "$ok" \] ; 20 then 21 echo 已经是\[$j\]拔了,退出拔号... 22 exit 0 23 fi 24 25 if \[ -f /etc/config/nwannumset \] ; 26 then 27 uci set nwannumset.@macvlan\_numset\[0\].macvlan\_num=1 28 uci commit nwannumset 29 fi 30 for i in $( seq 1 $(($n-1))) 31 do 32 ifname=$prefix$i 33 ifvth=$vthprefix$i 34 #ifwan=$(uci get network.wan.ifname) 35 pppoe\_name=$(uci get network.wan.username) 36 pppoe\_pw=$(uci get network.wan.password) 37 38 if \[ $(ip link | grep " ${ifvth}@eth0.2:" | wc -l) == "0" \] ; 39 then 40 macfac=$(ifconfig | grep eth0.2 | tr -s " " | cut -d " " -f5 | cut -b 1\-8) 41 mac="$macfac:"$(md5sum /proc/sys/kernel/random/uuid | sed 's/\\(..\\)/&:/g' | cut -b 1\-8 | tr \[a-f\] \[A-F\]) 42 ip link add link eth0.2 $ifvth type macvlan 43 ifconfig $ifvth hw ether $mac 44 fi 45 46 # add /etc/config/network 47 uci delete network.$ifname 48 uci set network.$ifname=interface 49 uci set network.$ifname.ifname=$ifvth 50 #uci set network.$ifname.\_orig\_ifname=eth0.2 51 #uci set network.$ifname.\_orig\_bridge=false 52 uci set network.$ifname.proto=pppoe 53 uci set network.$ifname.username=$pppoe\_name 54 uci set network.$ifname.password=$pppoe\_pw 55 uci set network.$ifname.auto=0 56 uci set network.$ifname.defaultroute=0 57 uci set network.$ifname.peerdns=1 58 uci set network.$ifname.pppd\_options="plugin rp-pppoe.so syncppp $n" 59 60 # add /etc/config/dhcp 61 uci delete dhcp.$ifvth 62 uci set dhcp.$ifvth=dhcp 63 uci set dhcp.$ifvth.interface=$ifname 64 uci set dhcp.$ifvth.ignore=1 65 66 if \[ -f /etc/config/nwan \] ; 67 then 68 uci delete nwan.$ifname 69 uci set nwan.$ifname=interface 70 uci set nwan.$ifname.name=telecom 71 uci set nwan.$ifname.route=balance 72 uci set nwan.$ifname.weight=1 73 uci set nwan.$ifname.uptime\=0day,0hour,0min 74 uci commit nwan 75 fi 76 done 77 uci set network.wan.defaultroute=0 78 uci set network.wan.peerdns=1 79 uci set network.wan.pppd\_options="plugin rp-pppoe.so syncppp $n" 80 uci commit network 81 uci commit dhcp 82 83 fw\_wan\_list=$(uci show network |grep =interface |grep -v lan|grep -v loopback |cut -d"." -f2 | awk -F "\=" '{printf $1" "}') 84 uci set firewall.@zone\[1\].network="$fw\_wan\_list" 85 uci commit firewall 86 /etc/init.d/firewall restart 87 88 for q in $( seq 1 $number ) 89 do 90 echo 91 echo \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 92 echo 开始第$q次拔号........... 93 killall -q -SIG pppd 94 if \[ "$q" == "1" \] ; 95 then 96 for i in $( seq 1 $(($n-1))) 97 do 98 ifup $prefix$i 99 done 100 fi 101 102 echo 正在并发拔号中............. 103 echo 等待$wait秒............. 104 sleep $wait 105 106 j=$(ps | grep pppd | wc -l) 107 ! \[ "$j" -ge "$n" \] && ifup ${prefix}1 108 109 ifconfig|grep pppoe 110 j=$(ifconfig | grep pppoe-wan | wc -l) 111 112 ! \[ "$j" -ge "$ok" \] && echo \[$n\]拔\[$j\]拔成功, 小于设定的\[$ok\]拔,将重新拔号... 113 \[ "$j" -ge "$ok" \] && echo \[$n\]拔\[$j\]拔成功, 大于或等于设定的\[$ok\]拨,退出拔号... 114 115 if \[ "$j" -ge "$ok" \] ; 116 then 117 for i in $( seq 0 $(($n-1))) 118 do 119 if \[ "$i" == "0" \] ; 120 then 121 interface=wan 122 else 123 interface=$prefix$i 124 fi 125 if \[ $(ifconfig | grep "pppoe-$interface " | wc -l) == "0" \] ; 126 then 127 ifdown $interface 128 fi 129 done 130 break 131 fi 132 done 133 # kill ddns sleep and re-check wan ip change 134 killall sleep 135 136 j=$(ifconfig | grep pppoe-wan | wc -l) 137 ! \[ "$j" -ge 0 \] && reboot 138 139 #ppoename=$(ifconfig |grep 'ppoe-' |awk '{print substr($1,7)}'|tr '\\n' ' ') 140 ppoename=$(ifconfig |grep 'ppoe-' |awk '{print $1}'|tr '\\n' ' ') 141 i=0 142 vias="" 143 for wan\_ifname in $ppoename 144 do 145 vias="$vias nexthop via $wan\_ip dev $wan\_ifname weight 1 " 146 let "rt=100+$i" 147 i=$(($i+1)) 148 ip route flush table $rt 149 ip route add default via $wan\_ip dev $wan\_ifname table $rt 150 ip route add table $rt to $(ip route | grep br-lan) 151 152 if \[ $(iptables -t nat -vxnL POSTROUTING | grep -c " $wan\_ifname ") == "0" \] ; 153 then 154 iptables -t raw -A PREROUTING -i $wan\_ifname -j zone\_wan\_notrack 155 iptables -t nat -A PREROUTING -i $wan\_ifname -j zone\_wan\_prerouting 156 iptables -t nat -A POSTROUTING -o $wan\_ifname -j zone\_wan\_nat 157 iptables -t filter -A forward -i $wan\_ifname -j zone\_wan\_forward 158 iptables -t filter -A input -i $wan\_ifname -j zone\_wan 159 iptables -t filter -A zone\_wan\_ACCEPT -o $wan\_ifname -j ACCEPT 160 iptables -t filter -A zone\_wan\_ACCEPT -i $wan\_ifname -j ACCEPT 161 iptables -t filter -A zone\_wan\_DROP -o $wan\_ifname -j DROP 162 iptables -t filter -A zone\_wan\_DROP -i $wan\_ifname -j DROP 163 iptables -t filter -A zone\_wan\_REJECT -o $wan\_ifname -j reject 164 iptables -t filter -A zone\_wan\_REJECT -i $wan\_ifname -j reject 165 fi 166 iptables -A PREROUTING -t mangle -i $wan\_ifname -j MARK --set-mark $rt 167 iptables -t mangle -A zone\_wan\_MSSFIX -o $wan\_ifname -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 168 ip rule add fwmark $rt table $rt prio $rt 169 done 170 ip route del default 171 ip route add default scope global $vias 172 ip route flush cache 173 ip route list 174 route -n 175 root@OpenWrt:~#
View Code (duobo)
修订版(V0.3.1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 1 #!/bin/sh 2 #modified by muziling v0.3 3 #并发多拨脚本 4 #modified by carl v0.3.1 (修正一处bug,改善友好提示信息) 5 6 #number是重拔次数,本脚本启动后一共尝试的次数 7 #n是几拔,同时发出几拨,理论上设置越大成功概率越大! 8 #ok是拔上几次后退出拔号, 要实现的预期目标 9 #wait time 每次单线多拨失败后,重试的等待时间 10 11 number=15 12 n=7 13 ok=2 14 wait\=8 15 # avoid same with feixiang's N-WAN naming and must start with "wan" 16 prefix=wan 17 vthprefix=vth 18 19 j=$(ifconfig | grep pppoe-wan | wc -l) 20 if \[ $j -ge $ok \] ; 21 then 22 echo 已经是\[$j\]拔了,退出拔号程序。 23 exit 0 24 fi 25 26 if \[ -f /etc/config/nwannumset \] ; 27 then 28 uci set nwannumset.@macvlan\_numset\[0\].macvlan\_num=1 29 uci commit nwannumset 30 fi 31 32 for i in $( seq 1 $(($n-1))) 33 do 34 ifname=$prefix$i 35 ifvth=$vthprefix$i 36 #ifwan=$(uci get network.wan.ifname) 37 pppoe\_name=$(uci get network.wan.username) 38 pppoe\_pw=$(uci get network.wan.password) 39 40 if \[ $(ip link | grep " ${ifvth}@eth0.2:" | wc -l) == "0" \] ; 41 then 42 macfac=$(ifconfig | grep eth0.2 | tr -s " " | cut -d " " -f5 | cut -b 1\-8) 43 mac="$macfac:"$(md5sum /proc/sys/kernel/random/uuid | sed 's/\\(..\\)/&:/g' | cut -b 1\-8 | tr \[a-f\] \[A-F\]) 44 ip link add link eth0.2 $ifvth type macvlan 45 ifconfig $ifvth hw ether $mac 46 echo 更换MAC完毕$ifvth. 47 fi 48 49 # add /etc/config/network 50 uci delete network.$ifname 51 uci set network.$ifname=interface 52 uci set network.$ifname.ifname=$ifvth 53 #uci set network.$ifname.\_orig\_ifname=eth0.2 54 #uci set network.$ifname.\_orig\_bridge=false 55 uci set network.$ifname.proto=pppoe 56 uci set network.$ifname.username=$pppoe\_name 57 uci set network.$ifname.password=$pppoe\_pw 58 uci set network.$ifname.auto=0 59 uci set network.$ifname.defaultroute=0 60 uci set network.$ifname.peerdns=1 61 uci set network.$ifname.pppd\_options="plugin rp-pppoe.so syncppp $n" 62 63 # add /etc/config/dhcp 64 uci delete dhcp.$ifvth 65 uci set dhcp.$ifvth=dhcp 66 uci set dhcp.$ifvth.interface=$ifname 67 uci set dhcp.$ifvth.ignore=1 68 69 if \[ -f /etc/config/nwan \] ; 70 then 71 uci delete nwan.$ifname 72 uci set nwan.$ifname=interface 73 uci set nwan.$ifname.name=unicom 74 uci set nwan.$ifname.route=balance 75 uci set nwan.$ifname.weight=1 76 uci set nwan.$ifname.uptime\=0day,0hour,0min 77 uci commit nwan 78 fi 79 done 80 81 uci set network.wan.defaultroute=0 82 uci set network.wan.peerdns=1 83 uci set network.wan.pppd\_options="plugin rp-pppoe.so syncppp $n" 84 uci commit network 85 uci commit dhcp 86 87 fw\_wan\_list=$(uci show network |grep =interface |grep -v lan|grep -v loopback |cut -d"." -f2 | awk -F "\=" '{printf $1" "}') 88 uci set firewall.@zone\[1\].network="$fw\_wan\_list" 89 uci commit firewall 90 /etc/init.d/firewall restart 91 92 for q in $( seq 1 $number ) 93 do 94 echo 95 echo \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 96 echo 开始第$q次拔号........... 97 killall -q -SIG pppd 98 if \[ "$q" == "1" \] ; 99 then 100 for i in $( seq 1 $(($n-1))) 101 do 102 ifup $prefix$i 103 done 104 fi 105 106 echo 正在并发拔号中............. 107 echo 等待$wait秒............. 108 sleep $wait 109 110 j=$(ps | grep pppd | wc -l) 111 ! \[ "$j" -ge "$n" \] && ifup ${prefix}1 112 113 ifconfig | grep pppoe 114 j=$(ifconfig | grep pppoe-wan | wc -l) 115 116 ! \[ "$j" -ge "$ok" \] && echo \[$n\]拔\[$j\]拔成功, 小于设定的\[$ok\]拔,将重新拔号... 117 \[ "$j" -ge "$ok" \] && echo \[$n\]拔\[$j\]拔成功, 大于或等于设定的\[$ok\]拨,退出拔号... 118 119 if \[ "$j" -ge "$ok" \] ; 120 then 121 for i in $( seq 0 $(($n-1))) 122 do 123 if \[ "$i" == "0" \] ; 124 then 125 interface=wan 126 else 127 interface=$prefix$i 128 fi 129 if \[ $(ifconfig | grep "pppoe-$interface " | wc -l) == "0" \] ; 130 then 131 ifdown $interface 132 fi 133 done 134 break 135 fi 136 done # done/tried all tring times $number 137 138 # kill ddns sleep and re-check wan ip change 139 killall sleep 140 141 # reboot the machine if failed tried times 142 #sleep $wait 143 j=$(ifconfig | grep pppoe-wan | wc -l) 144 ! \[ "$j" -gt 0 \] && reboot 145 146 147 echo \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 148 echo 开始N-WAN负载均衡功能... 149 #ppoename=$(ifconfig |grep 'ppoe-' |awk '{print substr($1,7)}'|tr '\\n' ' ') 150 ppoename=$(ifconfig|grep 'ppoe-' |awk '{print $1}'|tr '\\n' ' ') 151 i=0 152 vias="" 153 for wan\_ifname in $ppoename 154 do 155 vias="$vias nexthop via $wan\_ip dev $wan\_ifname weight 1 " 156 let "rt=100+$i" 157 i=$(($i+1)) 158 ip route flush table $rt 159 #REMOVE ERROR 160 ip route add default via $wan\_ip dev $wan\_ifname table $rt 161 ip route add table $rt to $(ip route | grep br-lan) 162 163 if \[ $(iptables -t nat -vxnL POSTROUTING | grep -c " $wan\_ifname ") == "0" \] ; 164 then 165 #REMOVE ERROR 166 iptables -t raw -A PREROUTING -i $wan\_ifname -j zone\_wan\_notrack 167 iptables -t nat -A PREROUTING -i $wan\_ifname -j zone\_wan\_prerouting 168 #REMOVE ERROR 169 iptables -t nat -A POSTROUTING -o $wan\_ifname -j zone\_wan\_nat 170 iptables -t filter -A forward -i $wan\_ifname -j zone\_wan\_forward 171 #REMOVE ERROR 172 iptables -t filter -A input -i $wan\_ifname -j zone\_wan 173 iptables -t filter -A zone\_wan\_ACCEPT -o $wan\_ifname -j ACCEPT 174 iptables -t filter -A zone\_wan\_ACCEPT -i $wan\_ifname -j ACCEPT 175 iptables -t filter -A zone\_wan\_DROP -o $wan\_ifname -j DROP 176 iptables -t filter -A zone\_wan\_DROP -i $wan\_ifname -j DROP 177 iptables -t filter -A zone\_wan\_REJECT -o $wan\_ifname -j reject 178 iptables -t filter -A zone\_wan\_REJECT -i $wan\_ifname -j reject 179 fi 180 181 iptables -A PREROUTING -t mangle -i $wan\_ifname -j MARK --set-mark $rt 182 iptables -t mangle -A zone\_wan\_MSSFIX -o $wan\_ifname -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 183 ip rule add fwmark $rt table $rt prio $rt 184 done 185 186 ip route del default 187 188 echo \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 189 echo 下面执行ip route add default scope global $vias 190 ip route add default scope global $vias 191 192 ip route flush cache 193 194 echo \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 195 echo 下面输出ip route list 196 ip route list 197 198 echo \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 199 echo 下面输出route -n 200 route -n
参考文献
OpenWrt For AR71xx系列 ar2 Tr 脱机 N-WAN r48549
自己动手 4530R 脱机 Samba U-BOOT 多拨(11-04更新部分问题说明,请看2楼)
[0916更新]WR703N WR720N 及其他各类 OpenWRT类路由实现一号多拨带宽叠加教程
个性化需求沟通 扫客服加V加群: