【教學】自動重撥 PPPoE ADSL 連線 (For Linux & FreeBSD)

第 1 頁,共 2 頁 1 2 末頁末頁
顯示結果從第 1 筆 到 10 筆,共計 18 筆
  1. #1
    會員
    註冊日期
    2002-01-01
    討論區文章
    19

    【教學】自動重撥 PPPoE ADSL 連線

    不管是 Linux 或是 BSD 下所使用的 PPPoE 撥號程式,在遇到很多奇怪的斷線狀況似乎並不能很自動的自己重撥,所以我寫了這個 Script , 相信很多人都用的上.

    星期六, 三月 19, 2005
    FreeBSD 的 PPPoE ADSL 斷線自動重撥

    不管是 Linux 或是 BSD 下所使用的 PPPoE 撥號程式,在遇到很多奇怪的斷線狀況似乎並不能很自動的自己重撥,所以我寫了這個 Script , 相信很多人都用的上.

    因為後來新版的 Perl 對 system/exec 等指令的傳回值處理方式似乎已經不同,最好的偵測方式是用 Perl Module,而不是呼叫系統指令,所以需要先裝 Net::Ping::External

    用 CPAN 來安裝的話請依照以下步驟 ( CPAN 還沒設定過的請先設定):

    perl -MCPAN -e shell

    cpan shell -- CPAN exploration and modules installation (v1.7601)
    ReadLine support enabled

    cpan> install Net::Ping::External

    裝好用就可以使用下面這個 script . 我使用的環境是 FreeBSD , 如果不是這個環境請自行修裡面有用到的系統指令的路徑,還有修改 $PPPoE_command 變數.

    在跟 PC Zone 阿土站長 討論過以後,我稍微改了一下程式並附上我自己的 ppp.conf
    不使用 killall 來砍掉 ppp 的 pid 是顧慮到這個 command 在 Linux 可能沒有,所以我採用比較傳統的方式處理.

    -------------------------------------------------------------
    以下是我的 /etc/ppp.conf 內容 (參考 FreeBSD Handbook):


    default:set log Phase tun command # you can add more detailed logging if you wishset ifaddr 10.0.0.1/0 10.0.0.2/0hinet:set device PPPoE:rl0set authname 你的帳號@hinet.netset authkey 你的密碼set dialset loginadd default HISADDRnat enable yes
    啟動 PPPoE 的方式我是建議寫在 /etc/rc.local ,加上一行:

    /usr/sbin/ppp -ddial hinet

    ---------------------------------------------------------
    以下為 Script 內容:
    ##############################################
    #!/usr/local/bin/perl

    $|=1;

    #=============================================
    # Programming by Dekuo Kuo in 2005/02/13
    # http://www.dekuo.com/
    #
    # This script is running on FreeBSD.
    # When you run it on other Unix like OS,
    # modify below variable $PPPoE_command and
    # system command path used in this script

    $PPPoE_command = '/usr/sbin/ppp -ddial hinet';
    #=============================================


    if (ping_basic('168.95.1.1') != 1 && ping_basic('192.72.80.36') != 1) {
    $pid_reference = get_pid("$PPPoE_command");
    print "ADSL Link Down\n";

    foreach $pid (@$pid_reference) {
    print "Kill pid=$pid ...\n";
    system("/bin/kill $pid") if $pid != '';
    }

    system("$PPPoE_command");
    system("/bin/date >> /var/log/check_pppoe.log");
    } else {
    print "ADSL Link Up\n";
    }

    sub get_pid {
    $process_string = $_[0];
    $process_string = "\'" . $process_string . "\'";
    @ps_data = grep {!/grep/} `ps -ax | grep $process_string`;

    my @pid_list;
    foreach (@ps_data) {
    @ps_line = grep { $_ ne ''} split(/\s+/,$_);
    push(@pid_list,$ps_line[0]);
    }

    return \@pid_list;
    }

    sub ping_basic {
    use Net::Ping::External qw(ping);
    my $device_ipv4 = $_[0];
    my $alive = ping(hostname => "$device_ipv4", timeout => 5, count => 5, size => 1024);
    return $alive;
    }
    ##############################################

    最後 ,當然不要忘了在 crontab 裡加一行 ... 大概 5 分鐘檢查一次應該夠了

    crontab 範例 (當然要先建立 /root/script 這個目錄) :
    */5 * * * * /root/script/check_pppoe.pl


    如果您用的是 FreeBSD 5.x 的版本, 請在 crontab 最上面放下面這兩行敘述:
    SHELL=/bin/tcsh
    PATH=/etc:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

    否則會讓 perl 找不到相關 module

    也就是說,如果您用的是 FreeBSD 5.x 以上的版本, 您的 crontab 內容就必須是這樣:
    SHELL=/bin/tcsh
    PATH=/etc:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
    */5 * * * * /root/script/check_pppoe.pl

    為什麼 FreeBSD 5.x 不能夠使用 /etc/crontab 的 Shell 參數,這點我還不明白,如果有人瞭解的還請麻煩留言告知

    另外, 如果有人在 Linux 環境下使用, 也請告訴我, 我想知道 Linux 下的 Command 路徑有沒有變


    此文章於 2006-12-13 05:52 PM 被 阿 土 編輯。

  2. #2
    校長兼撞鐘 阿 土 的大頭照
    註冊日期
    2000-10-09
    所在地區
    SEEDNET 8M
    討論區文章
    11,817
    這幾天找了不少 PPPoE in FreeBSD 的資料 (ppp / mpd)
    但很少看到有人討論到斷線重連部分
    dekuo 的這篇教學剛好可以拿來研究一下 , Thanks!

  3. #3
    會員
    註冊日期
    2002-01-01
    討論區文章
    19
    最初由 阿 土 發表
    這幾天找了不少 PPPoE in FreeBSD 的資料 (ppp / mpd)
    但很少看到有人討論到斷線重連部分
    dekuo 的這篇教學剛好可以拿來研究一下 , Thanks!
    我查過 ppp 的 Man page 說明, -ddial 應該就是會一直保持連線的參數,
    但是我還是發現會有斷線沒自動重撥的現象 ... 所以不管我的 script 是否多此一舉(或許有更正確的系統設定方式?) ,但是至少可以保證用了之後必定能夠自動重撥 .... 但是 ATU-R 當掉的大概就沒辦法了 ..

  4. #4
    校長兼撞鐘 阿 土 的大頭照
    註冊日期
    2000-10-09
    所在地區
    SEEDNET 8M
    討論區文章
    11,817
    最初由 dekuo 發表
    我查過 ppp 的 Man page 說明, -ddial 應該就是會一直保持連線的參數,
    但是我還是發現會有斷線沒自動重撥的現象 ... 所以不管我的 script 是否多此一舉(或許有更正確的系統設定方式?) ,但是至少可以保證用了之後必定能夠自動重撥 .... 但是 ATU-R 當掉的大概就沒辦法了 ..
    沒錯 , 這幾天測試下來 ppp 當斷線時有時並不會自動重撥
    使用您這個 script 測幾天看看

    我用 ppp 撥接上 ftp.nsysu.edu.tw 抓幾百 MB 的 ISO 檔
    隨著抓取檔案的速度越來越快 , ppp 的 cpu usage 也持續爬升
    改用 mpd 撥接後 , cpu usage 比 ppp 少了許多
    不過不知為何 , 有時會發生無法撥上線的狀況 , 所以還是改回 ppp 撥接
    因為以上傳為主的 SERVER , 其 ppp 的 usage 並不會太高

  5. #5
    會員
    註冊日期
    2002-01-01
    討論區文章
    19
    最初由 阿 土 發表
    沒錯 , 這幾天測試下來 ppp 當斷線時有時並不會自動重撥
    使用您這個 script 測幾天看看

    我用 ppp 撥接上 ftp.nsysu.edu.tw 抓幾百 MB 的 ISO 檔
    隨著抓取檔案的速度越來越快 , ppp 的 cpu usage 也持續爬升
    改用 mpd 撥接後 , cpu usage 比 ppp 少了許多
    不過不知為何 , 有時會發生無法撥上線的狀況 , 所以還是改回 ppp 撥接
    因為以上傳為主的 SERVER , 其 ppp 的 usage 並不會太高
    若是使用其它 PPP 撥號程式也可以用我吶 script ..

    只要改掉這兩行就行:

    $pid = get_pid("/usr/sbin/ppp -ddial $PPPoE_profile");
    這行是你程式用 ps 查到的字串,可以改成你在用的 mpd

    system("/usr/sbin/ppp -ddial $PPPoE_profile");
    這行是您要啟動的 PPP 撥號程式指令



  6. #6
    校長兼撞鐘 阿 土 的大頭照
    註冊日期
    2000-10-09
    所在地區
    SEEDNET 8M
    討論區文章
    11,817
    又斷線了 , 以 ps -aux | grep ppp 找到很多筆 ppp 的資料

    root 61858 0.0 0.1 2704 1744 ?? Ss 12:32AM 0:00.10 /usr/sbin/ppp -d
    root 61837 0.0 0.1 2704 1744 ?? Ss 12:31AM 0:00.11 /usr/sbin/ppp -d
    root 61701 0.0 0.1 2704 1748 ?? Ss 12:27AM 0:00.17 /usr/sbin/ppp -d
    root 530 0.0 0.1 2836 1836 ?? Ss 8:39AM 11:38.01 /usr/sbin/ppp -d
    script 改成 "killall ppp" 直接把所有 ppp 停掉再做重撥是否會比較好?

  7. #7
    會員
    註冊日期
    2002-01-01
    討論區文章
    19
    最初由 阿 土 發表
    又斷線了 , 以 ps -aux | grep ppp 找到很多筆 ppp 的資料



    script 改成 "killall ppp" 直接把所有 ppp 停掉再做重撥是否會比較好?
    因為你執行 ppp 的指令跟我不同 ...所以要改成這樣:

    $pid = get_pid("/usr/sbin/ppp -d");

    你會發現很多支 ppp 是因為沒砍掉又重複執行 ...
    只要把餵給 get_pid 的識別字串打對,應該都找的出來
    用 killall 當然很棒 ...可是在 Linux 下好像就沒這個指令了
    所以我才用比較基礎的方式來比對

    我找時間在改一下 Script ,然後公佈我自己用的 ppp.conf 好了 ...
    這樣大家比較看的懂我的 script 怎麼用

  8. #8
    校長兼撞鐘 阿 土 的大頭照
    註冊日期
    2000-10-09
    所在地區
    SEEDNET 8M
    討論區文章
    11,817
    最初由 dekuo 發表
    因為你執行 ppp 的指令跟我不同 ...所以要改成這樣:

    $pid = get_pid("/usr/sbin/ppp -d");
    是我 key 錯了 , 其實也是 "ppp -ddial hiet"

    不過開機後的第一個 ppp process 卻是 "/usr/sbin/ppp -quiet -ddial -nat hinet"

    不過 ppp.conf 並沒有設定 nat , 也不知道怎麼會跑出來的

    我的 ppp.conf

    default:
    set log phase tun command
    enable dns

    hinet:
    set device PPPoE:fxp1
    set mtu 1492
    set mru 1454
    set speed sync
    enable lqr
    set cd 5
    set dial
    set ctsrts off
    set ifaddr 10.0.0.1/0 10.0.0.2/0
    set login
    add default HISADDR
    set authname hinet-id
    set authkey password
    set timeout 0
    set redial 3 5
    set lqrperiod 5
    set reconnect 5 10000
    rc.conf 的設定

    ppp_enable="YES"
    ppp_mode="ddial"
    ppp_profile="hinet"

  9. #9
    會員
    註冊日期
    2002-01-01
    討論區文章
    19
    最初由 阿 土 發表
    是我 key 錯了 , 其實也是 "ppp -ddial hiet"

    不過開機後的第一個 ppp process 卻是 "/usr/sbin/ppp -quiet -ddial -nat hinet"

    不過 ppp.conf 並沒有設定 nat , 也不知道怎麼會跑出來的
    你 config 檔寫太複雜了 ...看看我的 ..
    我已經改過重新 Post 了

    新版自動撥號 Script

    如果您有啟動 natd 也要關掉 ...用 ppp 的 NAT 就好了

  10. #10
    會員
    註冊日期
    2002-01-01
    討論區文章
    19
    最初由 dou0228 發表
    剛寫了一個用 TCP 連 Port 80 的 PHP script

    Ping 其實有的時候會被 ISP 無端的檔下來..
    用 Ping 用一定的風險在

    TCP 連 HTTP 也不是沒風險..
    只是較不會像 ICMP 那樣常被欄下來..

    他會亂數的取 Server 列表去連網頁
    萬一發現 連不上, 它會試三次, 不行才會重新啟動 ppp

    註: killall 在 Linux Distro. 裡會有, 請放心
    嗯嗯 ..您這程式寫的更完善 ... 真是不錯 ^_^

    不過我不用 killall 的原因是其實我的 script 也可以用在其它 Unix ...例如 Solaris 就沒有內建 killall 這個指令

    而且我用 Perl 寫的原因是因為 Perl 應該是所有 Unix Like OS 都會內建的程式,但是 PHP CLI 卻得靠 User 自己另外做 (或者是 RedHat 完整安裝也會做出 PHP CLI ? 但不見得每個 User 都會完整安裝)

    另外我相信 Hinet 也沒那個狗膽去擋 ICMP ... 其它夠種的 ISP 我就懶的管了

    當然啦 ... 我的看法是用 Perl 來寫出您那個程式的版本是最理想的啦 ... ^_^



類似的主題

  1. 【教學】讓 ADSL 數據機自動重開機的方法 (需 Linux)
    作者:linux_xp 所在討論版:---- ADSL 軟 硬 體 技 術
    回覆: 1
    最後發表: 2006-07-04, 01:03 AM
  2. 請問網路斷線後如何自動重撥?
    作者:lstcmy 所在討論版:-- 網 路 技 術 版
    回覆: 1
    最後發表: 2004-06-02, 09:37 PM
  3. 改硬撥斷線如何自動重撥
    作者:阿樹 所在討論版:---- ADSL 軟 硬 體 技 術
    回覆: 2
    最後發表: 2001-10-20, 10:06 PM
  4. linux的ADSL怎麼自動重撥連線?
    作者:yucen 所在討論版:---- ADSL 軟 硬 體 技 術
    回覆: 2
    最後發表: 2001-09-04, 05:28 PM
  5. 如何斷線後自動重撥?(win & freebsd)
    作者:yushio 所在討論版:---- ADSL 軟 硬 體 技 術
    回覆: 17
    最後發表: 2001-05-07, 01:08 PM

 

網路斷線重連語法

linux pppoe網路斷線重撥

發表文章規則

  • 不可以發表新主題
  • 不可以回覆文章
  • 不可以上傳附加檔案
  • 不可以編輯自己的文章
  •