[FreeBSD] ADSL、光纖撥號取得固定 IP

新牽的光纖因為不支援 DHCP 連線,所以就改成 ppp 撥號連線。不過由於常常斷線,ddial 模式用起來也怪怪的,所以另外加上斷線重連的功能。
O.S.:FreeBSD 7.1 release

原本 DHCP 連線的設定檔:

  1. 只要設定好 /etc/rc.conf 就可以上網了
  2. ifconfig_re0="DHCP"     # 表示你的網卡是 re0

改成可以撥號連線:

  1. 設定 /etc/rc.conf
  2. 因為要配合斷線重連的功能,所以就只要刪除 ifconfig_re0="DHCP" 這一行就可以了(也就是 /etc/rc.conf 不用特別設定)。

  3. 設定 /etc/ppp/ppp.conf
  4. default:
     set log Phase tun command
    seednet:
     set device PPPoE:re0   # 表示你的網卡是 re0
     set dial
     set timeout 0
     enable dns
     set login
     set mru 1492
     enable lqr
     set authname seednet\#   # 輸入撥號帳號(因為 seednet 取得固定 IP 要加"#",所以前面加個"\"跳脫字元)
     set authkey seednet      # 輸入撥號密碼
  5. 新增 /usr/local/etc/rc.d/ppp.sh
  6. 主要目的是區分 start 跟 restart 的方式(本身還都是用 ddial 的模式撥號)。Start 會順便啟動 pf,若是斷線重連就只用 restart(刪掉原本的連線,再重新連線)。

    #! /bin/sh
    #
    # PPPoe
    #
    # Created by denniswave at 2009/03/28
    set -e
    case "$1" in
      start)
            echo "Starting PPPoE..."
            /usr/sbin/ppp -ddial seednet
            echo "Start PPPoE done!!!"
            /sbin/pfctl -f /etc/pf.conf
            ;;
      stop)
            echo -n "Stopping PPPoE..."
        PPPPID=`cat /var/run/tun*.pid`
            kill -9 $PPPPID
            echo "done!!!"
            ;;
      restart|force-reload)
            $0 stop
            sleep 5s
            echo "Starting PPPoE..."
            /usr/sbin/ppp -ddial seednet
            echo "Restart PPPoE done!!!"
            ;;
      *)
            N=/etc/init.d/$NAME
            echo "Usage: $N {start|stop|restart|force-reload}" >&2
            exit 1
            ;;
    esac
    exit 0
  7. 新增 shell script
  8. 目的是偵測網路連線狀態(利用 fping),如果斷線,就 restart。然後放在 crontab 看你要多久執行一次都可以。

    #! /bin/sh
    #
    # ADSL disconnect redial script
    #
    # By denniswave
    #
    # V1.0  20090422 First Version
    datevar=`date "+%Y-%m-%d %H:%M:%S"`
    checkonline1=`/usr/local/sbin/fping tw.yahoo.com`   # 測試與 yahoo 的連線
    checkonline2=`/usr/local/sbin/fping 140.116.250.3`  # 測試與成大的連線(用IP)
    if [ "$checkonline1" = "tw.yahoo.com is alive" ] ; then
    echo "$datevar: $checkonline1 -- The VDSL is connected." >> /var/log/pppredial.log
    exit
    else
    if [ "$checkonline2" = "140.116.250.3 is alive" ] ; then
    echo "$datevar: $checkonline2 -- The VDSL is connected, but DNS maybe failed." >> /var/log/ppp.log
    tail -1 /var/log/pppredial.log > /tmp/tempmessage
    mail -s "光纖的 DNS 怪怪的喔~~~" root < /tmp/tempmessage
    exit
    else
    echo "$datevar: [Error] Yahoo & $checkonline2 -- The VDSL is disconnected." >> /var/log/ppp.log
    /usr/local/etc/rc.d/ppp.sh restart >> /var/log/pppredial.log
    tail -11 /var/log/pppredial.log > /tmp/tempmessage
    mail -s "光纖又掛囉~~~XD" root < /tmp/tempmessage
    fi
    fi
Please follow and like us:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *