第六章﹕架設 PPP


現在的電腦﹐相信沒幾台不需要連接 Internet 了吧﹖如果您在一個公司裡面﹐那可能會有專線提供不間斷的 Internet 服務﹔但如果您是一位家庭用戶﹐那或許最常用的 Internet 連接方法是撥接上網了。而在撥接上網的方式中﹐透過電話線加上 MODEM 來撥接是最便利和最普遍的。到了今天﹐相信用 ADSL 撥接上網的用戶已經越來越多了﹐而且﹐我相信在可見的數年內﹐ADSL 將會成為登錄家庭用戶最常用的上網方式。

但是﹐如果您還沒成功的用 Linux 撥接上網﹐我希望下面介紹的文章對您有所幫助。這篇文章主要以 MODEM 撥接為主﹐雖然我們已經在其它章節裡面提到過如何用 ADSL 撥接了﹐不過﹐為了照顧文章的完整性﹐我這裡還會再跟大家詳細說說如何在 Linux 上面設定 ADSL 撥接的。另外﹐如果您想用 Linux 弄一個簡單的撥接伺服器﹐當您看完這章的最後部份﹐應該可以做到的(如果您會設定 NAT﹐甚至還可以撥接進來再透過 ADSL 上網呢﹗)。

認識 pppd

我們在“網路基礎”中關於“電信 (Telecommunication)”的部份﹐已經知道遠端連接有分 remote control 和 remote access 的形式﹐而我們一般用來撥接上網都是使用後者。在連接的過程中﹐MODEM 是不能缺少的設備。我們可以簡單地將 MODEM 連接看成是 ISP 網路的延伸﹐所以 MODEM 也是一個網路界面﹐它所使用的協定為 PPP (Point to Point Protocol)。PPP 屬於資料連接( Data Link )層的協定﹐所以﹐在 PPP 以上﹐我們還是可以使用 TCP/IP 和更高層的協定的(如 IPX 等)。

但無論如何﹐PPP 所連接的機器﹐就是兩點之間的連接﹐單純的告訴設備﹕“您所連接的另一端﹐就是某某某某”﹔假設上層使用 IP 協定﹐那麼那個‘某某’就是一個 IP 位址﹐這也是我們最常見的 PPP 應用環境之一。當然﹐ppp 也可以支援 IPX 和 NetBEUI 等通訊協定。

而事實上﹐PPP 也不管底層的界面種類是什麼﹐例如﹐可以使用 Serial 界面( RS232﹐也就連接 modem 的界面標準)、也可以使用 parallel 界面、也可以使用 ethernet 界面 ( 如 PPPoE )、等等。也可以使用多種底層傳輸網路﹐例如﹕PSTN (公共交換電話網)、ISDN (綜合服務數據網)、ADSL ( 非對稱數據租用線路)、lease line (專線)、X2.5、ATM、Fram Relay 、等等。所以說﹐PPP 事實上可以在非常廣泛的情形下面使用﹐只是一般家庭用戶比較少接觸而已。

那麼﹐在 Linux 上面﹐負責管理 PPP 連接的服務程式就叫做 pppd。要使用它﹐您要將‘PPP (point-to-point) support’功能編進 kernel 中﹐或以模組(ppp.o)形式載入。如果您的核心是按照 system 系列的‘編譯核心’例子來設定的話﹐應該沒問題了。現在﹐假設您還沒有用 Linux 啟動 MODEM ﹐然後下輸入﹕

pppd

您應該會看到一大堆亂七八糟的字符跑出來﹕

~}#?}!}!} }4}"}&} } } } }%}&+N}+}'}"}(}"?~~}#?}!}!} }4}"}&} } } } }%}&+N} +}'}"}(}"?~~}#?}!}!} }4}"}&} } } } }%}&+N}+}'}"}(}"?~

要停止這些輸出也不行哦~~~ 哈哈﹐不用驚慌啦﹐待一會就好了。

Tips﹕假如您在您實在受不了那堆垃圾﹐可試試如下步驟﹕

  1. 敲一下 Enter
  2. 輸入 ~ 符號
  3. 按下 Ctrlz
  4. 輸入 kill 1% 命令

不保證成功啦~~ 要不就花點耐心等等囉。

事實上﹐如果您看到那些垃圾﹐應該是好事情﹐起碼我們可以證明 pppd 是工作的。否則﹐您可能要動動核心的手術了。

撥接之前的準備

首先﹐您當然要申請到一個撥接賬號才行。您的 ISP 必須要告訴您如下這些資訊﹕

  • 撥接賬號名稱和密碼
  • 撥接電話號碼
  • DNS 主機的 IP (或自動分配)
  • 賬號啟用程序 (如果有的話)
  • 客戶服務 / 求助電話號碼

然後﹐您必須找一條電話線﹐並確定它是可以撥接的(您可以用普通電話打到 ISP 給您的撥接號碼試試看)。然後﹐按說明書正確的連接好 MODEM 。

在這裡﹐ MODEM 是最重要的撥接設備﹐所以﹐我們先要確定它被設定好。如果您在 Windows 那裡設定過 MODEM﹐可能第一時間想找 Linux 下面的 MODEM 驅動程式。有這樣習慣是非常好的﹐但在 Linux 下面卻沒有 MODEM driver 這回事哦。嗯﹖什麼意思﹖哎呀﹐我只能說﹐在 Linux 下面使用非常標準的 MODEM 通訊程式﹐只要通訊口(RS232)設定好了就可以使用 MODEM 了。真的就這麼簡單~~ ^_^

不過﹐您還是必須知道您的通訊埠是否設定起來﹐而且沒有和其它硬體發生衝突(例如在 BIOS 開啟或關閉)。預設的情況下﹐各通訊口設定如下﹕

device name com port irq io
/dev/ttyS0 com 1 4 0x3f8
/dev/ttyS1 com 2 3 0x2f8
/dev/ttyS2 com 3 4 0x3e8
/dev/ttyS3 com 4 3 0x2e8

您必須要確定您的 ttyS# (留意 S 為大寫﹗) 設備在 Linux 系統裡面已經設定好了。如果你使用標準設定﹐那就沒什麼好擔心的。但如果該設備還沒設定好﹐例如﹐您剛換成 PCMCIA 類型的MODEM﹐那您可能需要使用 mknod 這個命令建立該設備了﹕

  1. 先找出設備的資源範圍﹐如﹕io=0x2e0 irq=10 。
  2. 然後將原來設備進行備份﹕mv /dev/ttyS0 /dev/ttyS0.bak
  3. 然後輸入﹕mknod -m 660 /dev/ttyS0 c 4 64 # 0x2e0

這樣我們就將 MODEM 連接到 ttyS0 (DOS下為 COM1) 這個通訊埠了。

Tips﹕有時候您還需要使用 setserial 來進一步設定通訊埠﹕

setserial /dev/ttyS1 irq 3 port 0x02f8 uart 16550a

此外我們還必須為通訊埠建立一個 link 指向 /dev/modem ﹕

ln -sf /dev/ttyS0 /dev/modem

如果 ISP 不是自動分配 DNS 的話﹐您可能需要手工的修改 /etc/resolv.conf 檔案﹐將 ISP 所給的 DNS IP 寫在前面﹐例如﹕

nameserver	139.175.10.20

如果 ISP 或 MODEM 廠商還有其它特別的要求﹐請多花些心思注意一下。另外﹐如果您的網路比較複雜﹐例如路由表中已經有 default gw 指向另外的網路﹐那﹐您必須在 ppp 成功之後﹐再仔細的安排路由設定了哦。如果不知道如何設定路由﹐那請參考‘網路設定’這篇文章。

然後﹐在下面﹐讓我們看看如何撥接上 ISP 吧﹕

手工撥接

先讓我們來一翻完全的手工撥接﹐這個過程非常辛苦﹐而且未必能夠成功。但是﹐之所以要這樣做﹐是為了了解整個撥接過程的細節。這在日後整個 PPP 的設定和管理中﹐都非常有幫助。當然了﹐如果您對手工設定沒興趣的話﹐可以直接跳到“設定 GUI 撥接”章節去﹐儘可不必耗費腦細胞。只要能上網就好了﹐不是嗎﹖

  1. 首先﹐請在家目錄建立一個叫﹕~/.ppprc 的隱藏檔﹐其內容如下﹕

    lock
    modem
    crtscts
    noipdefault
    defaultroute
    asyncmap 0
    noauth
    name netman
    
    (注﹕請將 netman 改成您的 ISP 帳號)

    Tips﹕上面這個檔是建立在用戶的家目錄中的﹐只有這個賬號的身份來撥接﹐才會讀取。它是用來給 pppd 程式使用的參數﹐這些參數可以在 pppd 命令行中輸入﹐也可以寫在 /etc/ppp/options 中。但如果寫在 /etc/ppp/opstions 中的話﹐那些參數則會作用於所有 ppp 連線上。如果參數被重複設定的話﹐其選用優先權分別是﹕1) pppd 命令行﹔2) ~/.ppprc ﹔ 3) /etc/ppp/options.ttyS# ﹔4) /etc/ppp/options 。

  2. 然後﹐我們可以使用 minicom 這個程式以 terminal 方式進行連線測試﹕

    minicom -m8 -c on

    這樣您就進入一個有顏色的 minicom 畫面了。如果您在最後一行看到“OK”字眼﹐也就表示您的 MODEM 已經成功啟動了。但如果您沒看到“OK”﹐又輸入不了任何東西﹐那很可能是您 /dev/modm 給 link 到錯誤的 ttyS 或是 ttyS 還沒設定好。這時候﹐您得按 Ctrl + Alt + F2 (或使用 telnet/ssh ) 開啟另一個終端視窗﹐輸入 ps aux | grep minicom 來找到 minicom 的 PID﹐然後將它 kill 掉﹐再重新設定好您的 MODEM。

  3. 當看到‘OK’之後﹐輸入﹕

    ATZ

    這是一個 MODEM 命令﹐目的是 reset 一下 MODEM 狀態。凡是 MDOEM 命令都是以 AT 開頭的﹐所以也有人稱之為“AT 命令”﹐例如﹕如果您嫌您的 MODEM 太吵耳了﹐可以輸入﹕ATM1L1 將音量調低﹐或干脆用 ATM0 將喇叭關掉。至於具體的 AT 命令有哪些﹐最好另行參考您的 MODEM 手冊﹐並以手冊為准。

    Tips﹕廠商的手冊有非常重要的資訊﹐因為不同型號的 MODEM ﹐其使用的 AT 命令和參數都有所不同﹐尤其是它的最佳建議值設定。比方說﹐我現在所購買的 Mitac 56K v.90 modem﹐廠商建議的最佳設定值是﹕AT &FE1 V1 W4 &C1 &D2 S0=0 S10=150 ﹐所以我會執行這個命令對 MODEM 進行初始設定。

    但要注意﹕您的 MODEM 可能與我的不一樣哦~~ 可不要亂用﹗如果您的廠商手冊有建議值﹐可以參考廠商的﹐否則不必設定。

  4. 您應該會重新看到‘OK’的。然後您就可以進行撥接了﹐您可以輸入﹕

    AT DT 40503000

    這也是一個 MODEM 命令﹐意思是撥接 ISP 的提供的電話號碼。這裡的‘D’是 Dial 的意思﹔‘T’是 Tone (音頻電話)的意思﹐如果您使用的電話是 Pulse (脈沖式)電話(很古老了)﹐則將 T 改成 P ﹔最後是 ISP 的撥接號碼。

  5. 如果您接通了 ISP 那邊的 MODEM 之後﹐您會聽到一陣嘈雜之聲﹐那是 MDOEM 之間的握手語言﹐我們盡可不理。我們只需留意有沒有登錄提示出現(有時候需要輸入 Enter 才看到)﹐例如﹕“Login:”﹐有些 ISP 則使用“xxxxx login:”代替“Login:”。如果您要寫撥接用的 chat script 的話﹐就需要留意這些細微不同了。

  6. 輸入帳號名稱之後﹐您應會看到“Password:”的提示。

    Tips﹕假如您輸入密碼之後對方回應說﹕PPP﹕Not enabled﹐那可能是您撥接的這只號碼暫時不接受 terminal 方式的登錄。您可以聯繫您的 ISP 要另外一只本地號碼再進行測試。例如﹐假如您在台南市撥接 seednet﹐可以輸入 atdt2767501 進行撥接。不過﹐在我的測試中﹐這情形也非一成不變﹐偶爾多試幾次或許就可以了﹐或是﹐ISP 根本就不接受 terminal 登錄。這樣的話﹐您就沒辦法用 terminal 或明碼方式登錄了﹐而必須改用 script 或其它工具﹐以 PAP 或 CHAP 的驗證方式登錄了。

  7. 成功登錄之後﹐您就要留意 ISP 是否提供了登錄選單供您選擇﹐例如﹕
    1.SLIP
    2.PPP
    3.Telnet

    諸如此類﹐請一一抄下﹐如果您要寫您的 script 就要用到了。如果沒有﹐則直接輸入 Enter 就是了﹐或根本不用做任何動作。

  8. 如果沒有選單出現﹐那麼通常您就會看到 pppd 那些垃圾字符出現了(或許有時候您要多按一下 Enter 才出現)。

  9. 一旦您看到那些字符出現﹐您要做的是按 Alt + Q 鍵(如果您啟動 minicom 的時候沒使用到 -m 參數﹐您要先按 Ctrl + A (放開)再按 Q ﹐您也可以按 Alt + Z 查看更多關於 minicom 的設定)。

  10. 當看到“Quit without reset modem?”提問的時候﹐按‘OK’跳回文字模式。

  11. 接著輸入﹕

    pppd -detach /dev/modem&

  12. 接著﹐您再輸入 ifconfigroute -n 看看 ppp0 界面是否成功連接了。

  13. 假如 default gw 不是指向 ppp0 的話﹐您可以輸入 route add default dev ppp0 ﹐這樣就可以將預設路由轉以 ppp 連線出去了。

  14. 最後﹐如果您要結束連線﹐找出 pppd 的 PID 然後 kill 掉就可以了。

使用 script 撥接

在 Linux 討論板上﹐我們常可抄到一些 Linux 高手提供的 script 來方便我們的撥接。這裡﹐我也有一個 script 給大家試試。不過要注意的是﹐我這個 script 只是提供最簡單的連接﹐並沒包括登錄選單選擇或其它複雜功能。

  1. 首先﹐請參考如下內容建立 /usr/sbin/ppp-on 這個檔案﹕

    #!/bin/sh
    #File: /usr/sbin/ppp-on
    #Purpose: a simple PPP dial-up script
    #
    if [ -f ~/.ppprc ]; then
    	ACC=$(cat ~/.ppprc | grep name | awk '{print $2}')
    	if [ ! -z "$ACC" ]; then
    		MYNAME="$ACC"
    		echo ""
    		echo "'.ppprc' found in $USER's home directory,"
    		echo " trying to use user specified account..."
    	fi
    fi
    if [ -z "$MYNAME" ]; then
    	MYNAME=netman
    	echo ""
    	echo -n "Warning: no account name specified," 
    	echo "using default account '${MYNAME}"
    fi
    
    echo "PPP is using account ${MYNAME} to connect to ISP ${ISP} ..."
    DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
    #
    exec /usr/sbin/pppd -detach lock modem crtscts \
    	/dev/modem 115200 noipdefault defaultroute \
    	noauth name ${MYNAME} connect $DIALER_SCRIPT
    

    是否覺得 pppd 後面執行的選項和 ~/.ppprc 的內容很相似呢﹖沒錯啦﹐如果您能夠手工的將 ppp options 用命令行的形式輸入﹐您可以不必設定 ~/.ppprc 和 /etc/ppp/options 檔案。但相反﹐如果您不想在命令行輸入﹐則交給前述檔案代勞吧(它們的關係我已經在前面說過了)。

  2. 第二個檔案是 /etc/ppp/ppp-on-dialer (註﹕路徑必須和上面的‘DIALER_SCRIPT=’一致﹗)﹕

    #!/bin/sh
    #File: /etc/ppp/ppp-on-dialer
    #Purpose: a simple PPP dial-up script
    #
    TELEPHONE=40503000
    DIALSCRIPT=/tmp/dialscript.$$
    #
    trap "rm -f ${DIALSCRIPT}" INT HUP QUIT
    #
    umask 066
    cat <<EOF > ${DIALSCRIPT}
    ABORT '\nNO DIALTONE\r'
    ABORT '\nBUSY\r'
    ABORT '\nNO CARRIER\r'
    ABORT '\nNO ANSWER\r'
    '' 'ATZ'
    # 下面這行設定視您的 MDOEM 手冊而定﹐否則可以不設﹕
    #OK 'AT &FE1 V1 W4 &C1 &D2 S0=0 S10=150'
    OK ATDT$TELEPHONE
    CONNECT ''
    EOF
    /usr/sbin/chat -v -f ${DIALSCRIPT}
    rm -f ${DIALSCRIPT}
    

  3. 最後﹐我們還要建立一個檔案﹕ /usr/sbin/ppp-off :

    #!/bin/sh
    #File: /usr/sbin/ppp-off
    #Purpose: a simple PPP dial-up script
    #
    #
    # Determine device
    if [ -z "$1" ]; then
            DEVICE=ppp0
            else
            DEVICE=$1
    fi
    #
    # Stop program
    if [ -r /var/run/$DEVICE.pid ]; then
            kill -INT `cat /var/run/$DEVICE.pid` 
    	#注意﹕‘`’符號是在‘1’鍵左邊
    #
    # Delete lock file
            if [ ! "$?"="0" ]; then
                    rm -f /var/run/$DEVICE.pid
                    echo "ERROR: Removed stale pid file"
                    exit 1
            fi
    #
    # Getting out
            echo "PPP link to $DEVICE terminated."
            exit 0
    fi
    #
    # Not ruuning
    echo "ERROR: PPP link is not active on $DEVICE."
    exit 1
    

    (以上三隻 script 可以 按這裡下載。)

  4. 然後修改 /etc/ppp/pap-secrets ﹐將您的ISP帳號和密碼寫進去﹕

    # Secrets for authentication using PAP
    # client        server  secret       IP addresses
    netman  ppp0    Agb-7Rh9 
    

    Tips﹕注意﹕前面三個 script 檔案必須用 chmod +x 設定為可執行檔。如果您要引用這幾個 script ﹐要修改的地方有﹕
    • /usr/sbin/ppp-on 中的“NAME=”以及 ~/.ppprc 中跟在 name 後面的帳號
    • /etc/ppp/ppp-on-dialer 中的 “TELEPHONE=”
    • /etc/ppp/pap-secrets 中的帳號與密碼
    • 另外﹐別忘了修改 /etc/resolv.conf 中的 DNS ﹐以及修改路由設定。

  5. 最後﹐您輸入 ppp-on & 就可以連上 ISP 了﹔如果要下線﹐輸入﹕ppp-off 即可。很方便吧~ ^_^

設定 GUI 撥接

一如我們在過去一直強調的﹕在 Linux 下面﹐除了精確的手工設定之外﹐還有許多工具可以使用。在 linux 上面的 PPP 撥接工具也非常多﹐這裡只介紹 RedHat 7.1 自帶的一隻工具 --- KDE 裡面的 Internet Dialer (kppp)

  1. 首先﹐進入 X Window﹐從 K 圖標開始 --> Internet --> Internet Dialer ﹕

  2. 在第一次設定的時候﹐您應該找不到任何賬號設定﹐這時候選擇‘Setup’鍵﹐然後‘New...’鍵﹐以開始建立新的撥接賬號。這時候﹐我建議您使用‘Wizard’來設定﹕

  3. 按‘Next’後選擇‘Taiwan’作為所在地區﹕

  4. 從所提供的名單中選擇您的 ISP ﹐如果找不到您的 ISP 就隨便選擇吧﹐反正我們以後可以修改﹕

  5. 然後輸入您的賬號和密碼﹕

  6. 接下來的 prefix 設定可以不管﹐除非您所使用的分機需要先撥一個號碼才能撥外線(如在旅館中)﹐那才需要設定﹕

  7. 最後﹐按下‘Finish’鍵就可以了﹕

  8. 然後您會回到 Kppp 的設定畫面並看到剛纔建立的新賬號﹐如果您需要修改的話﹐可以按‘Edit...’進行﹕

  9. 如果您還有其它設定的話﹐也可以按其餘的標籤進行。比方說﹐我需要為我的 MODEM 設定初始設定值﹐於是我點選‘Modem’--> ‘Modem Commands’﹐然後在‘Initialization String:’欄位中輸入廠商建議的設定(否則可以不設)﹕

  10. 當您滿意您的設定後﹐按‘OK’離開就看到 Kppp 的撥接畫面了。然後您只需選擇好您的賬號﹐再按‘Connect’就可以進行撥接了﹕

  11. 成功連線後﹐Kppp 視窗會縮到最小﹐您只要將之呼叫出來﹐然後按‘Disconnect’就可以斷線﹕

呵呵~~~ 原來在 Linux 裡面也有這麼好用的 PPP 撥接工具哦~~ 真是太好了﹗ ^_^

設定 ADSL 撥接

感謝科技發展的神速﹗我們前兩年還忙於設定龜速(最快 56K) 的 MODEM 撥接﹐現在的朋友﹐都在享受著 T1 甚至 T3 下載速遞的 ADSL 或 Cabel Modem 於網上狂飆了﹗為了不至落伍﹐我們這裡當然要介紹一下撥接式 ADSL 的設定啦。

雖然我在 system 系列之“基本命令操作”那裡曾經以 rp-pppoe 作為例子﹐介紹過 RPM 的安裝方法﹐這裡不妨再詳細的再說一遍﹕

  1. 首先﹐請到這個 rp-pppoe 的官方網站 http://www.roaringpenguin.com/pppoe/ 下載 rp-pppoe-3.3-1.src.rpm 套件回來﹐您也可以 直接從本站抓取 (或許網站上已經又有新版了﹐如果有所不同的話﹐則以目前這裡介紹的版本為準。)

  2. 然後將檔案複製到 /usr/src/pkgs 目錄裡面(如果這個目錄不存在的話﹐自行建立吧)﹐然後請輸入﹕

    cd /usr/src/pkgs
    rpm --rebuild rp-pppoe-3.3-1.src.rpm
    (檔案名稱以您的實際版本為準)

  3. 接下來將 rp-pppoe 和 rp-pppoe-gui 裝好﹕

    rpm -Uvh /usr/src/redhat/RPMS/i386/rp-pppoe-3.3-1.i386.rpm
    rpm -Uvh /usr/src/redhat/RPMS/i386/rp-pppoe-gui-3.3-1.i386.rpm

    如果您不能成功完成上面的步驟﹐請檢查您目前的版本是否 RH7.1﹐或是根據錯誤提示進行修改。

  4. 然後執行如下命令進行安裝﹕

    adsl-setup

    接下來您要輸入 ISP 給您的賬號﹐如果您是 hinet 的帳戶﹐那您的帳號名稱或許需要帶那個 @ 符號以及 hinet 的名稱(請參考 hinet 的說明文件)﹔如果您是 seednet 的帳號﹐那只輸入帳號名稱就好了﹕

    USER NAME
    
    >>> Enter your PPPoE user name (default bxxxnxnx@sympatico.ca): t1234567
    

    然後選擇連接 ADSL 的界面﹕

    INTERFACE
    
    >>> Enter the Ethernet interface connected to the ADSL modem
    For Solaris, this is likely to be something like /dev/hme0.
    For Linux, it will be ethn, where 'n' is a number.
    (default eth0): eth0
    

    Tips﹕眼尖端讀者可能發現本來我的‘真實’網路是使用 eth1 這張界面連接 adsl 那個 hub 的﹐來在設定的 rp-pppoe 時候﹐我改用了 eth0 來連接~~

    不過﹐我這裡跟您這樣說好了﹕ 不管 eth0 還是 eth1 目前的 IP 設定如何﹐只要這個界面能夠連得到 ADSL 去﹐ 那就可以了跑 PPPoE 。 因為 ppp 界面和 ethernet 界面本來就不同﹐原本的 ppp 是走 RS232 界面﹐也就是常見的 com port ﹐只是現在改用 ethernet 網路卡而已。注意﹐不是改走 IP 上面的網路﹐一個是 L3 層另外一個是 L1 層級。 換而言之﹐只要在實體連線上﹐ethernet 界面和 ADSL 接在一起﹐而且 eth 界面能被 kernel 抓到。那就根本不管它的 IP 是否有設定﹐或是如何設定~~

    在物理上﹐您可以看為一張 ethernet 界面﹐ 但在邏輯上﹐eth 和 ppp 是不同的。

    接著設定程式會問您是否需要啟用 demand 功能﹐一般來說不需要﹐所以直接按 Enter 就是了﹕

    Do you want the link to come up on demand, or stay up continuously?
    If you want it to come up on demand, enter the idle time in seconds
    after which the link should be dropped.  If you want the link to
    stay up permanently, enter 'no' (two letters, lower-case.)
    NOTE: Demand-activated links do not interact well with dynamic IP
    addresses.  You may have some problems with demand-activated links.
    >>> Enter the demand value (default no):
    

    再來是設定 DNS ﹐請根據 ISP 給您的資訊來設定。如果您的 /etc/resolv.conf 本來就已經設定好 name server﹐並且能查詢 internet 的話﹐那您可以不設﹐然則直接按 Enter 就好﹕

    DNS
    
    Please enter the IP address of your ISP's primary DNS server.
    If your ISP claims that 'the server will provide DNS addresses',
    enter 'server' (all lower-case) here.
    If you just press enter, I will assume you know what you are
    doing and not modify your DNS setup.
    >>> Enter the DNS information here: 139.175.10.20
    

    接下來輸入第二個 DNS (如果上一步您有輸入的話)﹐如果您不想指定另外的﹐可以直接按 Enter 跳過﹕

    Please enter the IP address of your ISP's secondary DNS server.
    If you just press enter, I will assume there is only one DNS server.
    >>> Enter the secondary DNS server address here: 168.95.1.1
    

    然後輸入您的撥接帳號密碼(共兩次)﹕

    PASSWORD
    
    >>> Please enter your PPPoE password:
    >>> Please re-enter your PPPoE password:
    

    到這裡﹐您必須設定好您的防火牆模式。呵﹐或許您不知道呢﹕rp-pppoe 內建有連線分享功能呢(選擇 ‘2 - MASQUERADE’ 就可以了)﹗因為我們後面會打算自己設定防火牆﹐所以這裡選擇 0

    FIREWALLING
    
    Please choose the firewall rules to use.  Note that these rules are
    very basic.  You are strongly encouraged to use a more sophisticated
    firewall setup; however, these will provide basic security.  If you
    are running any servers on your machine, you must choose 'NONE' and
    set up firewalling yourself.  Otherwise, the firewall rules will deny
    access to all standard servers like Web, e-mail, ftp, etc.  If you
    are using SSH, the rules will block outgoing SSH connections which
    allocate a privileged source port.
    
    The firewall choices are:
    0 - NONE: This script will not set any firewall rules.  You are responsible
              for ensuring the security of your machine.  You are STRONGLY
              recommended to use some kind of firewall rules.
    1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
    2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
                    for a LAN
    >>> Choose a type of firewall (0-2): 0
    

    到最後﹐設定程式會將您所作的設定作一個簡單彙報﹐如果您覺得沒錯誤的話﹐輸入 y 即可﹕

    ** Summary of what you entered **
    
    Ethernet Interface: eth0
    User name:          t1234567
    Activate-on-demand: No
    Primary DNS:        139.175.10.20
    Secondary DNS:      168.95.1.1
    Firewalling:        NONE
    
    >>> Accept these settings and adjust configuration files (y/n)? y
    

    然後您就完成設定了﹗

    Congratulations, it should be all set up!
    
    Type 'adsl-start' to bring up your ADSL link and 'adsl-stop' to bring
    it down.  Type 'adsl-status' to see the link status.
    

    Tips﹕如果您使用 RedHat 7.3 系統﹐並不需要安裝 rp-pppoe 軟體﹐只需安裝 rp-pppoe-gui 就夠了。假如在文字界面下連線﹐當完成 adsl-setup 之後﹐還有一些小修改﹕
    cd /etc/sysconfig/network-scripts
    mv ifcfg- ifcfg-ppp0
    vi ifcfg-ppp0
    然後修改﹕ DEVICE=ppp0
    

  5. 接下來﹐只要您輸入如下命令就可以進行撥接﹕

    adsl-start

    如果您順利的話﹐最後會看到 “.. Connected! ”的結果。否則﹐就可能是您上面的設定有問題﹐也有可能是設備或連線的問題了。如果您要查看 adsl 的狀態﹐可以輸入 adsl-status ﹐會看到類似這樣的資訊﹕

    adsl-status: Link is up and running on interface ppp0
    ppp0      Link encap:Point-to-Point Protocol
              inet addr:211.74.48.118  P-t-P:211.74.48.1  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
              RX packets:4 errors:0 dropped:0 overruns:0 frame:0
              TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0
    

    如果您要掛斷連線﹐只要輸入 adsl-stop 就可以了。

    Tips﹕我最近發現 ADSL 的線路很不穩定﹐有時候等老半天都連不上網路﹐甚至還會斷線。我不知道這問題究竟是中華電信的線路問題﹐還是 seednet 的伺服器問題。但只要您發現 ADSL 的 WAN 燈不閃或不亮、或是 DIAG 的橙燈亮起來之後﹐那您不妨等等看﹐因為再試也是白費力氣。如果真的還不行﹐那就將 ADSL 關掉﹐等上 5 秒鐘﹐然後再打開重新連接吧。(哦﹐我住台南市﹐用 seednet 的撥接 ADSL )

  6. 上面的設定和撥接都是在文字模式下面進行的﹐如果您能進入 X window (用 root 身份)﹐那麼﹐您還可以使用更方便的圖形工具哦﹗我這裡以 KDE 環境來做介紹﹐從 K 圖標開始 --> internet -->TkPPPoE ﹕

  7. 然後您就可將 TkPPPoE 叫出來了﹕

  8. 在剛開始的時候﹐您是沒有設定任何帳號的(文字模式下設定的那個不會出現在這裡)﹐所以﹐請選‘New Connection...’進行設定﹕

    在‘Basic’中填好 ISP 名稱、帳號名稱、和帳號密碼﹕

    在‘NIC and DNS’中選擇好您的界面和 DNS ﹔預設的 DNS 是‘From Server’﹐如果您確定 ISP 會自動分配的話﹐那就不需要設定 DNS 了﹐要不然﹐您可以選擇‘Specify’然後填好 DNS﹐或是選擇‘Do not Adjust’以使用本機的原本設定﹕

    在‘Options’裡面﹐我建議您取消‘Use synchronous PPP’(除非您發現這樣做有問題)﹔如果您決定讓普通帳號也能使用 TkPPPoE 的話﹐那麼也將‘Allow use by non-root users’也選擇起來﹔而‘Fiewalling’的設定我建議您選擇‘None’﹐不過﹐如果您只想單純的做連線分享﹐那也可以選擇‘Masquerading’啦(這部份我們會在另外的文章中介紹)﹕

    其餘的可以不設定了﹐完成後按‘OK’離開。

    然後﹐您只要按‘Star’就可以連線了﹕

    您可以透過版面看到當前的流量狀況﹐如果您確定沒有執行 internet 程式﹐而又發現連線一直在跑﹐那就要小心您的系統是否遭到別人入侵或攻擊了~~~

    如果要掛斷連線﹐按‘Stop’即可。假如您要修改連線設定﹐那麼按‘Properties...’回到前面介紹的畫面設定就是了。

架設撥接伺服器

前面我們只是學會了如何撥接出去﹐這僅是 pppd 的功能之一﹐都是 client 端的設定而已。假如您願意的話﹐還可以用 pppd 架設撥入伺服器哦~~~

我這裡不打算詳細的設定一個複雜 ISP 式的撥入服務器﹐因為牽涉的硬體和軟體都非常多﹐還有提供 Authentication 的 accounting 程式﹐例如﹕ radiusd 。這實在是超出我這裡的討論範圍了。用下面的步驟設定﹐您應該可以使用其他電腦(Linux 或 Windows)撥接進您的 Linux 主機﹐也可以使之連接進所在的網路。

  1. 首先﹐我們找到作為撥入 MODEM 的通訊埠是哪一個﹐我們這裡是 /dev/ttyS1 (也就是 COM 2 )。然後根據這個設備名稱﹐我們要建立一個 /etc/ppp/options.ttyS1﹐使之看上去像這樣﹕

    lock
    modem
    crtscts
    asyncmap 0
    passive
    proxyarp
    192.168.100.23:192.168.100.111
    netmask 255.255.255.0
    ms-dns 192.168.100.23
    

    關於這個檔案的設定內容﹐我這裡不妨說說﹕

    lock
    這是防止設備在使用中的情況下被其它程式來使用﹔
    modem
    使用 MODEM 連線﹔
    crtscts
    使用硬體傳輸控制﹔
    asyncmap 0
    非同步字元對應表﹔
    passive
    被動模式(指連線交握的時候)﹔
    proxyarp
    這非常重要﹐讓本地網路知道遠端 client 的連線在這台 server 上﹔
    192.168.100.23:192.168.100.111
    分配給本地端和遠端機器的 IP 位址﹐在冒好左邊是給本地端(server)使用的﹐而右邊則是分配給遠端(client)使用﹔netmask 255.255.255.0﹕這是用來設定網路所使用的 netmask﹐但作為 ppp 連線本身﹐是沒所謂 netmask 設定的(使用全部 32bit mask)﹔
    ms-dns 192.168.100.23
    為客戶端指定 DNS。
  2. 要為了能夠讓原端 client 能連上本地網路﹐proxyarp 設定是至為重要的。為什麼會這樣設定呢﹖如果要研究 PPP 的話﹐您可以買一本近 500 頁的 O'Reilly 出版的“PPP 網路管理”看看。這裡我只能簡單地解釋為﹕透過 proxy-arp (相信您已經在“網路基礎”之“ARP協定”中接觸過了)﹐這裡的撥接伺服器就能夠代遠端的客戶機回答關於它的 ARP 查詢。這樣﹐本地網路中(或通過路由到達本地網路)的其它主機根本就不會意識到該主機是在遠端。從而也就達成順利的 IP 通訊(當然要排除連線和路由障礙啦)。

    需要注意的是﹐如果您修改 /etc/ppp/options 檔案的話﹐其設定可影響到所有的 ppp 連線﹐不管連線是撥入還是撥出﹐只要 pppd 命令行或其它設定檔沒指定的參數﹐都會參考這個檔。所以﹐我建議您儘量以設備名稱來設定 ppp 的 options 。假如您有超過一個 modem 來接受接入連線﹐那麼傚法這個 options.ttyS1 建立其它 options.ttySx 檔就是了。

  3. 修改 /etc/mgetty+sendfax/login.config 檔案﹐將下面這行的註解“#”拿掉﹕

    /AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap login debug
    

  4. 再來﹐修改 /etc/mgetty+sendfax/mgetty.config 檔案,如下部分﹕

    port ttyS1
      debug 3
      data-only y
    #  下面這行視 modem 廠商建議值而設﹐否則可不設﹕
    #  init-chat "" ATZ OK AT&FE1V1W4&C1&D2S0=0S10=150 OK
    #  下面這行也可不設﹕
    #  answer-chat "" ATA CONNECT \c\r
    

  5. 修改 /etc/inittab 檔案﹐在最後面加進下面這行(如果以‘s0’開頭的句子已經存在﹐請用‘#’註解掉)﹕

    s0:2345:respawn:/sbin/mgetty -D -a modem ttyS1
    

    如果您的設備有別於 ttyS1﹐請自行更改﹐如若有多台撥入 MODEM 的話﹐參考上面句子複製再修改就可以了。

    然後讓設定生效﹐執行﹕

    init q

  6. 修改 /etc/ppp/pap-secrets ﹐將要使用撥接服務的使用者加進清單中 ﹕

    # Users allowed for PPP connection
    netman	*  netman-ppp-pwd  *
    kenny	*  kenny-ppp-pwd  *
    pppuser1 *	""	*
    ......
    

    在我的測試中﹐只要使用 PAP 機制進行 PPP 連接的話﹐最好在 pap-secrets 中使用系統相同的密碼。不過﹐如果您引用第三行的“pppuser1”那樣將密碼設定為 ""(空密碼)的話﹐那樣就只會用系統的密碼進行登錄了。如果您不想弄那麼複雜﹐我會建議您採用最後那行的格式來設定。

  7. 最後﹐請執行﹕

    chmod u+s /usr/sbin/pppd

接下來就是您進行測試的時候了。當 Linux 撥入 MODEM 響起之後﹐如果 MODEM 之間未能建立起連線﹐那麼進入 mimicom 或其他 MODEM 操作程式﹐打 ‘ATA’就可以讓兩台 MODEM 進行握手了。如果您想設定為自動回答﹐那麼您只要輸入 ATS0=1 。最後按 Alt + Q (如果使用 minicom -m 的話)﹐不重新 reset modem 而離開就可以。 不過﹐通常 /etc/inittab 和 mgetty 設好了應該是很順利的。

到此為止﹐您就可以使用 Windows 或 Linux 來測試 PPP 連接了﹐這裡所指的連接是使用了 PAP 機制的。如果在 linux 用 minicom 或其它手工程式撥接﹐或是在 Windows 選擇了‘撥接後帶出終端’來連線﹐在通過 PAP 認證之前﹐使用者仍然可以進行系統登錄﹐其情形就像 telnet 一樣。如果您想限制使用者只能使用 PPP ﹐您可以修改 /etc/passwd 這個檔案﹐將使用者的 shell 指向另外一個 ppplogin 的 script。步驟如下﹕

  1. 建立(或修改) /bin/ppplogin 檔﹕

    #!/bin/bash
      mesg n
      stty -echo
      /usr/sbin/pppd -detach passive
    

    完成後別忘了加上 x 權限﹕

    chmod +x /bin/ppplogin

  2. 然後修改 /etc/passwd 檔案﹐記得把撥接帳號最後的 shell 指向另一個 script﹕

    pppuser1:x:1500:100::/home/pppuser1:/bin/ppplogin
    

    以上修改也可以透過 usermod 命令進行﹕usermod -s /bin/ppplogin pppuser1 。

上面的 scrip 會直接替使用者啟動 PPP 連接﹐但如果您想為使用者提供一個登錄選單的話(通常給那些以 terminal 方式作業的用戶)﹐可以參考如下例子代替﹕

#!/bin/bash
stty pass8
while true
  do
  /usr/bin/clear
  echo ""
  echo "Welcome to netman's PPP server!"
  echo "-------------------------------"
  echo ""
  echo "Please pick a number from following options:"
  echo 	1. PPP
  echo	2. Telnet
  echo	3. Terminate
  echo -n "-->"
  if read CHOICE
    then /usr/bin/clear
    case "${CHOICE}"
    in
     '1') echo ""
	  echo "Starting PPP..."
     	  /usr/sbin/pppd ;;
     '2') echo ""
	  echo "Pleae type 'open' followed by the remote host name."
	  echo "And type 'quit' when you finish."
     	  /usr/bin/telnet ;;
     '3') echo ""
	  echo "Good bye~~!"
	  break ;;
    esac
  else
    exit
  fi
done



一些注意之處

  • 如果您要使用 script 的話﹐最關鍵點還是那個 chat script。要是用那三個 scripts (ppp-on, ppp-on-dialer & ppp-off) 老是不成功的話﹐或許改用這個簡單的方法。

    先建一個 chat script﹐存為 /etc/ppp/chat.scr﹐內容如下﹕

    "" "ATZ"
    "OK" "ATDT40503000"   
    "CONNECT" ""
    

    然後修改 ~/.ppprc﹐類似如下﹕

    -detach
    /dev/modem
    lock
    idle 600
    noauth
    modem 115200 
    crtscts
    defaultroute
    name "your_isp_account"
    connect '/usr/sbin/chat -v -f /etc/ppp/chat.scr'
    

    也就是將您的 ISP 帳號和 chat script 寫進這個檔裡面﹐然後執行 pppd& 就可以進行撥接了。如要斷線﹐可以執行 ppp-off﹐或直接 kill 掉 pppd 的 PID.

  • 要注意一點﹕做 ppp dial-up client 和做 ppp dial-in server 的 options 設定是不一樣的。如果您要轉換角色﹐別忘了修改相應的 options.ttySx 檔。

  • 如果您在使用 PPP 撥接時碰到問題﹐在啟動 pppd 的時候﹐可以加入 -d 參數來觀察輸出結果( 檢查 /var/log/messages )﹔當然﹐也可以用 minicom 或 dip 等 terminal 來查看每一個步驟。參考 /var/log/messages 中的記錄非常有助於研判問題所在。

  • 如果說什麼 PAP Authentication fail for usernameXXX ﹐或是一連上就斷線的話﹐請檢查 server 端的 /etc/ppp/pap-secrets 有沒有該使用者名稱﹐和密碼是否一致。如果您是用手工撥接的話﹐別忘了在 pppd 命令行﹐或其它 options 檔中包含有 name login_name 字串。

  • 如果看見 Peer is not authorized to use remote address ip.ip.ip.ip 的話﹐那麼請確定在 client 端的 /etc/ppp/options 或 /usr/sbin/ppp-on 這個 script 有 noauth 的設定。

  • 如果您在 Windows 以叫出終端的辦法來撥接﹐要注意的是﹕第一個撥接視窗中的密碼是給 PAP 用的﹐而 terminal 中輸入的密碼則是系統帳號登錄(假如您允許他們直接登錄的話)。

  • 成功撥接之後﹐如果不能存取遠端資源﹐請確定雙方的 routing 設定正確﹕server 那端必須有 proxy-arp 的設定﹐如果遠端 IP 和本地網路不是同一個 subnet ﹐那麼要為之建立 routing ﹔在客戶機那端必須有 defaultroute 的設定﹐您可以用 route 命令來確定 default gw 指向 PPP 的連線。

  • 假如撥接後能獲得 IP ﹐但當連接外面的時候 modem 卻沒有反應。那就請輸入 route -n 看看 default gw有沒有包括 ppp 連線。如果沒有﹐可能您已經為主機本身指定了 default gateway (您可以查一下 /etc/sysconfig/network 看看)。要解決這個問題﹐您有好幾個方法(只要其一即可)﹕

    • 修改 /etc/sysconfig/network 將其中的 GATEWAY 和 GATEWAYDEV 句子拿掉。

    • 或是﹐執行如下命令﹕

      route add default dev ppp0

    • 或是﹐在 /etc/ppp 目錄下面修改一個 ip-up.local 檔(如果沒有請自行建立﹐並加上 x 執行權限)﹐增加如下內容﹕

      #!/bin/bash
      /sbin/route add default dev ppp0
      

    (注意﹕上面的 ppp0 是您的 ADSL 撥接界面﹐假如您不是用 ppp0 的話﹐那請修改為正確的設備名稱。當然﹐其它相關的路由﹐就請您多花點心思了。)

    如果您採用最後兩種方法﹐那在結束 ADSL 撥接之後﹐再檢查 route table ﹐確定剛纔的設定被取消(也就是還原為原來的 default gw 設定)﹐否則用手工的方法移除(相信您會移除吧﹖不會就要打屁屁了~~)。

  • 在 routing 解決之後﹐只能用 IP 地址而不是主機名稱連線的話﹐那是 /etc/resolv.conf 這個檔案沒設定好。將本地網路或 ISP 的 DNS 伺服器 IP 寫進去就可以了(可以先 ping 一下 DNS 的 IP 以確定連得上)﹐如﹕

    nameserver	139.175.55.244
    

如果您還有任何關於 PPP 的疑問﹐可以看一下 PPP、Serial、mgetty 等 HOWTO 文件。也可以買 O'Reilly 的 “PPP 網路管理”這本書回來參考。

 

 


www.study-area.org © 2001 Netman 網中人
Last Updated: July 16, 2002