双WAN脚本

#!/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 一次規則。

基本上路由腳本和防火牆腳本是分開撰寫的,以方便維護和除錯。這部份若有興趣在說,我可以提供防火牆腳本檔下載(因為太長了破千行,用貼的不適合)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值