本节的目的是在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 是怎么实现自动拨号的: