標籤:
Linux下3G指令碼撥接(2010-7-5 13:08) 既然是撥接,就不能不提到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 <[email protected]>. 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,他們很有用,不過去讀一讀某些網站的文章是一個不錯的選擇。如果大家對我的文章有不同的看法,請給我寫信,不吝賜教,謝謝.
Linux下3G指令碼撥接(轉)