既然是撥號上網,就不能不提到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 115200 \
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
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