500u单线多WAN
#!/bin/ash
# load-balance(X-WAN) Script VER 0.23 by rightzd 20110902 | 单线X W AN版
# 使用方法:
# 双W AN接口模式选择为“单物理口双W AN”, 双W AN模式选择为“自定义脚本”并把本脚本内容粘贴进去,W AN2路由表选择为自定义并保持内容为空
# iptables -t nat -I POSTROUTING -o ppp+ -j MASQUERADE这句放在系统管理->脚本设置->防火墙脚本里
# 一般只需要修改USER, PASSWD, W ANNUM这3个参数就可以
# WAN1, W AN2是固件自动拨号的,从W AN3起由脚本负责拨号。WAN1,W AN2的指定出口功能有效,不过如果修改设置后请重启路由器。
LOGGER=logger
LOCK_FILE=/var/policyroute-set.lock
XW AN_OK=/var/xwan_ok
NETLIST=/var/policyroute-netlist
#宽带用户名和密码
USER="test"
PASSWD="123456"
#榨干你的线路,修改这个参数为线路允许的多拨次数
WANNUM=4
MTU=$(nvram get wan_mtu)
MACBASE=$(nvram get wan_hwaddr)
#对MAC进行递增,注意跨度不要太大,目前只支持最后两位的递增
MACINC() {
mac=$1
value=$2
b1=`printf "%d" 0x${mac:0:2}`
b2=`printf "%d" 0x${mac:3:2}`
b3=`printf "%d" 0x${mac:6:2}`
b4=`printf "%d" 0x${mac:9:2}`
b5=`printf "%d" 0x${mac:12:2}`
b6=`printf "%d" 0x${mac:15:2}`
let x=$b6+$value
let b6=$((x%255))
let b5=b5+$((x/255))
let x=b5
let b5=$((x%255))
let b4=b4+$((x/255))
NEWMAC=`printf "%x:%x:%x:%x:%x:%x" ${b1} ${b2} ${b3} ${b4} ${b5} ${b6}`
}
#进行一个PPPoE拨号
PPPOE() {
iface=$1
let ipparam=$2-1
$(pppoecd $iface -u $USER -p $PASSWD -r $MTU -t $MTU -P $ipparam) }
#激活一个W AN口,参数类型是数字,如IFUP 3表示激活W AN3
IFUP() {
parent=$1
iface="veth"$2
ip link add link $parent $iface type macvlan
MACINC $MACBASE $2
ifconfig $iface hw ether $NEWMAC up
PPPOE $iface $2
}
IFDOWN() {
parent=$1
iface="veth"$2
ip link del link $parent $iface type macvlan
}
ALLIFUP() {
wanid=3
while [ $wanid -le $WANNUM ]
do
IFUP vlan1 $wanid
let wanid=wanid+1
done
}
ALLIFDOWN() {
wanid=3
while [ $wanid -le $WANNUM ]
do
IFDOWN vlan1 $wanid
let wanid=wanid+1
done
}
GET_PPP_GATEW AY() {
iface=$1
echo "iface="$iface
PPP_IP=$(ifconfig $iface|grep "inet addr"|awk -F ":" '{print $2}'|awk -F " " '{print $1}')
PPP_GATEW AY=$PPP_IP
}
SET_FIXED_ROUTE() {
wanid=$1
rtbl=${wanid}00
$LOGGER "set fixed route via WAN${wanid}..."
if [ -f $NETLIST ]; then
MY_LINE_NO=1
while read MY_LINE
do
ip rule add to $MY_LINE table $rtbl prio 200
MY_LINE_NO=$((MY_LINE_NO+1))
done < $NETLIST
fi
}
BUILD_WAN_ROUTETAB() {
wanid=$1
$LOGGER "set WAN${wanid} route table ..."
rtbl=${wanid}00
if [ "$wanid" == "1" ]; then
prefix="wan"
else
prefix="wan"${wanid}
fi
WAN_GATEW AY=$(nvram get ${prefix}_gateway)
WAN_IFACE=$(nvram get ${prefix}_iface)
WAN_IP=$(ifconfig $WAN_IFACE|grep "inet addr"|awk -F ":" '{print $2}'|awk -F " " '{print $1}')
WAN_WEIGHT=$(nvram get xwan_wan${wanid}_weight)
if [ "$WAN_IP" == "" ]; then
$LOGGER "Start PolicyRouting fail, BUILD_WAN_ROUTETAB, WAN${wanid} NO IP"
return
fi
ip route flush table $rtbl
ip route | while read ROUTE
do
if [ ! "${ROUTE:0:7}" = "default" ]; then
ip route append table $rtbl to $ROUTE
fi
done
ip route replace table $rtbl default via $WAN_GATEW AY dev $WAN_IFACE src $WAN_IP
#设置ip rule
ip rule add from $WAN_IP table $rtbl prio 100
# DNS Rule
WAN_GET_DNS=$(nvram get ${prefix}_dns)
if [ "$WAN_GET_DNS" = "" ]; then
WAN_GET_DNS=$(nvram get ${prefix}_get_dns)
fi
for WAN_DNS in $W AN_GET_DNS
do
$LOGGER "set WAN${wanid} route($WAN_GATEW AY) for DNS:$W AN_DNS"
if [ ! "$WAN_DNS" = "0.0.0.0" ]; then
ip rule add to $W AN_DNS table $rtbl prio 150
fi
done
}
SET_ASSIGNOUT_RULE() {
#8. AssignOUT 规则
# wan1
ip rule add fwmark 0x100/0xf00 table 100 prio 110
# wan2
ip rule add fwmark 0x200/0xf00 table 200 prio 110
}
SET_PPTP_RULE() {
# PPTP DNS Rule
USE_PEERDNS=$(nvram get pptp_client_peerdns)
if [ "$USE_PEERDNS" = "1" ]; then
PPTP_GET_DNS=$(nvram get pptp_client_get_dns)
for PPTP_DNS in $PPTP_GET_DNS
do
if [ ! "$PPTP_DNS" = "0.0.0.0" ]; then
ip rule add to $PPTP_DNS table 250 prio 149
fi
done
fi
}
BUILD_ROUTE_LB() {
$LOGGER "set default router with load-balance"
pppid=0
lbstr="ip route replace default scope global "
while [ $pppid -le $WANNUM ]
do
pppif=ppp$pppid
GET_PPP_GATEW AY $pppif
if [ "$PPP_GATEW AY" != "" ]; then
lbstr="$lbstr nexthop via $PPP_GA TEW AY dev $pppif"
fi
ip route delete default
let pppid=pppid+1
done
echo $lbstr
$lbstr
$LOGGER "clear route cache..."
ip route flush cache
}
$LOGGER "Start PolicyRouting ..."
if [ -f $XWAN_OK ]; then
BUILD_ROUTE_LB
$LOGGER "Start PolicyRouting exit, XW AN_OK."
exit
fi
if [ -f $LOCK_FILE ]; then
$LOGGER "Start PolicyRouting exit, other process starting."
exit
fi
echo "SETTING" > $LOCK_FILE
$LOGGER "disable rp_filter "
echo '0' >/proc/sys/net/ipv4/conf/all/rp_filter
if [ "$1" = "" ]; then
ALLIFUP
else
ALLIFDOWN
fi
sleep 10
#1. set ip rules
ip rule flush
ip rule del table main
ip rule del table default
ip rule add lookup main prio 32766
ip rule add lookup default prio 32767
#2. 设置走WAN1的静态路由(路由表来自网页设置"WAN2"自定义路由表) SET_FIXED_ROUTE 1
#3. 设置每个W AN口的路由表
wanid=1
while [ $wanid -le 2 ]
do
BUILD_WAN_ROUTETAB $wanid
let wanid=wanid+1
done
SET_ASSIGNOUT_RULE
SET_PPTP_RULE
BUILD_ROUTE_LB
$LOGGER "Start PolicyRouting success."
echo "OK" > $XW AN_OK
rm $LOCK_FILE