返回列表 回复 发帖

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

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=&quot"
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=&quot"
15               fi
16        else
17               if [ "$active" = &quot" ]; 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 程序
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
返回列表
开源邮件服务器 开源邮件服务器 web 开源邮件 开源 mail 开源 邮件服务器 邮件技术 mail技术 反垃圾邮件 反垃圾mail mail投递
邮件服务器 mail服务器 开源软件 mail软件 mail服务新品牌 开源邮件服务新品牌
开源mail服务新网站 邮件服务新品牌 mail tmail mailserver 163邮件 sendmail |Linux维护|Linux代维|成都Linux维护|成都Linux代维