28.3. 使用内核级PPP

Parts originally contributed by Gennady B. SorokopudRobert Huff.

警告:

这节内容只在 FreeBSD 7.X 上可用。

28.3.1. 设立内核级PPP

在开始配置 PPP 之前, 请确认 pppd 已经存放在 /usr/sbin 中, 并且 /etc/ppp 目录是存在的。

pppd能在两种模式下工作:

  1. 作为一个 客户 ── 您要通过PPP串行线或modem线把您的机器连接到互联网上。

  2. 作为服务器 ──计算机已经位于网络上, 且被用于通过PPP与其它计算机连接。

两种情况您都需要设立一个选项文件, (/etc/ppp/options 或者是 ~/.ppprc 如果您的计算机有多个用户使用PPP)。

您还需要一些modem/serial软件(comms/kermit就很适合), 使您能够拨号并与远程主机建立连接。

28.3.2. 使用pppd作为客户端

Based on information provided by Trev Roydhouse.

下面这个 /etc/ppp/options选项文件能够被用来与CISCO终端服务器的 PPP线连接。

crtscts # enable hardware flow controlmodem # modem control linenoipdefault # remote PPP server must supply your IP address # if the remote host does not send your IP during IPCP # negotiation, remove this optionpassive # wait for LCP packetsdomain ppp.foo.com # put your domain name here:remote_ip # put the IP of remote PPP host here # it will be used to route packets via PPP link # if you didn't specified the noipdefault option # change this line to local_ip:remote_ipdefaultroute # put this if you want that PPP server will be your # default router

连接:

  1. 使用 Kermit (或其他 modem 程序来拨号), 然后输入您的用户名和口令 (或在远程主机上启用 PPP 所需的其他信息)。

  2. 退出 Kermit (并不挂断连接)。

  3. 键入下面这行:

    # /usr/sbin/pppd /dev/tty01 19200

    一定要使用正确的速度和设备名。

现在您的计算机已经用PPP连接。 如果连接失败, 您可在文件 /etc/ppp/options 中添加 debug 选项, 并查看控制台信息以跟踪问题。

下面这个/etc/ppp/pppup脚本能自动完成这三个步骤:

#!/bin/shpgrep -l pppdpid=`pgrep pppd`if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid}fipgrep -l kermitpid=`pgrep kermit`if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid}fiifconfig ppp0 downifconfig ppp0 deletekermit -y /etc/ppp/kermit.dialpppd /dev/tty01 19200

/etc/ppp/kermit.dial 是一个 Kermit 脚本, 它会完成拨号, 并在远程主机上完成所有需要的身份验证过程 (这份文档的最后有一个脚本实例)。

使用下面这个脚本/etc/ppp/pppdown断开PPP连线:

#!/bin/shpid=`pgrep pppd`if [ X${pid} != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill -TERM ${pid}fipgrep -l kermitpid=`pgrep kermit`if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid}fi/sbin/ifconfig ppp0 down/sbin/ifconfig ppp0 deletekermit -y /etc/ppp/kermit.hup/etc/ppp/ppptest

通过执行/usr/etc/ppp/ppptest, 看看pppd 是否仍在运行:

#!/bin/shpid=`pgrep pppd`if [ X${pid} != "X" ] ; then echo 'pppd running: PID=' ${pid-NONE}else echo 'No pppd running.'fiset -xnetstat -n -I ppp0ifconfig ppp0

执行脚本 /etc/ppp/kermit.hup以挂起moderm, 这个文件包含:

set line /dev/tty01 ; put your modem device hereset speed 19200set file type binaryset file names literalset win 8set rec pack 1024set send pack 1024set block 3set term bytesize 8set command bytesize 8set flow nonepau 1out +++inp 5 OKout ATH0\13echo \13exit

也可以用chat 代替kermit

以下两个文件用以建立pppd连接。

/etc/ppp/options

/dev/cuad1 115200crtscts # enable hardware flow controlmodem # modem control lineconnect "/usr/bin/chat -f /etc/ppp/login.chat.script"noipdefault # remote PPP serve must supply your IP address # if the remote host doesn't send your IP during # IPCP negotiation, remove this optionpassive # wait for LCP packetsdomain your.domain # put your domain name here: # put the IP of remote PPP host here # it will be used to route packets via PPP link # if you didn't specified the noipdefault option # change this line to local_ip:remote_ipdefaultroute # put this if you want that PPP server will be # your default router

/etc/ppp/login.chat.script

注意:

以下的内容应该放在一行内。

ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDTphone.number CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: login-id TIMEOUT 5 sword: password

一旦这些被安装且修改正确, 您所要做的就是运行pppd, 就像这样:

# pppd

28.3.3. 使用pppd作为服务器

/etc/ppp/options要包括下面这些内容:

crtscts # Hardware flow controlnetmask 255.255.255.0 # netmask (not required)192.114.208.20:192.114.208.165 # IP's of local and remote hosts # local ip must be different from one # you assigned to the Ethernet (or other) # interface on your machine. # remote IP is IP address that will be # assigned to the remote machinedomain ppp.foo.com # your domainpassive # wait for LCPmodem # modem line

下面这个脚本/etc/ppp/pppserv 使pppd以服务器方式启动:

#!/bin/shpgrep -l pppdpid=`pgrep pppd`if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid}fipgrep -l kermitpid=`pgrep kermit`if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid}fi# reset ppp interfaceifconfig ppp0 downifconfig ppp0 delete# enable autoanswer modekermit -y /etc/ppp/kermit.ans# run ppppppd /dev/tty01 19200

使用脚本/etc/ppp/pppservdown停止服务器:

#!/bin/shpgrep -l pppdpid=`pgrep pppd`if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid}fipgrep -l kermitpid=`pgrep kermit`if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid}fiifconfig ppp0 downifconfig ppp0 deletekermit -y /etc/ppp/kermit.noans

下面的 Kermit 脚本 (/etc/ppp/kermit.ans) 能够启用/禁用您 modem 的自动应答模式。 其内容类似下面这样:

set line /dev/tty01set speed 19200set file type binaryset file names literalset win 8set rec pack 1024set send pack 1024set block 3set term bytesize 8set command bytesize 8set flow nonepau 1out +++inp 5 OKout ATH0\13inp 5 OKecho \13out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable ; autoanswer modeinp 5 OKecho \13exit

一个名为/etc/ppp/kermit.dial的脚本用于向远程主机 进行拨号和验证。 您要根据需要定制它。 要加入您的登寻名和密码, 您还要根据 modem 和远程主机的反应修改输入语句。

;; put the com line attached to the modem here:;set line /dev/tty01;; put the modem speed here:;set speed 19200set file type binary ; full 8 bit file xferset file names literalset win 8set rec pack 1024set send pack 1024set block 3set term bytesize 8set command bytesize 8set flow noneset modem hayesset dial hangup offset carrier auto ; Then SET CARRIER if necessary,set dial display on ; Then SET DIAL if necessary,set input echo onset input timeout proceedset input case ignoredef \%x 0 ; login prompt countergoto slhup:slcmd ; put the modem in command modeecho Put the modem in command mode.clear ; Clear unread characters from input bufferpause 1output +++ ; hayes escape sequenceinput 1 OK\13\10 ; wait for OKif success goto slhupoutput \13pause 1output at\13input 1 OK\13\10if fail goto slcmd ; if modem doesn't answer OK, try again:slhup ; hang up the phoneclear ; Clear unread characters from input bufferpause 1echo Hanging up the phone.output ath0\13 ; hayes command for on hookinput 2 OK\13\10if fail goto slcmd ; if no OK answer, put modem in command mode:sldial ; dial the numberpause 1echo Dialing.output atdt9,550311\13\10 ; put phone number hereassign \%x 0 ; zero the time counter:lookclear ; Clear unread characters from input bufferincrement \%x ; Count the secondsinput 1 {CONNECT }if success goto slloginreinput 1 {NO CARRIER\13\10}if success goto sldialreinput 1 {NO DIALTONE\13\10}if success goto slnodialreinput 1 {\255}if success goto slhupreinput 1 {\127}if success goto slhupif < \%x 60 goto lookelse goto slhup:sllogin ; loginassign \%x 0 ; zero the time counterpause 1echo Looking for login prompt.:slloopincrement \%x ; Count the secondsclear ; Clear unread characters from input bufferoutput \13;; put your expected login prompt here:;input 1 {Username: }if success goto sluidreinput 1 {\255}if success goto slhupreinput 1 {\127}if success goto slhupif < \%x 10 goto slloop ; try 10 times to get a login promptelse goto slhup ; hang up and start again if 10 failures:sluid;; put your userid here:;output ppp-login\13input 1 {Password: };; put your password here:;output ppp-password\13input 1 {Entering SLIP mode.}echoquit:slnodialecho \7No dialtone. Check the telephone line!\7exit 1; local variables:; mode: csh; comment-start: "; "; comment-start-skip: "; "; end:

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.