Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18925906
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: BSD

2008-04-08 10:29:55

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
1314 行,如果值非 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) |
给主人留下些什么吧!~~