在 Linux 中配置 pppd,第二部分

作者:Tony Mobily

在本文的第一部分(参见 2002 年 2 月刊的 LJ),我解释了如何配置调制解调器。在文章的结尾,您最终得到了一个名为 /dev/modem 的符号链接,该链接指向您的调制解调器的正确设备文件。您确信一切正常,因为您连接到了您的互联网服务提供商(即使您没有建立 PPP 连接)。在本文中,我将进一步解释如何连接到互联网。建议您首先阅读上一篇文章。如果您不能这样做,只需确保您的调制解调器配置正确,并且您确实有一个名为 /dev/modem 的符号链接,该链接指向 /dev 中的正确设备文件。

为了能够使用本文,您应该拥有关于您的提供商的所有登录信息,包括您应该拨打的电话号码、您的登录名和密码,以及有效的 DNS 服务器地址(这是可选的,因为它可以通过您的提供商自动分配)。

本文假设您的提供商接受 PAP 身份验证。PAP 是一种通过 PPP 协议将您的登录名和密码信息发送给提供商的方式;它使用户免于过去某些互联网服务提供商要求的更复杂(且通常是手动)的登录程序。今天,绝大多数 ISP 将要求您使用 PAP。本文还假设您拥有标准的调制解调器,而不是 Winmodem。配置 Winmodem 是可能的,但可能很繁琐,并且超出了本文的范围。

建立连接:基本工具

首先,您必须以 root 用户身份登录才能配置您的互联网连接。通过调制解调器连接到互联网是使用 PPP(点对点协议)建立的,该协议用于封装常见的 TCP/IP 数据包,以便它们可以通过串行线路发送(事实上,TCP/IP 数据包旨在通过网络介质传输,并且如果不首先串行化,则不适合串行连接)。

本文假设您已安装以下软件:处理 PPP 连接的内核模块(我所知道的每个发行版都附带包含 PPP 模块的内核,因此您可能无需担心);程序 pppd,它在建立连接后初始化内核模块;程序 chat,它负责建立连接;以及程序 minicom,这是一个非常简单的终端程序,可让您与调制解调器对话。要检查您是否拥有所有这些程序,您可以使用 which 命令。此命令告诉您这些程序是否在 $PATH 环境变量中列出的目录之一中可用

which pppd
/usr/bin/pppd
which chat
/usr/bin/chat
which minicom
/usr/bin/minicom

如果您没有其中一些程序,则应获取正确的软件包并安装它。您可能还想禁用电话线的呼叫等待。如果它处于活动状态,则来电可能会导致您连接时线路掉线。

连接概述

一旦我们配置了调制解调器,我们如何连接到互联网?我们必须使用(和配置)一个名为 pppd(点对点协议守护程序)的程序。以下是当您运行 pppd 时发生的情况(假设 chat 用作拨号程序并且 pppd 配置正确)。

守护程序启动。它设置串行端口参数(速度等)。然后它运行一个外部程序 (chat) 来建立连接,该程序将连接命令发送到调制解调器(ATDT 后跟提供商的号码)。然后它等待来自串行端口的字符串 CONNECT。此时连接已建立,就好像有一条串行电缆从您的计算机连接到提供商的计算机一样。一旦 chat 完成其工作,程序 pppd 再次接管。如果无法建立连接,pppd 将退出并返回错误。否则,它将与线路另一端的 PPP 守护程序对话(您之前看到的一堆难以理解的符号的 PPP 握手),并将被分配一个 IP 地址。通常需要登录名和密码才能成功完成此阶段(登录信息在 PPP 握手期间发送)。程序 pppd 确保创建内核网络接口,并将网络流量定向到该接口。

关于日志记录的几句话

您需要的两个程序 pppd 和 chat 不是交互式的。它们运行,然后将任何消息发送到系统日志守护程序 syslogd。然后 syslogd 会将收到的消息写入硬盘驱动器。消息有几种类型,不同的类型通常存储在单独的文件中。它们存储的确切位置取决于您的 syslogd 配置。

现在,您应该配置 syslogd,以便 100% 确定来自守护程序 pppd 和 chat 的调试信息实际上存储在磁盘上,并且您知道它们在哪里。syslogd 的配置文件是 /etc/syslog.conf。您只需向其中输入一行额外的行即可。为此,只需键入命令

vi /etc/syslog.conf

当然,您可以使用您喜欢的任何编辑器(vi、Emacs、joe、pico 等)。现在,插入以下行

daemon.debug;*.info           /var/log/ppp_article
请记住,info 和 /var/log/ppp_article 之间应该有一个制表符。

现在,您必须确保守护程序 syslogd 知道其配置文件中的更改。要实现此目的,请运行命令

killall -HUP syslogd

文件 /var/log/ppp_article 应该已创建,并且应该包含一行,告诉您 syslogd 已重新启动。要检查是否为真,您可以键入以下命令

cat /var/log/ppp_article
Aug  4 19:28:46 merc_linux syslogd 1.3-3: restart.
您可以使用命令 tail 和选项 -f,而不是仅读取文件的 cat 命令。这将继续读取文件,并将屏幕上打印添加到它的任何新信息。这意味着只要 syslogd 在文件 ppp_article 上写入任何内容,tail 就会在屏幕上显示它
tail -f /var/log/ppp_article
Aug  4 19:28:46 merc_linux syslogd 1.3-3: restart.
从现在开始,pppd 或 chat 记录的任何日志信息都将自动出现在屏幕上。您真的应该始终保持此控制台打开,并在需要时检查消息。
了解 chat

正如您可能在本文的第一部分中看到的那样,为了建立串行连接,您必须将字符串 ATDT12345678(当然是您的提供商的电话号码)发送到您的调制解调器,并等待字符串 CONNECT 从调制解调器本身返回(这将在连接建立后发生)。可能会返回 CONNECT 以外的其他消息:BUSY、NO CARRIER、NO ANSWER 等。在上一篇文章中,您使用 minicom 实际尝试了这一点。

即使您可以使用 minicom 手动完成所有这些操作,您可能也希望使用一个程序来为您完成所有操作。该程序应该能够与调制解调器对话,发送信息并期望特定的字符串作为响应。当然,这样的程序确实存在,它被称为 chat。例如,尝试运行以下命令

chat ABORT "BUSY" "OK" "TRY" "THIS"
"TESTING" "COMMAND"

请注意,从现在开始,键盘将被锁定,您将无法退出程序,即使按 Ctrl-C 也不行。键入 ok。单词 TRY 将弹出。现在键入 this;单词 TESTING 将出现在屏幕上。最后,键入 command;程序 chat 将成功退出。再次尝试运行该命令:键入 ok,您将再次看到字符串 TRY 出现。此时,键入 busy:程序将立即退出。正如您可以猜到的那样,chat 程序旨在等待字符串并打印一些内容作为响应。前两个单词 ABORT BUSY 是特殊的,指示 chat 如果在其执行期间的任何时候收到单词 BUSY 则退出。如果出现问题,您可以运行相同的 chat 命令,并添加开关 -v

chat -v ABORT "BUSY" "OK" "TRY" "THIS"
"TESTING" "COMMAND"
-v 选项代表 verbose,意思是 chat 会准确地告诉您正在发生的事情、它期望什么等等。当然,如果您按照我之前给出的关于 syslogd 的说明进行操作,所有调试信息都将记录在 /var/log/ppp_article 中。让我们分析一个不同的 chat 命令
chat ABORT "BUSY" "" "AT" "OK"
"ATDT93355100" "CONNECT"
正如您可能猜到的那样,您必须表现得像调制解调器才能使 chat 成功退出。它会向您发送一个 AT 字符串,您必须键入 ok。然后,它会向您发送字符串 ATDT93355100 并等待您键入 connect。然后,它将退出。这可能对大多数读者来说听起来很熟悉;如果您可以让 chat 与调制解调器而不是键盘对话,这正是您连接到 ISP 所需要的。我为我的提供商使用的命令是
chat ABORT BUSY ABORT "NO CARRIER"
TIMEOUT 120 "" AT OK ATDT94310999 CONNECT
它非常简单,事实上,它可以做得更好。但在我的情况下,它完成了工作,我对此非常满意。您应该查看 chat 的手册页(只需键入 man chat)并查看它提供的选项;稍后,您可能希望更改您的连接脚本,以便它使用 chat 提供的所有花哨选项。下一步是编写一个 shell 脚本,封装您编写的 chat 命令。该文件将放置在 /etc/ppp 中,并命名为 chat-connect。要创建它,只需键入命令
vi /etc/ppp/chat-connect
(当然,如果您不喜欢 vi,您可以使用您喜欢的任何编辑器)。脚本应如下所示
#!/bin/sh
chat ABORT BUSY ABORT "NO CARRIER" TIMEOUT 120 ""
AT OK ATDT94310999 CONNECT
您应该将 94310999 替换为您的 ISP 的拨号号码。现在,保存并退出编辑器。您需要使用 chmod 命令使脚本可执行
chmod +x /etc/ppp/chat-connect
通过运行查看脚本是否有效
/etc/ppp/chat-connect
如果它有效,您就朝着可用的互联网连接迈进了一步。实际上,您非常接近目标。您所要做的就是使用正确的参数运行 pppd。
了解 pppd

此时,您可以开始处理实际的 pppd 配置。涉及的文件是 /etc/ppp/options、/etc/ppp/chap-secrets、/etc/ppp/pap-secrets 和 /etc/ppp/peers。

options 文件用于为 pppd 提供默认选项列表。目前,您应该确保存储在 /etc/ppp 中的 options 文件完全为空;只需使用您喜欢的编辑器编辑它并删除其中的所有内容。如果您不喜欢删除内容,您可以注释掉所有行,在每行前面放置一个 # 符号。重要的是使 options 文件为空,以确保您有一个全新的开始。现在的首要任务是测试我们编写的 chat 脚本是否在实际情况下有效。为了做到这一点,您可以使用最少的参数运行 pppd

pppd /dev/modem 38400 modem lock connect
/etc/ppp/chat-connect

参数可以按任何顺序提供给 pppd。/dev/modem 选项表示调制解调器连接到的串行端口(如您所知,它是一个指向真实 ttyS 设备的符号链接)。参数 modem 指示 pppd 守护程序它将处理调制解调器连接,而不是您和您的提供商之间的直线串行电缆。单词 lock 告诉 pppd 在使用调制解调器时锁定它(如果您不知道这意味着什么,请不要惊慌;基本上这是一种保证在您的连接建立时没有其他程序会访问调制解调器的方法)。最后一个选项 connect 带有参数 /etc/ppp/chat-connect,并告诉 pppd 它应该运行什么程序来拨打电话号码并连接到互联网服务提供商;在您的情况下,它是您在本文上一节中编写的 chat 脚本。

如果没有任何效果,您应该将选项 -v 添加到 chat 脚本,再次尝试并查看日志 - 此时,通常很容易解决问题。如果一切顺利,您应该能够看到您的调制解调器正在连接并听到它发出通常的口哨声。现在您只需额外一步即可连接到互联网。编辑文件 /etc/pap-secrets 并将您的密码添加到该文件,添加如下所示的行

your_username_here  *     your_password_here

请记住,每个单词之间应该有一个制表符。现在您已准备好进行重大测试,即实际连接。尝试以下命令

pppd /dev/modem 38400 modem lock
connect /etc/ppp/chat-connect
user your_username_here defaultroute
唯一的额外参数是 user(后跟您的用户名,因为它出现在 /etc/ppp/pap-secrets 中)和选项 defaultroute。最后一个选项确保您的连接将默认用于应该到达互联网的数据包。使用此选项,pppd 将在连接建立后设置正确的路由表。您应该在日志中看到如下消息
Aug  4 16:12:23 merc_linux pppd[4430]:
local  IP address 94.232.195.174
Aug  4 16:12:23 merc_linux pppd[4430]:
remote IP address 194.232.195.4
如果它没有发生,您可能必须使用 debug 选项运行 pppd 并读取日志文件(即 /var/log/ppp_article)以查看发生了什么
pppd /dev/modem 38400 modem lock
connect /etc/ppp/chat-connect
user your_username_here defaultroute debug
如果一切正常,恭喜您;您现在已连接到互联网。请记住,当您想要断开连接时,您只需键入
killall pppd
测试连接

下一步是测试连接是否实际有效。查看链接是否建立的最佳方法是运行 ifconfig(参见列表 1)。此命令显示活动内核网络接口。在我的情况下,我有 lo,这是标准的环回接口,如果我想连接到自己,我将使用它,还有 ppp0,这是调制解调器 PPP 接口。

列表 1. 我的 ifconfig 命令的结果

要查看您是否实际路由到互联网,您可以运行 traceroute 命令,后跟任何 IP 地址。现在您应该使用 -n 选项来禁用 DNS 名称解析(尚未配置)。例如

traceroute -n 198.182.196.56
traceroute to 198.182.196.56 (198.182.196.56),
30 hops max, 38 byte packets
 1  194.232.195.4 (194.232.195.4) 181.518 ms
    139.473 ms  149.822 ms
 2  194.232.195.1 (194.232.195.1) 129.540 ms
    139.739 ms  139.821 ms

...

19  207.245.34.122 (207.245.34.122)  479.696 ms
    479.653 ms *
20  198.182.196.56 (198.182.196.56) 489.711 ms
    479.644 ms  479.874 ms
IP 198.182.196.56 是 www.linux.org 的服务器。程序 traceroute 将告诉您数据包发送到互联网所遵循的路径。现在,您应该确保通过文件 /etc/resolv.conf 告诉您的系统您的 DNS 的 IP。我的 resolv.conf 文件如下所示
nameserver 203.14.168.3
nameserver 202.0.185.226
某些 ISP 不提供 DNS 服务器地址,因为您的计算机在 PPP 握手完成后会获得一个。如果是这种情况,您只需断开连接并使用 usepeerdns 选项重新连接即可,当您运行 pppd 时
pppd /dev/modem 38400 modem lock
connect /etc/ppp/chat-connect
user your_username_here defaultroute usepeerdns
现在,您可以尝试查看您的 DNS 是否正常工作,例如,使用 Telnet 程序。Telnet 程序只是一个借口,看看系统是否能够将名称 www.linux.org 转换为 IP 地址。
telnet www.linux.org 80
Trying 198.182.196.56...
Connected to www.linux.org.
Escape character is '^]'.
它工作了!现在,您可以启动浏览器(Netscape、Mozilla、Opera、Galeon、Lynx 等)并随意浏览网络。
一点整理

到目前为止,一切都应该运转良好;互联网连接已建立,您可以随时连接到互联网。当然,还有改进的空间。首先要做的是提高串行端口的速度,看看一切是否仍然有效。为此,只需将 pppd 命令行中的 38400 替换为 115200 即可。

此外,几周后,您可能会开始注意到 pppd 命令必须键入大量参数。事实上,每次您想连接时,您都必须键入

pppd /dev/modem 115200 modem lock
connect /etc/ppp/chat-connect
user your_username_here defaultroute

好消息是,您当然可以将所有这些参数放在配置文件 /etc/ppp/options 中。因此,在您的情况下,options 文件将如下所示

/dev/modem
115200
modem
lock
connect /etc/ppp/chat-connect
user
defaultroute
在此文件中,参数的顺序确实无关紧要。从现在开始,您只需键入命令 pppd 即可连接到互联网。如果您有多个可能想要呼叫的提供商怎么办?在这种情况下,您可以创建多个 options 文件,然后将它们放置在 /etc/ppp/peers 中。下面的输出显示了我的 peers 目录的外观
ls -l /etc/ppp/peers
total 4
-rw-r--r--  1 root   root    197 Aug  4 15:41 main_net
-rw-r--r--  1 root   root    189 Mar 11  2000 primus
我的文件 /etc/ppp/options 为空;当我运行 pppd 时,我总是运行
pppd call main_net
这样,文件 /etc/ppp/peers/main_net 以及我的 /etc/ppp/options 文件(碰巧为空)都将被使用。如果我的主要提供商 (Main Net) 由于某种原因停机,我仍然可以使用我在 Primus 中的一些限时帐户。

现在,您可以做的最好的事情是阅读 pppd 的手册页(只需键入 man pppd)并查看是否有任何深奥的选项可以以某种方式改善您的连接。在列表 2 中,您将找到我的朋友兼 Linux 大师 Pancrazio De Mauro 编写的非常丰富的 options 文件。你能做得更好吗?

列表 2. Pancrazio 的 Options 文件

结论

这个过程当然看起来可能很可怕;您必须具备的知识才能使用 Linux 连接到互联网似乎很荒谬,特别是如果您将其与 Windows 远程访问界面的简单性进行比较;这种比较让您怀疑手动完成所有操作是否值得。

在我看来,手动配置一切有两个主要优点。第一个是您可以(并且应该)仔细研究 pppd 的许多选项以优化您的连接。第二个是从现在开始,当您使用图形界面来配置您的互联网访问时,您确切地知道正在发生什么,并且如果自动过程似乎无法正常工作,您可以修复问题。

在结束之前,我想指出有一个命令行程序(没有 GUI)可以自动完成我在本文中解释的所有操作(查找调制解调器,使用正确的参数连接到提供商等)。该程序称为 wvdial (www.worldvisions.ca/wvdial/index.html)。几年前我发现它时,我发现它非常神奇。我建议那些想要快速连接到互联网而不必经历了解 pppd、chat 等一切麻烦的不耐烦的人使用它。

资源

Configuring pppd in Linux, Part II
Tony Mobily (merc@mobily.com) 是意大利计算机杂志 Login 的技术编辑。他是 LCI(Linux 认证讲师,www.linuxcertification.com),并且知道如何使用英语、意大利语、C、Perl 和其他几种语言。他担任培训师和系统管理员,并正在接受舞蹈演员培训。
加载 Disqus 评论