Description :
現今企業對網路的依賴度幾乎到達不可或缺的程度,當網路一斷線時可說幾乎是完全停擺,許多事情都不能做了,而以目前台灣的網路環境來說還是不能確保用戶無斷線之憂,畢竟網路是透過實體線路一個點一個點串起來的,而當中若有任何一個點出現狀況時,就不難避免斷線,既然會有斷線危機,我們何不多花一點錢再拉一條其它固網的 ADSL 來當備援即可減低斷線風險,目前台灣 ADSL 價格已經非常便宜,因此多拉一條線路來當備援即可降低斷線的風險有何不可呢?
這是小弟在網路上找的 shell script 自行修改後使用在 FreeBSD + PF+ NAT 環境,還蠻實用的,採用 ping 的回應方式來確認主要線路是否斷線,一但斷線就馬上切換到備援線路上,如果主要線路恢復正常後也會再切回主要線路。
Environment :
硬體:i386 PC Intel P3 500
記憶體網卡:512M RAM
作業系統:FreeBSD 6.0 Release
網路卡三片:xl0 vr0 兩片對外 de0 一片對內
Drawing :
gatewayP:210.xx.xx.254 xl0:210.xx.xx.8 de0:10.77.77.254
gatewayS:61.xx.xx.254 vr0:61.xx.xx.6
Setp 1.
先架設 FreeBSD + NAT + PF firewall,Kernel 編譯的部份我就不再說明,請參考我之前寫過的 FreeBSD 5.3 Release PF 初體驗 基本環境啟動後,接下來設定這台機器的環境需要。
#vi /etc/rc.conf # 設定開機自動啟動檔,注意 getway_enable="YES" 一定要開啟,我們在下 route 切換時才會即時生效
defaultrouter="210.xx.xx.254"
hostname="NAT.ntut.idv.tw"
ifconfig_xl0="inet 210.xx.xx.8 netmask 255.255.255.0"
ifconfig_vr0="inet 61.xx.xx.6 netmask 255.255.255.0"
ifconfig_de0="inet 10.77.77.254 netmask 255.255.255.0"
gateway_enable="YES"
sshd_enable="YES"
pf_enable="YES"
dhcpd_enable="YES"
inetd_enable="YES"
#vi /etc/pf.conf # 這邊是設定防火牆 rule 跟 NAT rule 的檔,我們同時設定兩個 WAN port 都可為 LAN 做 NAT。
ext_if="xl0"
ext2_if="vr0"
int_if="de0"
#
nat on $ext_if from $int_if:network to any -> ($ext_if)
nat on $ext2_if from $int_if:network to any -> ($ext2_if)
rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
#
pass in all
pass out all
#vi /etc/sysctl.conf # 開啟 NAT 的 IP Forwarding 環境。
net.inet.ip.forwarding=1
net.inet.ip.fastforwarding=1
#vi /etc/inetd.conf # 打開 ftp 的替代 port 如此 NAT 內部才能對外使用 ftp 抓東西。
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy
Setp 2.
#vi /usr/local/sbin/change_route.sh # 開始編寫這支斷線自動偵測的 shell script ,取個名字叫 change_route.sh。
01 #!bin/sh
02
03 dnsserverP="168.95.1.1"
04 gatewayP="210.xx.xx.254"
05 gatewayS="61.xx.xx.254"
06
07 active="P"
08 while [ 1 ]; do
09 response="`/sbin/ping -c 1 $dnsserverP | grep from`"
10 if [ "$response" ]; then
11 if [ "$active" = "S" ]; then
12 route delete -net 0.0.0.0
13 route add -net 0.0.0.0 -gateway $gatewayP
14 active="P"
15 fi
16 else
17 if [ "$active" = "P" ]; then
18 route delete -net 0.0.0.0
19 route add -net 0.0.0.0 -gateway $gatewayS
20 active="S"
21 fi
22 fi
23 sleep 3
24 done
程式說明:
前面行號為自行加入的行號,這些行號與程式碼無關所以使用時請去除。
01 定義 shell 的路徑
03~05 自行定義 IP 的變數值
03 是 hinet 的 DNS ip
04 是 hinet ADSL 給的 IP 閘道
05 是 TFN ADSL 給的 IP 閘道
07 給一個 P 的值
08 採用 while 做無限迴圈
09 ping 得通收到 from 就直接跳到 23 行 sleep 3,否則執行第 10~11 行
11 這邊再做一次判斷 active 值如果 = S 就執行 12、13、14 行,如果值非 S 就跳到 17 行
17 再做一次判斷若 active = P 就執行 18、19、20 行 23 停 3 秒
24 重回迴圈
#chmod 755 /usr/local/sbin/change_route.sh # 更改為可執行程式
#vi /usr/local/etc/rc.d/change_route.sh # 加入開機自動讓 change_route.sh 自動在背景跑的啟動檔
sh /usr/local/sbin/change_route.sh &
Setp 3.
也可以手動測試 change_route.sh 程式是否順利進行
#sh -x /usr/local/sbin/change_route.sh # -x 是讓程式運轉時 show 到螢幕上,你可以 debug 程式
阅读(561) | 评论(0) | 转发(0) |