本文以step by step的方式介紹了linux下如何撥出和撥入,就是如何讓linux機器做ppp的客戶端和服務器,并且介紹了回撥服務器的設置。本文盡力做到由淺入深,條理清楚。如果你對linux的撥號一竅不通,通過閱讀本文,再加上你的實踐和努力,精通linux撥號并非難事。
--------------------------------------------------------------------------------
版權聲明:
本文版權屬于胡曉峰。本文件可以在非商業目的下自由傳播,但必須保持本文的完整,并包含本版權聲明。如果要將本文的全部或部分用于商業目的,需要得到本人同意。
目錄
Linux的撥號設置(撥出與撥入) *
目錄 *
1. Linux下如何撥出(客戶) *
1.1編譯內核使其支持ppp *
1.2設置串行端口和調制解調器 *
串口設備文件 *
設置中斷號和I/O地址 *
設置調制解調器 *
1.3掌握你的ISP的信息 *
1.4安裝撥號所需軟件 *
1.5手動方式建立ppp連接 *
用minicom測試撥號 *
用pppd建立ppp連接 *
斷開連接 *
1.6使ppp連接自動化 *
pppd腳本ppp-on *
chat腳本ppp-on-dialer *
撥號上網 *
斷開連接 *
1.7設置域名解析(DNS) *
設置域名服務器 *
自動化 *
1.8其他問題 *
2. linux下如何撥入(服務器) *
2.1設置基本的撥號服務器 *
使linux能夠接受電話撥入 *
啟動pppd與客戶建立ppp連接 *
針對win95客戶的特殊設置 *
2.2回撥(callback) *
服務器端設置 *
客戶端設置 *
2.3小結 *
Linux下如何撥出(客戶)
本節的目的是在linux下設置ppp,使其能撥號并連接到你的ISP,從而將你的機器與Internet相連,進而你就可以在網上為所欲為了,呵呵。
我喜歡條理清晰的文章,所以我寫的東西也盡量做到有條理。下面就是linux ppp客戶端設置的一般步驟:
編譯內核使其支持ppp。
設置串行端口和調制解調器。
掌握你的ISP的信息。
安裝撥號所需軟件并進行設置。
手動方式建立ppp連接。
使ppp連接自動化。
設置域名解析(DNS)。
其他問題。
1.1編譯內核使其支持ppp
要實現ppp客戶,一是需要內核支持ppp,另外就是需要ppp的軟件pppd(ppp daemon)。編譯內核雖然不難,但也并非簡單的一塌糊涂,慶幸的是,在大多數情況下,你不用重新編譯你的內核。我使用的是RedHat 6.0,它帶的內核就已經支持ppp了。其他各種發布版本的linux內核也是支持ppp的。如果你在使用自己編譯的內核,你就要注意這個內核是否支持ppp。編譯內核并不是本文的范圍,如果你確實要自己重新編譯內核,請查閱相關文檔。
1.2設置串行端口和調制解調器
串口設備文件
調制解調器是串行設備,外置的需要連到一個串口上,內置自己有一個串口。大家知道,UNIX系統對外設的操作都是通過特定的設備文件完成的,Linux下串口設備文件的命名和DOS的關系如下:
* DOS COM1 = Linux /dev/cua0 (and /dev/ttyS0)
* DOS COM2 = Linux /dev/cua1 (and /dev/ttyS1)
等等
一般來說/dev/cua*是用來撥出的,/dev/ttyS*是用來撥入的,但現在好像已經不加以區分了,統統用的是/dev/ttyS*。如果你的機器上沒有/dev/ttyS*,你需要用mknod來自己建立這些設備文件,但有個腳本程序MAKEDEV可以簡化這個工作:
# cd /dev
# ./MAKEDEV ttyS0
設置中斷號和I/O地址
你不需要閱讀這一節,除非你想要使用三個或更多的串行設備,比如一個串行鼠標,三個modem。
一般來講COM1和COM3共用IRQ3,COM2和COM4共用IRQ4,一個設備必須唯一對應一個IRQ號才行,如果有三個以上的串行設備,就要把別處沒用的中斷號拿過來用了。使用如下命令設置中斷號:
/sbin/setserial /dev/ttyS0 irq 3 #串行鼠標
/sbin/setserial /dev/ttyS1 irq 4 # MODEM 1
/sbin/setserial /dev/ttyS2 irq 5 # MODEM 2
/sbin/setserial /dev/ttyS3 irq 9 # MODEM 3
你有必要將這些命令放在/etc/rc.d/rc.local中,使其在linux啟動時運行。你可以使用
cat /proc/interrupts
來察看系統的中斷設置,以確保沒有中斷沖突。
I/O地址與中斷一樣,必須唯一。你可以設置硬件跳線來改變I/O地址。一般串行口的I/O地址是這樣的:
ttyS0 address 0x3f8
ttyS1 address 0x2f8
ttyS2 address 0x3e8
ttyS3 address 0x2e8
一般情況下,你沒有必要改變串行口的I/O地址??梢允褂妹?
cat /proc/ioports
來察看系統的I/O地址設置,以確保沒有沖突。
設置調制解調器
一般情況下,調制解調器的出廠設置就很合適了,不用改變什么。但如果你把調制解調器搞得一塌糊涂,就需要對它進行從新設置。由于我這方面沒有實踐經驗,如果你真的不幸遇到這種情況,就去看看調制解調器的說明吧。
需要說明的是,linux不支持所謂winmodem,這種modem需要特殊的windows驅動程序才能使用,目前還沒有linux下的驅動。據說這種winmodem就是所謂的“軟貓”,我看有點像。
1.3掌握你的ISP的信息
由于你是通過ISP與Internet連接的,所以掌握ISP的信息對于你撥號是很重要的,下面列出了你應該知道的基本信息:
撥號服務的電話號碼
服務器使用動態IP地址分配還是靜態的IP?
ISP 的域名服務器(DNS)IP地址是什么?
登錄服務器時都要回答什么問題?
如果服務器是Windows NT,它是否使用微軟的PAP/CHAP系統?
這里可能會有一個問題.Windows 95系列的撥號設置允許讓DNS的地址在連線過程中傳到客戶端。因此你的ISP可能會告訴你不需要知道DNS服務器的IP地址。對于Linux來說,它不允許在連線之時動態地指定DNS的IP地址。所以你需要知道DNS地址并自己設置DNS。
對于第5點,由于我沒有實踐經驗,并且實際應用比較少見,就不做討論了。請參閱相關文檔。
1.4安裝撥號所需軟件
ppp客戶所需的程序有chat和pppd,如果你的機器上還沒有這兩個程序,就要安裝它們。在RedHat中,使用如下命令:
rpm -Uvh ppp-2.3.7-2.i386.rpm
另外還有一個終端通訊程序minicom,在我們這里是用來測試撥號用的,也要安裝上。
rpm -Uvh minicom-1.82-5.i386.rpm
chat程序的用途是撥號并等待提示,根據提示輸入用戶名和密碼等登錄信息。pppd的用途是建立并維持與服務器的ppp連接,傳輸數據。
1.5手動方式建立ppp連接
在進行了上面4項內容后,我們就要進行撥號了!這一節介紹的是一種手動的方法,目的是用來測試的。不管是手動還是后面要講的自動方式,整個ppp連接很明顯的分成兩個步驟:
撥通ISP的電話,建立物理線路的連接,并啟動ISP端的pppd程序。
啟動本機的pppd程序與服務器端的pppd進行握手,建立ppp連接。
你會在以后的敘述中很清楚的看到這兩個步驟。
如果你想節約時間,可以越過本節,直接配置自動ppp。但是作為step by step的建議,你還是應該閱讀本節,雖然你并不一定要實際的操作它。
用minicom測試撥號
首先我們用minicom測試一下,看看能否撥通ISP。我使用的是RedHat6.0自帶的minicom,其他版本的minicom可能熱鍵不同。在運行minicom之前,需要建立/dev/modem這個設備文件,比如我的modem接在COM2上,使用如下命令建立/dev/modem:
ln /dev/ttyS1 /dev/modem
運行minicom,輸入Ctrl-A,再敲Z就可以看到幫助,此時按D,就是撥號,會出現一個界面,此時選擇manual(手動),并輸入ISP的電話號碼,調制解調器一陣亂響之后,會有幾聲音樂響,并在屏幕上提示按任意鍵繼續,按任意一個鍵,就會出現你ISP的信息,并提示輸入username,password,有可能還要提示你選擇ppp連接還是slip連接等等?,F在服務器端的pppd應該被啟動,表現就是會出現如下的垃圾字符:
}8}!}$}%U}"}&} } } } }%}& ...}}"}(}"} .~~y}
至此,說明你的機器撥號正常,可以與你的ISP正常連接。在這一步,你需要記錄下撥號服務器的提問,以及你的回答,以便今后實現自動撥號。
用pppd建立ppp連接
上面只是測試撥號能否成功,下面就是要建立ppp連接。
還是用minicom,如前所示進行撥號,直到出現垃圾字符,此時退出minicom(Ctrl-A,Q),注意:不是reset,只是退出。然后執行pppd程序如下:
pppd debug lock modem crtscts defaultroute /dev/ttyS1 115200&
debug是說要在/var/log/messages留下調試信息。Lock是說鎖定串口設備。Modem是說用調制解調器的控制信號。Crtscts是說使用硬件數據流控制,defaultroute 是說在本機路由表中加入一項缺省路由,它使你不僅能連到撥號服務器,還能通過它連接整個Internet。/dev/ttyS1是說modem在COM2口上,115200是串口的速率。&是說這個程序在后臺執行。
等一段時間,ppp連接建立之后,運行ifconfig,這是你就會看到ppp0的網絡接口,并能看出你被分配的ip地址和對端服務器的ip地址。運行route,你會看到對端服務器的ip地址也被加入了路由表。好了!你的撥號成功了!此時可以ping一下Internet上的某個主機的IP地址,因該是沒問題的。
現在還不能使用域名,因為還沒配(廢話)。
如果你的機器本身是連在局域網上的,你要確保在撥號之前沒有缺省路由,就是在route命令中看不到default或0.0.0.0。原因很簡單,撥號會產生一個缺省路由,如果原來就有一個,撥號產生的缺省路由就不起作用,你就不能連到Internet上,而還是在局域網里??梢杂妹?
route del -net default
刪除以前的缺省路由,再進行撥號,從而使撥號產生的缺省路由有效。
怎樣才能知道ppp連接建立了呢?在一個單獨的虛擬控制臺上運行
tail -f /var/log/messages
你就可以動態的觀察各種日志信息,包括pppd的調試信息。當你看到:
Jun 23 16:10:31 hxf pppd[1234]: local IP address 210.78.131.151
Jun 23 16:10:31 hxf pppd[1234]: remote IP address 192.168.10.21
這樣的信息就說明ppp連接成功了,服務器已經給你分配了地址,接著你就可以運行ifconfig、route、ping等程序來測試你的撥號網絡了!當然,如果沒有成功,你也可以根據pppd的調試信息判斷錯誤原因,以便進行改正。
斷開連接
當測試通過后,需要把連接斷掉,使用如下命令:
killall pppd
1.6使ppp連接自動化
在經過手動連接測試之后,我們就要把這些變成自動的,我們的目的是只用一個命令就能實現撥號連接。
前面我們說過,要使撥號自動化需要兩個程序chat 和pppd。在RedHat6里,它們包含在ppp-2.3.7-2.i386.rpm這個包里面,安裝這個軟件包,就會生成/etc/ppp目錄和/usr/doc/ppp-2.3.7目錄,在/etc/ppp目錄中是幾個pppd的配置文件,在/usr/doc/ppp-2.3.7中是pppd的文檔,在scripts子目錄里有如下幾個文件:
/usr/doc/ppp-2.3.7/scripts/ppp-on # pppd程序的腳本文件
/usr/doc/ppp-2.3.7/scripts/ppp-on-dialer # chat程序的腳本文件
/usr/doc/ppp-2.3.7/scripts/ppp-off #斷線腳本文件
這就是我們要討論的幾個文件。我們需要修改的是前兩個文件。
ppp-on-dialer的功能是完成撥打電話,并輸入所需登錄信息完成登錄,并啟動服務器端的pppd,就是我們曾經看到的垃圾字符。ppp-on-dialer實際上就是完成我們在測試時用minicom撥號所實現的那部分功能。
ppp-on的功能就是測試時pppd程序完成的功能,它啟動本機的pppd,與服務器端的pppd進行對話,實現端對端(ppp)的連接。
我們的目的是把這兩部分連接起來,用一個命令就能完成整個撥號連接的過程,這是通過pppd程序的一個參數connect完成的,你會在下面看到它的用法。下面就詳細介紹這兩個腳本文件:
pppd腳本ppp-on
下面就是ppp-on的內容,我們先來看看有什么東西:
----------------------------------------------------------------------------------
#!/bin/sh
#
# Script to initiate a ppp connection. This is the first part of the
# pair of scripts. This is not a secure pair of scripts as the codes
# are visible with the ps command. However, it is simple.
#
# These are the parameters. Change as needed.
TELEPHONE=555-1212 # The telephone number for the connection
ACCOUNT=george # The aclearcase/" target="_blank" >ccount name for logon (as in George Burns)
PASSWORD=gracie # The password for this account (and Gracie Allen)
LOCAL_IP=0.0.0.0 # Local IP address if known. Dynamic = 0.0.0.0
REMOTE_IP=0.0.0.0 # Remote IP address if desired. Normally 0.0.0.0
NETMASK=255.255.255.0 # The proper netmask if needed
#
# Export them so that they will be available at ppp-on-dialer time.
export TELEPHONE ACCOUNT PASSWORD
#
# This is the location of the script which dials the phone and logs
# in. Please use the absolute file name as the $PATH variable is not
# used on the connect option. (To do so on a oot account would be
# a security hole so don ask.)
#
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
#
# Initiate the connection
#
# I put most of the common options on this command. Please, don
# forget the lock option or some programs such as mgetty will not
# work. The asyncmap and escape will permit the PPP link to work with
# a telnet or rlogin connection. You are welcome to make any changes
# as desired. Don use the defaultroute option if you currently
# have a default route to an ethernet gateway.
#
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS0 38400
asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP
noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT
-----------------------------------------------------------------------------------
帶#的行是注釋,藍顏色的地方是你應該注意并根據實際情況修改的。
文件的前一部分定義了ISP的電話和用戶信息,并用export命令將這幾個變量輸出到當前運行的環境中,使它們可以在其他文件中被使用,一會兒我們將看到在ppp-on-dialer文件中使用了這幾個變量。
在文件的中間部分定義了變量DIALER_SCRIPT,它的值是ppp-on-dialer的完整路徑,你要根據你的具體情況加以修改。
文件尾部就是我們曾經見過的pppd和它一大堆的參數,exec是執行的意思,每一行末尾有一個“”,表示這一行沒有結束,下一行的內容是這一行的繼續,不算兩行。這里我們需要修改的是modem的串行口設備文件和速率,串口速率我一般都寫成115200,不要認為這是modem的速率,這只是串口速率,修改這個值不能提高你的modem速率。其他參數有些我們已經做過說明,connect $DIALER_SCRIPT的意思是通過執行DIALER_SCRIPT所指的撥號腳本,實現撥號。通過connect參數,把ppp-on和ppp-on-dialer兩個腳本聯系起來,實現整個撥號連接過程。
chat腳本ppp-on-dialer
現在你應該明白ppp-on和ppp-on-dialer的關系了,下面就看看ppp-on-dialer是怎么實現自動撥號的:
-----------------------------------------------------------------------------------
#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
exec chat -v
TIMEOUT 3
ABORT BUSYr
ABORT NO ANSWERr
ABORT RINGINGrnrnRINGINGr
rAT
OK-+++c-OK ATH0
TIMEOUT 30
OK ATDT$TELEPHONE
CONNECT
ogin:--ogin: $ACCOUNT
assword: $PASSWORD
-----------------------------------------------------------------------------------
整個腳本就是一個程序chat和它的一堆參數。
-v是說把調試信息寫入/var/log/messages。TIMEOUT 3是說以下操作的超時時間為3秒。3個ABORT是說如果收到服務器的BUSY等消息就退出chat程序?!啊笔鞘裁炊疾坏?,直接發出“AT”指令,開始與服務器對話。當收到OK-+++c-OK字符串后發出ATH0指令。然后TIMEOUT 30將超時時間設成30秒。在收到OK字符后,發出ATDT$TELEPHONE指令,ATDT的意思是撥電話,號碼就是在ppp-on腳本中定義的那個TELEPHONE。電話撥通后會收到CONNECT字符,發出一個空串“”。下面就是收到驗證用戶的提示并發出用戶信息了。這里要改成你的ISP的具體提示,比如有的提示用戶名不是用Login:而是用username:,你需要根據實際情況修改。還有的ISP在問完用戶名和密碼后還有別的提示,比如263就會問你
Please select Protocol:
1:PPP;
2:SLIP;
3:Exit;
Please select(1~3):
根據263的提問修改后的最后幾行就像下面這樣:
username: $ACCOUNT
assword: $PASSWORD
" select(1~3):" 1
注意不要落掉password行最后的“”。因為在select(1~3):中有~等特殊字符,所以要把整個字符串加上引號表示是一個整體。
現在我們明白了整個過程:
由pppd調用chat程序
chat程序負責撥號登錄,啟動服務器端的pppd,然后chat結束
由pppd繼續chat的工作,與服務器端的pppd進行握手,建立ppp連接
撥號上網
上面我們說明了原理,下面就來試一試。
我們將/usr/doc/ppp-2.3.7/scripts/的幾個文件拷到自己喜歡的地方,比如/etc/ppp/,按照上面所說的進行修改。然后將這三個腳本文件改成可執行的,用如下命令:
chmod +x ppp-o*
在腳本所在目錄運行
./ppp-on
你將會聽到modem撥號的聲音。與此同時,你應該對這個過程進行監視,在另外一個虛擬終端上(Alt+F1~F6可以切換6個虛擬控制臺,X-Windows就運行另一個終端程序就可以了)運行:
tail -f /var/log/messages
來監視chat和pppd程序的運行情況,你會看到chat程序與撥號服務器的對話過程,并將看到pppd的連接過程,最后pppd報告說本機和遠端機器的IP被分配好了,就像我們在測試的時候看到的那樣,這時ppp連接就建立好了。接著你就可以用ifconfig和route命令察看網絡接口和路由,ping網上的其他IP地址。你的撥號成功了!
斷開連接
斷開連接就用ppp-off腳本,運行
./ppp-off
在執行tail -f /var/log/messages的那個終端上你就會看到斷開連接的信息,告訴你這次連接持續了多長時間,發送接收了多少字節等。
至此,ppp的自動化就完成了。有關pppd和chat的其他參數的意思請查閱man手冊,這里就不再解釋了。
1.7設置域名解析(DNS)
到這里我們已經可以像win95一樣方便的使用撥號網絡了。但是還有一個域名服務器問題沒有解決。Win95上撥號時,域名服務器的地址是服務器傳過來的,但linux下就沒有這么方便,域名服務器需要自己設定。
設置域名服務器
/etc/resolv.conf文件是存放域名服務器地址的地方,它的內容看起來是這樣的:
-------------------------------------------------------------
domain your.isp.domain.name
nameserver 202.96.0.133
nameserver 202.96.1.133
-------------------------------------------------------------
你所需做的就是把你的ISP的域名服務器地址填到這個文件里。如果你連在一個局域網里,并設置了局域網的域名服務器地址,不要擔心,就把你的ISP的域名服務器地址加在下面好了,查找域名時是按先后順序的。
現在你的域名也設好了,你可以ping某個域名了。從此你將享受完整的網絡功能!
自動化
你也許想只在撥號才加上域名服務器地址,別的時間不想要,除了手動之外,還可以讓這個過程自動化。你可以建立/etc/ppp/ip-up.local和/etc/ppp/ip-down.local兩個可執行的腳本文件,pppd啟動之后,會執行/etc/ppp/ip-up.local里的命令,而pppd結束時,會執行/etc/ppp/ip-down.local里的命令。你可以先生成一個包含域名服務器的文件,在ip-up.local中將這個文件改成/etc/resolv.conf,并將/etc/resolv.conf保存下來。在ip-down.local中再將保存的/etc/resolv.conf恢復回來。這樣就可以實現添加域名服務器的自動化了。
1.8其他問題
至此,linux下如何撥出(客戶)就介紹完了。我想不出還有什么問題了。呵呵。如果你還有什么問題,可以與我聯系,希望我能會(我也并非全能呀,呵呵)。
linux下如何撥入(服務器)
這一節我們的目的是將自己的linux設置成跟ISP一樣的撥號服務器。我們假設你在公司用linux設置了撥號服務器,然后在家里通過撥號連到公司的撥號服務器上,進而訪問公司的局域網,如此就可以實現“家庭辦公”了。如果公司是連在Internet上的,你就可以瀏覽Internet了。 “設置基本的撥號服務器”這一節就告訴你怎樣實現這一功能?!盎負埽╟allback)”這一節講述怎樣節省聯網所需的電話費。
因為我們已經講過如何用linux做ppp客戶,所以這一節我們用win95做客戶來配合講述linux的服務器,因為畢竟win95做客戶還是多數么。
2.1設置基本的撥號服務器
在這一節里,我們一步一步的建立撥號服務器,力求做到條理清楚。做撥號服務器的方法很多,這里講的只是其中一種方法而已。
我們首先要確保linux的內核支持ppp,并且支持IP轉發(IP forwording),這個功能讓你通過linux撥號服務器訪問局域網上其他的機器,進而訪問Internet,而不只是撥號服務器本身。幸好現在的linux發布版本所帶的內核都支持這些功能,如果你使用自己編譯的內核,你就要注意這個問題了。
在內核支持IP轉發之后,還要激活IP轉發這個功能。使用如下命令:
echo "1">/proc/sys/net/ipv4/ip_forward
如果使用RedHat,可以將/etc/sysconfig/network文件里的FORWARD_IPV4=false改成true就行了。之后需要重啟動以激活IP轉發。
使linux能夠接受電話撥入
要實現這個功能,要用到一個叫getty的程序,它的功能就是向用戶顯示login:和password:這樣的登錄提示,并調用login程序實現登錄。我們平時在局域網里用telnet登錄某臺unix主機時,也是這個過程。只不過現在我們走的物理線路不同,我們走的是電話線—〉modem—〉串口,而telnet程序走的是網線和網卡。
目前linux上有三種getty:getty_ps,agetty,mgetty。getty_ps就是所說的getty,另外兩種也都實現了getty的功能。其中mgetty的功能比較強大,我們決定就用mgetty了。
RedHat6包含了mgetty的四個軟件包,mgetty-1.1.14-8.i386.rpm是必須安裝的,如果你要用回撥功能,就要安裝mgetty-sendfax-1.1.14-8.i386.rpm,callback程序包含在這個包里(不明白為什么在這個包里)。我反正不管那么多,rpm -Uvh mgetty*,全安裝上算了。
我們現在要做的就是使modem所接的那個串口可以接受外來連接。打開/etc/inittab,你會看到這樣的幾行:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
在這幾行之后,加上如下一行:
7:2345:respawn:/sbin/mgetty ttyS1
它的意思就是讓mgetty在串口ttyS1上監聽,等待連接,如果有連接請求,mgetty就向用戶提示用戶名和密碼。Mgetty也有好多參數,預知詳情,請看mgetty的手冊頁。注意:程序的名字是megtty而不是上面幾行寫的mingetty。Mingetty是RedHat自己的終端程序,它不支持modem連接。我的一個同學曾經把mgetty錯敲成mingetty,結果怎么撥電話,linux也不接。另外,這行開頭的數字“7”并不是一定的,只要是在文件中沒有重的,唯一的就行了,可以是兩個字符或數字。
改好之后,要使修改有效,運行:
init q
為了從遠端登錄,我們要有一個賬號,用useradd命令加一個叫ppp的用戶,并用passwd命令為它設置口令。
下面我們就用win95的客戶來試一試,我們在win95下新建一個連接,電話號碼當然要填對,然后右鍵單擊這個連接,依次選擇屬性-〉常規-〉設置-〉選項,將“撥號后出現終端窗口”打上勾,再按兩次確定關閉對話框?,F在雙擊這個連接,用戶名和密碼不用填,直接按“連接”,你會聽到撥號聲和一陣亂叫,接著會彈出一個黑底白字的窗口,這就是登錄的終端窗口了!你會看到這與你登錄linux時是一樣的,輸入用戶名ppp和密碼,你看到的是shell提示符,你通過modem登錄到linux主機上了!但這種終端的形式上網,并不是ppp連接,相信你一定不會滿意,你需要的是有WWW,FTP等豐富功能的網絡。我們下面就來看看怎么實現ppp連接,現在在shell提示符下輸入exit退出。
啟動pppd與客戶建立ppp連接
上面一小節已經實現跟telnet差不多的終端聯網,但還很不夠,現在我們要用pppd實現端對端的連接,實現真正的聯網。
為了給客戶分配IP地址,我們要編輯一個新文件:/etc/ppp/options.ttyXX。文件名中的ttyXX就是你所用到的串口設備文件,我的就是/etc/ppp/options.ttyS1。在這個文件中給出一個IP地址對,就像這樣:
10.39.1.1:10.39.1.123
冒號前面的的撥號服務器的IP地址,后面的是要分配給客戶的IP地址。
在前面講述ppp客戶時我們已經清楚,pppd程序要在服務器和客戶機分別啟動,并進行握手,實現連接??蛻舻膒ppd程序現在是用win95的撥號網絡,我們就不管了,服務器端的pppd怎么啟動呢?誠然,你可以登錄后手工輸入下面命令來啟動pppd:
pppd debug proxyarp asyncmap 0 lock modem crtscts
但這似乎太過麻煩,我們需要pppd能自動啟動,下面就來看看怎么搞!
打開/etc/passwd文件,找到用戶ppp的哪一行,差不多是這樣的:
ppp:x:500:500::/home/ppp: /bin/bash
你可以看出用戶ppp使用的shell程序是bash,我們現在要做的就是用pppd換掉這個bash,這樣當用ppp登錄時,就不會執行bash,而是執行pppd,如此,pppd就在服務器端啟動了。
具體我們可以這樣做:在/etc/ppp建立一個ppplogin文件,內容如下:
#!/bin/sh
exec /usr/sbin/pppd debug passive asyncmap 0 proxyarp lock modem crtscts
pppd的參數大多都見過,其中proxyarp的意思就是讓ppp客戶通過ppp服務器訪問網上其他機器,而不只是ppp服務器一臺。將ppplogin設成可執行的:
chmod +x ppplogin
用ppplogin替換用戶ppp的登錄shell,就像這樣:
ppp:x:500:500::/home/ppp:/etc/ppp/ppplogin
由于pppd執行必須要root權限,還要將pppd設成以root權限執行:
chmod u+s /usr/sbin/pppd
替換了登錄shell和修改pppd屬性之后,我們來試一試。與上一小節一樣的進行撥號,在輸入了用戶名和密碼之后,你是否看到pppd所特有垃圾字符?并且一行一行的沒完?如果看到的話,恭喜你!服務器端pppd已經啟動了!你接著點繼續按鈕,也就是啟動客戶的pppd,與服務器的pppd進行握手,一會兒,你就會看到登錄網絡成功,那個熟悉的綠色小電腦又出現了!你是不是意識到什么?對了!你可以上網了!如果你使用linux做客戶的話,工作就完成了。但是由于win95的一些特殊要求,我們還要針對win95做一些特殊設置。
針對win95客戶的特殊設置
前面談到了win95與linux做客戶,對域名服務器的要求是不一樣的。Win95要求域名服務器在連接的時候傳給它,這在linux撥號服務器上怎么做呢?
如果你看過pppd的手冊頁,你可能已經看到pppd有個參數ms-dns,它就是用來傳dns給客戶的。在你的ppplogin里加上這個參數就可以了,比如:
#!/bin/sh
exec /usr/sbin/pppd debug passive asyncmap 0 proxyarp lock
modem crtscts ms-dns 10.39.0.133 ms-dns 10.39.1.133
兩個dns第一個是主,第二個是輔。
在前面講win95撥號時,我們使用“撥號后出現終端窗口”,然后手工輸入才登錄上的,而別的ISP卻不是這樣。我們把“撥號后出現終端窗口”選項去掉,按照常規在撥號對話框里填入用戶名和密碼,但這樣會出錯,怎樣才能按照常規那樣撥號不用彈出終端窗口呢?
Mgetty有幾個配置文件在/etc/mgetty+sendfax,其中login.config是比較重要的。在login.config中有下面這樣一行:
#/AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap login debug modem crtscts proxyarp lock
我們把行首的注釋#去掉就行了。由于撥號連接可以是ppp也可以是slip,Win95客戶與撥號服務器對話的時候,要求自動使用ppp,win95客戶向撥號服務器發出某種信號,讓撥號服務器自動啟動ppp。我們這里所做的就是讓mgetty響應這個信號并啟動pppd實現AutoPPP。我們看到這里的pppd程序的參數多了幾個:auth -chap +pap login,我們只要知道這些跟win95的安全認證有關系就行了,具體含義請看pppd的手冊頁。為了支持這幾個參數,需要編輯/etc/ppp/pap-secrets文件。這個文件是pap認證用的,我們不做研究,在里面填上一行最通用的就行了,如果你要對用戶進行安全認證,請參閱pppd所帶的例子和相關的文檔。這個文件的內容就像這樣:
# Secrets for authentication using PAP
# client server secret IP addresses
* * "" *
現在我們用win95建立一個新的撥號連接,就像連接別的ISP一樣輸入用戶名和口令,也可以在“保存口令”上打上勾,好了,連接吧!你會看到你的linux撥號服務器工作的像別的ISP一樣好!
2.2回撥(callback)
Callback就是當用戶撥號連到撥號服務器時,服務器先斷掉連接,然后再撥回給用戶,用戶的modem接收這個呼叫,從而建立撥號連接。如此,電話費就是撥號服務器來付了,這樣就給所謂“家庭辦公”創造了有利條件,你可以在家里用回撥的方式連到公司進行辦公,而不必擔心電話費了。
服務器端設置
在設置之前,你應該確保mgetty的callback程序安裝好了。
將下面這行內容加到/etc/mgetty+sendfax/login.config中:
call_hxf - - /usr/sbin/callback -d -l ttyS1 -s 115200 -S 62345678
前面的call_hxf是指為mgetty增加一個叫call_hxf的用戶入口。這個用戶只是mgetty用來啟動callback程序的,不是linux系統中的用戶,不要真的用useradd添加一個call_hxf用戶,這個call_hxf用戶名只是mgetty用的,不是系統的。當用戶通過modem連到linux上,mgetty向用戶提示輸入用戶名時,如果輸入的是call_hxf,mgetty就調用/usr/sbin/callback程序來處理回撥。參數-d是指在/var/log/mgetty.ttyS1留下調試信息,-l ttyS1是指使用ttyS1為撥出設備,-s 115200是串口速率,-S 62345678是指定的回撥電話號碼,如果沒有-S參數,mgetty就會提示你輸入回撥的目的電話號碼?;诎踩目紤],建議在這里指定回撥的目的號碼,不然的話,別人用call_hxf登錄同樣也可以使用回撥了。關于Callback的詳細信息請察看手冊頁。
現在我們來試一試,在win95,還是使用那個“撥號后出現終端窗口”的撥號連接,當出現終端窗口并提示login時,輸入call_hxf,如果你在login.config中沒有指定回撥號碼,現在就有提示問你回撥的電話號碼了,輸入現在你使用的號碼,此時服務器斷開電話準備回撥,但是win95會認為服務器斷了,彈出一個對話框告訴你服務器斷開連接,請稍候在試。一會兒,你就會驚喜的聽到你的電話在震鈴,服務器正在回撥,但是win95已經不理會了,看來win95上還要搞一搞才能協調起來?,F在你還是把linux服務器上的那個callback進程kill了吧,要不然它會一直播下去的,呵呵。
客戶端設置
服務器準備回撥的時候要把電話先斷掉,我們現在的目的是讓win95檢測不到這個變化,這樣win95就不會退出撥號程序了。我們打開所使用的撥號連接的屬性-〉常規-〉設置-〉連接-〉高級-〉附加設置,將AT&C這個命令寫在附加設置里。這個命令的意思就是讓串口的載波檢測(Carrier Detect)那根線保持有效,這樣win95就會認為電話一直是通的,服務器回撥時斷掉電話win95就檢測不出來了,這樣win95的撥號客戶程序就可以繼續與服務器對話并建立連接了。
下面的工作就是使win95能接聽服務器回撥的電話,并通過服務器的用戶認證。我們建立一個腳本文件callback.scp如下:
proc main
waitfor "ogin: "
transmit "call_hxf^M"
waitfor "number for callback: "
transmit "62345678^M"
waitfor "RING"
transmit "ATA^M"
waitfor "ogin: "
transmit $USERID
transmit "^M"
waitfor "assword: "
transmit $PASSWORD
transmit "^M"
endproc
我們在所使用的撥號連接的屬性-〉制作腳本里填上這個文件的全路徑和文件名。你需要根據你的情況修改藍色的地方
這個腳本很簡單,它由一個一個的waitfor--transmit對組成,收到登錄提示符login:,就發送callback的用戶名call_hxf。(這里login沒有第一個字母l,這是因為字母l有可能是大寫的L,就像這樣:Login:,為了不出錯,干脆就不要字母l了。同樣,下面的password也沒有字母p。)如果在服務器沒有指定回撥的電話號碼,現在就要問你了,在收到number for callback:這樣的字符串后,發送自己的電話號碼。如果服務器指定了號碼,這兩行就不要了。當你給了回撥號碼后(或服務器已經指定),服務器就掛斷電話,進行回撥??蛻舳说膍odem檢測到一個震鈴,就向串口發送一個RING字符串,win95從串口讀到這個字符串,就會向modem發出ATA命令,讓modem接聽這個電話。這樣連接就建立了。之后,mgetty向客戶提示輸入用戶名和密碼,這里的$USERID和$PASSWORD,就是引用你在撥號的那個對話框里填入的用戶名和密碼?!皳芴柡蟪霈F終端窗口”那個選項在這里就不需要了。那個“^M”可以理解成回車的意思。
現在我們來試一試,雙擊剛修改過“AT&C”的撥號連接,在用戶名和密碼填入ppp和它的密碼,這個ppp用戶的登錄shell是我們曾經改成ppplogin的。連接后你首先聽到你的modem在撥出,并與服務器對話,一會兒,你就聽到你的電話響了起來,這是服務器在回撥,你的modem立刻接起這個電話,并與服務器對話,安全認證通過之后,你熟悉的那個綠色小電腦又出現了!你的回撥成功了!在這個過程中,win95的撥號程序一直告訴你正在驗證用戶名和口令,因為它不知道我們在做回撥,所以只好認為是在驗證口令了。在整個回撥過程中,不要隨便按“取消”,因為服務器端的callback程序并不知道你取消了,它會一直撥你的電話的。這個callback程序的反應速度不是很快,在服務器斷掉電話到你聽到回撥的電話鈴聲,可能要等20秒到30秒的樣子,需要耐心等待。在回撥過程中,你會發現有一個被最小化的終端窗口,它就是你的callback.scp腳本文件執行時的窗口,你會在這里看到“NO CARRIER”,這是說沒有載波,因為你的設置了“AT&C”,所以沒有載波撥號程序也不會退出。在你聽到回撥的電話鈴聲時,你會在這個窗口里看到“RING”,這表示modem收到一個震鈴。接著你的callback.scp就會發出“ATA”接聽這個電話,如此這般,你的PPP就通了。
我們只講述了win95的客戶怎么配置回撥,linux下不準備說了,但是linux的pppd軟件包還帶了幾個腳本文件是用來支持回撥的。我們在搞清楚回撥的工作過程之后,參考這些腳本程序,就不難配置linux客戶的來支持回撥了。
2.3小結
至此,linux撥號服務器以及回撥服務器的配置就講完了。大概你可能覺得做服務器不如做客戶條理清楚,頭緒比較繁雜。的確,linux配置撥號服務器細碎的地方比較多,下面就把服務器的配置過程整理一下:
使IP轉發有效echo "1">/proc/sys/net/ipv4/ip_forward,RedHat可以修改/etc/sysconfig/network
安裝mgetty。編輯/etc/inittab文件,加入7:2345:respawn:/sbin/mgetty ttyS1這一行。init q使修改有效。
編輯撥號登錄文件ppplogin,內容就是執行pppd程序。將ppplogin設置成可執行chmod +x ppplogin。將pppd程序設置成以root權限執行chmod u+s /usr/sbin/pppd。
用useradd加一個撥號用戶,比如ppp。用passwd為這個用戶設置密碼。編輯/etc/passwd文件,修改此用戶的登錄shell為ppplogin。
為客戶分配IP地址,編輯文件:/etc/ppp/options.ttyXX,填入IP地址對。
為支持AutoPPP,修改/etc/mgetty+sendfax/login.config文件,把AutoPPP前的#去掉。再編輯/etc/ppp/pap-secrets文件,加入一行* * "" *,以支持AutoPPP。
以上是設置基本的撥號服務器的步驟,完成這些設置后,就可以進一步設置回撥服務器了,下面是設置回撥服務器的步驟。
Linux服務器:編輯/etc/mgetty+sendfax/login.config,加入一個回撥用戶,就是類似這樣的一行:call_hxf - - /usr/sbin/callback -d -l ttyS1 -s 115200
Win95客戶:打開所使用的撥號連接的屬性-〉常規-〉設置-〉連接-〉高級-〉附加設置,將AT&C這個命令寫在附加設置里。
Win95客戶:編輯并使用回撥腳本,如本文所述的callback.scp。
現在,你可以按照這些步驟來輕松的配置你的撥號服務器甚至是回撥服務器了!
至此,linux下的撥出和撥入就全部介紹完了。本文是以實用為目的,介紹我的一些經驗,并沒有講述很多理論。如果有錯誤或是不足還請指出,也讓我提高提高。希望這篇文章對你有所幫助。謝謝。
作者:胡曉峰