作者:胡晓峰
本节的目的是在linux下设置ppp,使其能拨号并连接到你的ISP,从而将你的机器与Internet相连,进而你就可以在网上为所欲为了。
喜欢条理清晰的文章,所以我写的东西也尽量做到有条理。下面就是linux ppp客户端设置的一般步骤:
1 编译内核使其支持ppp。
2 设置串行端口和调制解调器。
3 掌握你的ISP的信息。
4 安装拨号所需软件并进行设置。
5 手动方式建立ppp连接。
6 使ppp连接自动化。
7 设置域名解析(DNS)。
8 其他问题。
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 连接,传输数据。
手动方式建立 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 连接等等。现在服务器端的 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
手动方式建立 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 account 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 root account would be
# a security hole so dont ask.)
#
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
#
# Initiate the connection
#
# I put most of the common options on this command. Please, dont
# 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. Dont 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
BUSY
ABORT
NO ANSWER
ABORT
RINGING
RINGING
AT
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 手册,这里就不再解释了。
设置域名解析( 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 下如何拨出(客户)就介绍完了。我想不出还有什么问题了。呵呵。如果你还有什么问题,可以与我联系,希望我能会(我也并非全能呀,呵呵)。