linux 双WAN负载均衡
kevin.Zhu 发布于:2013-2-3 12:39 分类:Linux 有 20 人浏览,获得评论 0 条
http://zcm8483.blog.163.com/blog/static/38866452012111363324134/
#!/bin/sh
## "#" 号之后的内容为批注, 执行时不会有作用
# ===========================================================================
# 双 WAN 线路分流,路由规则 script v1.0 最后修改日期:2006-10-19
# 环境:基本三片网卡,对外线路1 (EXT)、对外线路2 (EXT2) 、对内 (LAN)
# 功能:双 WAN 多重路由自动设定
# 测试可运作环境为 Fedora、CentOS,其它 distro 不挂保证
# 建议档名:mroute.sh,权限:700,拥有者:root:root
# 建议存放位置:/usr/local/bin,并将其写入 /etc/rc.local 以便一开机即执行
# ===========================================================================
# 使用说明:
# 1.预设使用 table 100、200,请确定这两个 RPDB 表没有使用到
# 2.此 script 不会自动拨接,若使用 ppp 联机,请确定执行此 script 前,已经设定好 rp-pppoe 服务
# 版本演进:
# v1.0 基本版
# =====================================================================================
# 变量设定区
# =====================================================================================
# 您必须设定相关变量的值,这个 script 才会生效
# 线路一
# EXT1_TYPE=线路型态,可用的两个选项 (小写):static (固定 IP)、ppp (拨接取得)
# EXT1_IF=代表线路的网卡接口,若为 ppp,则为 ppp0....
# EXT1_IP=线路的 IP,若为 ppp,则会自动取得,此处省略
# EXT1_GW=线路的网关 IP,若为 PPP,则会自动取得,此处省略
# EXT1_WEIGHT=线路权重,指该线路的使用量比率,数字愈高使用愈频繁
EXT1_TYPE="ppp"
EXT1_IF="ppp0"
EXT1_IP=""
EXT1_GW=""
EXT1_WEIGHT="5"
# 线路二
EXT2_TYPE="static"
EXT2_IF="eth1"
EXT2_IP="11.22.33.44"
EXT2_GW="11.22.33.44"
EXT2_WEIGHT="1"
# =====================================================================================
# 程序区
# =====================================================================================
# 以下至文件尾为止,为指令稿的运作程序代码, 如果对于 shell script 不太熟悉, 建议您不要随意更动
# 如果线路其中之一,是 ppp 联机
[ "$EXT1_TYPE" = "ppp" ] && PPP="1"
[ "$EXT2_TYPE" = "ppp" ] && PPP="1"
# 检查是否有 ppp 联机,若无,程序结束 (例外错误)
if [ "$PPP" = "1" ]; then
if ! ip address ls | grep ppp > /dev/null; then
echo "ppp0 is down!"
exit 1
fi
fi
# 双 WAN 的路由 table 分别使用 100、200
for i in 100 200 ; do
# 转换局部变量
if [ "$i" = "100" ]; then
TYPE="$EXT1_TYPE"
IP="$EXT1_IP"
GW="$EXT1_GW"
else
TYPE="$EXT2_TYPE"
IP="$EXT2_IP"
GW="$EXT2_GW"
fi
# 判断线路型态,依照型态执行专属程序区段
if [ "$TYPE" = "static" ]; then
# 清除 table,以避免重复执行时,显示错误
ip rule del from $IP table $i 2>/dev/null
ip route del table $i 2>/dev/null
# 设定固定 IP 线路的相关 rule 与 table
ip route replace default via $GW table $i
ip rule add from $IP table $i
# 重新定义网关,给稍后设定多重路由时使用
[ "$i" = "100" ] && EXT1_GW_S="$GW"
[ "$i" = "200" ] && EXT2_GW_S="$GW"
else
# 因为 ppp 每次取得的 IP 或网关,可能都不相同,所以必须用程序判断
# 秀出目前 route 表,用 awk 搜寻含有 ppp0.src 的字符串,取第 1、9 个字符串
ppp0_gw=`ip route ls | awk '/ppp0.*src/ {print $1}'`
ppp0_ip=`ip route ls | awk '/ppp0.*src/ {print $9}'`
# 清除 table,以避免重复执行时,显示错误
ip rule del from $ppp0_ip table $i 2>/dev/null
ip route del table $i 2>/dev/null
# 设定 ppp 线路的相关 rule 与 table
ip route replace default via $ppp0_gw table $i
ip rule add from $ppp0_ip table $i
# 重新定义网关,给稍后设定多重路由时使用
[ "$i" = "100" ] && EXT1_GW_S="$ppp0_gw"
[ "$i" = "200" ] && EXT2_GW_S="$ppp0_gw"
fi
done
# 设定预设网关,多重路由关键
ip route replace default \
nexthop via $EXT1_GW_S dev $EXT1_IF weight $EXT1_WEIGHT \
nexthop via $EXT2_GW_S dev $EXT2_IF weight $EXT2_WEIGHT
# 清除路由快取,使设定立刻生效
ip route flush cache
# 显示设置完成之讯息
echo
echo "Multiple Routing set OK!"
echo
说明:
1.这个 shell script 需要修改里头变量的参数才能运作,如何修改批注都有说明。
2.看了一下,好像只支持一条 ppp 联机,原因是在抓 ppp 联机的 ip 时,只会去找 ppp0。两条线会有 ppp1,如果要用两条都 ppp,可能要自行稍微修改一下程序代码。
3.Multiple Routing 实际上可以很多条线路,例如 4线、8线、32线....不过这个 shell shell 范例只支持 2线。
若要支持更多线路,建议去了解 ip 指令如何使用,就可以自己写指令了。
4.这支脚本只处理 Multiple Routing 的部份,不会去自动拨接 PPPoE,要执行此脚本前,需先拨接上。
5.这支脚本也不处理 iptables 防火墙的部份 (包括 NAT),Multiple Routing 双线路以上的防火墙,其脚本会较一条线的来的复杂很多,原因是每条线都要 run 一次规则。
基本上路由脚本和防火墙脚本是分开撰写的,以方便维护和除错。这部份若有兴趣在说,我可以提供防火墙脚本档下载(因为太长了破千行,用贴的不适合)。