天天看點

Linux下PPP撥号上網設定

既然是撥号上網,就不能不提到ppp(point-to-point protocol)協定.ppp協定提供了一種通過串行點對點聯接傳輸資料報的方式.它由三部份組成:一種在串行封裝資料報的方式,擴充聯接控制協定LCP,和用來建立和配置不同網絡層協定的家族網絡控制協定NCP.封裝方案由核心驅動代碼來提供.pppd(ppp daemon)提供基本的LCP,認證支援,和建立和配置IP的網絡控制協定NCP.一個ppp會話分為四個步驟:連接配接建立、連接配接品質控制、網絡層協定配置、連接配接終止;提供了密碼認證協定(PAP)或者邀請握手認證協定(CHAP)來保證連接配接安全.使用PPP你可以把你的 Linux PC連接配接到一台ppp伺服器上并存取該伺服器所連接配接的網絡資源就如同你是直接連接配接在該網絡上一般。你也可以把你的Linux PC設為一台ppp伺服器,這樣一來其它電腦就可以撥入你的電腦并且存取在你區域網絡裡的資源。

 當然,對于我們最終使用者來講,它是一個server/client模型的應用。本文主要讨論用戶端怎樣撥号上網,畢竟對于桌面系統的使用者,ppp是日常生活的一個重要組成部分。在這裡我想大家可能對windows下的撥号擴充卡的簡單易用深表"敬佩",在這裡我不想對其進行具體讨論,微軟公司提供的TAPI可以讓每一個windows下的程式員編寫一個撥号程式不是一件困難的事,而在linux下呢?無論是gnome下的wvdial還是kde下的kppp,他們與純腳本ppp-on相比不過是更直接,更易操作,稱他們為圖形化的撥号腳本并不為過,因為他們最終都是調用pppd這個功能強大大卻不好駕馭的程式。有人告訴我kppp與windows下的撥号擴充卡功能差不多,不過我要告訴你kppp對pppd程式的依賴程度大過kppp作為一個獨立的撥号程式,甚至/etc/ppp/options下的選項值對kppp的影響也是不可忽視的。

關于linux下腳本撥号的過程:(其實可适用于linux下所有的撥号過程,當然實際過程沒有這麼簡單,如果有興趣,請閱讀源碼)

1.由pppd程式調用chat會話程式

2.chat會話程式負責撥号,啟動伺服器端的pppd程式,驗證身份,然後chat會話程式結束

3.由pppd程式繼續chat會話程式的工作,與伺服器端的pppd程式進行握手,建立ppp連接配接

ppp-on腳本包含有pppd程式,而ppp-on-dialer腳本含有chat會話程式,如果說pppd程式完成 的是連接配接建立、連接配接品質控制、網絡層協定配置、連接配接終止,那麼chat程式完成的是明文(textword)的驗證,如果是撥入的伺服器端需要密碼認證協定(PAP)或者邀請握手認證協定(CHAP)來保證連接配接安全,那麼還須在/etc/ppp目錄下配置pap-secrets或chap-secrets檔案。

關于ppp-on,ppp-on-dialer純腳本撥号的配置

一個完整的ppp-on檔案如下:(這裡的執行個體及ppp-on-dialer檔案均以163直通車為例)

TELEPHONE=163 # ISP提供的上網電話号碼

ACCOUNT=163 # 賬号名稱

PASSWORD=163 # 登入密碼

LOCAL_IP=0.0.0.0 # 本地IP位址,0.0.0.0表示由ISP動态配置設定

REMOTE_IP=0.0.0.0 # 遠端IP位址,一般為0.0.0.0

NETMASK=255.255.255.0 # 子網路遮罩

export TELEPHONE ACCOUNT PASSWORD /

DIALER_SCRIPT=/etc/ppp/ppp-on-dialer /

exec /usr/sbin/pppd lock modem crtscts /dev/ttyS0 115***/

asyncmap 0 kdebug 4 /

$LOCAL_IP:$REMOTE_IP noipdefault netmask $NETMASK defaultroute /

connect $DIALER_SCRIPT&

這個檔案需要注意的地方:

a.注意"/"表示一行完整的結束。

b.盡量把kdebug的級别設定高一些,因為根據kdebug的級别來确定檔案/var/log/messages的詳細程度。

一個完整的ppp-on-dialer檔案如下:

exec chat -v /

TIMEOUT 3 /

ABORT '/nBUSY/r' /

ABORT '/nNO ANSWER/r' /

ABORT '/nRINGING/r/n/r/nRINGING/r' /

ABORT '/nUsername/Password Incorrect/r'/ 此行可縮短由于賬号密碼不正确的驗證時間

'' /rAT /

'OK-+++/c-OK' ATH0 /

TIMEOUT 30 /

OK ATDT163 /

sername:--sername: 163 /

assword: 163 /

大家說以上配置對嗎?檔案配置是對的,但是問題不少。我還是以實際問題來做具體分析吧(前提:無論外貓内貓均已裝好,檢查指令:echo "echo ATDT 163">/dev/modem),在/etc/ppp目錄下鍵入了./ppp-on指令後,出現如下錯誤:

1.TR的亮,無撥号音。

解決辦法:

首先檢查ppp-on-dialer檔案的權限,設為chmod 7 ppp-on-dialer

然後檢視ppp-on-dialer檔案,每行後面的 "/"是否存在

最後檢視倒數第三行ok ATDT$TELEPHONE的電話号碼是否設定正确,注意這裡需設為實際電話号碼,不是變量

2.在/var/log/messages檔案中出現如下提示:

21:13:32 ken pppd[657]: CCP terminated by peer

21:13:32 ken pppd[657]: Compression disabled by peer.

或直接出現connect scripts fail提示(反複N次均為如下提示)

注意:在ppp-on-dialer檔案的chat -v表示通過syslogd将用戶端與伺服器端建立連結的會話資訊寫入了/var/log/messages檔案,如果你要檢視這個會話資訊,請鍵入tail -f /var/log/messages或者tailf /var/log/messages,這些資訊對于正确配置撥号腳本檔案很有用.

解決辦法:

首先檢查賬号密碼是否正确

然後就可能是chat會話程式本身的問題,大家看一下面一個例子:

成都天府熱線163在minicom下的提示:

***********************************************

*Quidway A8010 Internet Server

*welcome!!

***********************************************

please input username:

please input password:

成都天府熱線169在minicom下的提示:

*** Welcome To TianFu Online EeYing01-11 ! ***

login:

password:

大家可能注意到有什麼不同了吧!也就是不同撥号伺服器對于賬号密碼輸入提示的不同,用過windows撥号終端的朋友可能會知道,那麼windows撥号為什麼沒有這個問題,因為這是chat程式本身的問題:不能根據撥号伺服器對于賬号密碼的提示不同而send賬号和密碼,解決辦法:用minicom去得到正确的提示,根具提示修改ppp-on-dialer檔案最後兩行的配置,這裡以成都天府熱線163,169在minicom下的提示為例:

163:

sername:--sername: 163 /

assword: 163 /

169:

ogin:--ogin: liujien /

assword: liujien /

這樣就完了嗎,沒有,這裡的配置還要根據你的isp的要求(hint),用minicom N次去得到正确的提示,不過你還要冒着你的isp修改賬号密碼提示的風險,是以我勸你放棄chat會話程式吧。因為kppp,wvdial都不存在這個問題.chat會話程式是force,而wvdial,kppp卻是guess.帶着這個問題我讀了ppp-2.4.1源碼的說明檔案,其實作者已在ppp-2.3.11版就已提供了PLUGINS PASSPROMPT(注:ppp-2.3.10版已提供插件支援,大家用redhat6.2自帶了ppp-2.3.11的RPM包,至于插件一般的國内的LINUX網站上提供的ppp源碼包都附帶有),這個插件提供給第三方程式将賬号密碼發送給你的isp的調用功能。相關内容的英文如下:

A new `passprompt' plugin is included, thanks to Alan Curry, which makes it possible for pppd to call an external program to get the PAP password to send to the peer.

那麼到底如何使用這個plugin呢?在包含pppd.h頭檔案的目錄下編譯passprompt.c檔案

gcc -c -O passprompt.c

gcc -shared -o passprompt.o

大家就可得到一個passprompt.so的共享連結檔案,将之拷貝到/etc/ppp/plugins目錄下,修改/etc/ppp/options檔案,加入一行plugin /etc/ppp/plugins/passprompt.so,然後你就可修改ppp-on檔案的将DIALER_SCRIPT指向你所要指定的腳本檔案,可自程式設計式或者在網上去下載下傳一個第三方程式。

我給大家提供了一個簡單方法,大家可安裝wvdial撥号程式,然後在gnome下将/etc/wvdial.conf檔案配置好,在/etc/ppp目錄下建立一個腳本,命名為wvdial,内容如下wvdial 163 (163是你所要撥号的電話号碼),然後chmod 7 wvdial,修改ppp-on檔案,如:DIALER_SCRIPT=/etc/ppp/wvdial /

3.用戶端已得到一個ip位址(用ifconfig 指令即可看到),通過域名無法浏覽網頁,通過ip位址可以。

解決辦法:

一般的辦法:去查isp給你提供的手冊,得到域名伺服器的ip位址,修改/etc/resolv.conf檔案如下:nameserver 61.139.2.69(我以成都163為例),還可以在windows下用ipconfig /all指令也能得到dns伺服器位址,因為windows的撥号程式預設設定為:自動獲得dns伺服器位址。

軟體作者給我們提供的辦法:

what was new in ppp-2.3.6.

**************************

Added new option `usepeerdns', thanks to Nick Walker . If the peer supplies DNS addresses, these will be written to /etc/ppp/resolv.conf. The ip-up script can then be used to add these addresses to /etc/resolv.conf if desired (see the ip-up.local.add and ip-down.local.add files in the scripts directory).

軟體作者在ppp-2.3.6版即提供了類似于windows 撥号程式的選項:usepeerdns,如果你的isp提供dns伺服器位址,将在/etc/ppp/resolv.conf檔案及/etc/resolv.conf檔案中寫入主要域名伺服器位址和輔助域名伺服器位址,如下:

nameserver 61.139.2.69

nameserver 202.103.4.5

如何設定:修改/etc/ppp/options檔案,添加一行"usepeerdns"

後記:

在這裡筆者抛磚引玉,對linux腳本撥号上網并沒有作太多深入的探讨,隻是就圍繞幾個常見的問題進行了分析并提供了比較簡單的解決辦法.希望大家能夠多讀一些軟體作者給我們提供的英文說明檔案,因為國内的有些資料太過陳舊,不要沒有耐心去讀man pages,他們很有用,不過去讀一讀某些網站的文章是一個不錯的選擇。如果大家對我的文章有不同的看法,請給我寫信,不吝賜教,謝謝.