您的位置:首页 > 其它

转载:FreeBSD NAT 上接两条ADSL 若断线时自动侦测切换路由

2010-09-04 19:54 477 查看
FreeBSD NAT 上接兩條 ADSL 若斷線時自動偵測切換路由

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 程式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nat freebsd 休闲