使用 PPP 连接 Linux 到互联网的 10 分钟指南
在大多数情况下,使用 PPP 将您的 Linux 机器连接到互联网非常容易。在本文中,我将向您展示如何为最常见的连接类型配置 PPP。我们假设您的 Linux 机器是一台独立的机器,它拨号连接到互联网服务提供商 (ISP) 并执行自动登录,并且互联网服务提供商分配您的机器将使用的 IP 地址。您可以在 Robert Hart 编写的 PPP-HOWTO 中找到有关如何为其他情况配置 PPP 的详细信息。在开始之前,您需要正确的软件和一些信息。让我们开始吧。
首先,检查您是否拥有正确的软件。管理 Linux 的 PPP 的程序称为 pppd。pppd 程序与内核紧密相连,因此您必须运行与您的内核匹配的 pppd 版本。
Kernel Version pppd version 1.2.* 2.1.2d 1.3.0 -> 1.3.84 2.1.2d 1.3.84 -> 1.3.99 2.2.0f 2.0.* 2.2.0f 2.1.* 2.2.0f
使用以下命令检查您已安装的 pppd 和内核版本
$ /usr/sbin/pppd version $ uname -a第一个命令是一个技巧。pppd 命令实际上没有 version 选项。但是,版本号将出现在 pppd 返回的错误消息中,因为您为它提供了错误的参数。
如果第一个命令失败,您可能没有安装 PPP。您可以从以下位置获取最新版本的源代码
ftp://sunsite.unc.edu/pub/Linux/system/Network/serial/ppp/
如果您是从 Debian、Red Hat 或 Slackware 等发行版安装的,则 pppd 程序在这些发行版中以预编译的形式提供。您只需获取软件包并安装它即可。
接下来,您必须检查您的内核是否支持 PPP。通过输入以下命令来执行此操作
$ dmesg | grep -i ppp
您应该看到以下消息
PPP: version 2.2.0 (dynamic channel allocation) PPP Dynamic channel allocation code copyright 1995 Caldera, Inc. PPP line discipline registered.如果看不到,则 PPP 可能已作为模块安装。成为 root 用户并尝试
# insmod ppp如果失败,您将必须重新编译内核并启用 PPP 支持。按照 /usr/src/linux/README 中的说明进行操作,并在配置内核时确保您对以下提示回答“是”
General setup ---> [*] Networking support Network device support ---> [*] Network device support <*> PPP (point-to-point) support这些提示在非 2.0 内核中可能有所不同。
接下来,您必须记下您将发送哪些击键以及您将收到哪些提示才能登录到您的 ISP。收集这些信息的最佳方法是尝试使用终端程序(如 minicom)手动登录到您的 ISP。务必记下提示(如 “login:” 提示)的大小写,因为这在以后很重要。
一个典型的场景如下
Expect Send Comment ------ ---- ------- nothing AT&F/r (mode reset) OK AT&D2&C1/r (mode initialization) OK AT&D555-9999/r (modem dialing command)
调制解调器拨号,发送 CONNECT 消息,然后您按如下方式输入用户名和密码
login: username/r password: password/r
最后,您必须知道域名服务器的 IP 地址,以便您可以配置域名解析器并使用主机名而不是 IP 地址。从您的 ISP 获取此信息。
pppd 程序可以从两个位置接受配置参数。第一个来自命令行,第二个来自 “options” 文件。在这两种情况下,提供的参数几乎相同,但命令行方法可能很混乱。因此,我将介绍如何使用选项文件配置 PPP。
选项文件的通常位置是
/etc/ppp/options
选项文件是一个简单的文本文件,其中包含 pppd 执行时将使用的参数——每行一个参数。选项文件必须对将执行 pppd 程序的任何人可读。在大多数安装中,这将是 root 用户,可以直接执行或通过从 sudo 等程序执行 pppd 来实现。
如果您没有 /etc/ppp 目录,请以 root 用户身份使用以下命令创建一个目录
# mkdir /etc/ppp # chown root:root /etc/ppp # chmod 755 /etc/ppp
创建一个 /etc/ppp/options 文件,如下例所示
debug /dev/ttyS0 38400 modem crtscts lock connect /etc/ppp/net-connect asyncmap 0 defaultroute :此示例假设
您希望 PPP 在运行时提供诊断信息。
您的调制解调器连接到串行设备 /dev/ttyS0。
您希望将串行端口速度设置为 38400 bps。
您想要监听数据载波检测信号。
您将使用硬件 (RTS/CTS) 握手。
您的拨号程序是 /etc/ppp/net-connect。
您拥有完整的 8 位干净连接。
默认情况下,数据报应通过 PPP 链接发送。
您希望您呼叫的 PPP 服务器分配您将使用的 IP 地址。
这些都是 ISP 连接的相当典型的默认设置。您将必须调整串行设备以适合您的调制解调器的连接位置,并且如果您使用数据压缩,您可能希望将串行端口速度设置为更高的值。PPP 提供了一种转义选定字符的方法,以便它们不会干扰您的连接。例如,如果您在接收到 control-D 字符时会断开连接的链路上运行 PPP,您可以要求 PPP 转义该字符,它会自动将其替换为另一个字符,并在另一端反转该过程。虽然默认设置是安全的,但它会转义许多通常不需要转义的字符,这会降低您的链接性能。由于大多数 ISP 提供 8 位干净链路,因此您不需要转义任何字符,因此我们使用 asyncmap 选项告诉 pppd 不要这样做。
pppd 软件包包含一个名为 chat 的程序。chat 程序是一个简单的程序,可用于自动化拨号过程。chat 程序还接受来自命令行或文件的参数。同样,我将介绍如何从文件配置它,因为这是更好的方法。
为了在 pppd 中使用 chat 程序,我们必须确保 connect 选项指向一个调用 chat 的脚本。创建一个名为 /etc/ppp/net-connect 的脚本,如下所示
#!/bin/sh /usr/sbin/chat -v -t 60 -f /etc/ppp/net-chat
此 shell 脚本将使用 -v、-t 和 -f 参数调用 chat 命令。当您配置 pppd 时,-v 参数非常有用,因为它会将详细的诊断消息发送到系统日志,以显示 chat 程序运行时发生的情况。-t 60 参数只是告诉 chat 程序等待 60 秒以等待预期的文本到达,然后在超时时报错。-f 参数告诉 chat 程序它应该使用的文件名,以获取它将用于登录的 expect/send 序列。
确保该脚本对将调用 pppd 的任何人都是可读和可执行的。再次假设 “任何人” 都是 root,请使用以下命令
# chmod 500 /etc/ppp/net-connect # chown root:root /etc/ppp/net-connect
创建一个名为 /etc/ppp/net-chat 的 chat 脚本,该脚本将自动化前面描述的登录序列。我将根据表格中提供的信息来编写此脚本。
ABORT "BUSY" ABORT "NO CARRIER" "" AT&F\r OK AT&D2&C1\r OK ATD555-9999\r ogin: sword:前两行是特殊的。ABORT 关键字是一个特殊标记,允许您指定将导致 chat 程序退出的字符串。在提供的示例中,如果 chat 程序收到字符串 "BUSY" 或字符串 "NO CARRIER",则它将立即中止。文件的其余部分是 expect/send 对的简单列表,基于我们在手动登录时收集的信息。上面的示例完整地读取为
如果我们收到 "BUSY" 或 "NO CARRIER",则中止脚本。期望什么都不做,然后发送 AT&F< carriage-return> 以将调制解调器重置为出厂配置,期望收到 OK,然后发送 AT&D2&C1<carriage-return>,然后期望 OK 并发送 ATD555-9999<carriage-return>,然后期望 login: 并发送 username<carriage-return>,然后期望 sword: 并发送 password<carriage-return>,然后正常退出。
最后,我们必须确保此脚本对将调用 pppd 的任何人都是可读的。再次假设任何人都是 root,您可以使用以下命令
# chown root:root /etc/ppp/net-chat # chmod 600 /etc/ppp/net-chat
域名解析器是标准 Linux 库中的一小段软件,它允许自动将主机名(例如 sunsite.unc.edu)转换为 IP 地址(例如 152.2.254.81)。
域名解析器的配置很容易;只有一个文件需要更改。您几乎肯定已经在您的机器上拥有此文件,但您需要为域名服务器配置正确的地址。假设您的 ISP 为您提供了域名服务器地址 128.78.64.10,那么您的 /etc/resolv.conf 文件应包含一行,内容为
nameserver 128.78.64.10
要启动 PPP 链接,您只需以 root 用户身份执行以下命令
# /usr/sbin/pppd
pppd 程序将启动并在标准位置搜索其选项。它将在 /etc/ppp/options 中找到我们的选项文件并读取每一行。当它完成处理所有可用选项后,它将打开指定的串行设备,创建一个锁定文件以防止其他程序尝试使用它,然后尝试运行 connect 程序并执行 /etc/ppp/net-connect 脚本。net-connect 脚本将执行 chat 程序,告诉它应该从 /etc/ppp/net-chat 文件中获取其参数。chat 程序启动,从 net-chat 文件中读取每一行,等待字符串,并发送已给出的响应。如果 chat 程序没有 ABORT,则控制权将传递回 pppd 程序,然后 pppd 程序会将线路切换到 PPP 模式并创建 PPP 网络设备。pppd 程序将自动开始与链接另一端的 PPP 程序协商一些配置细节。其中最重要的细节是您将使用的 IP 地址。pppd 程序将创建一个 ppp 网络设备 ppp0,然后使用从另一个程序获得的详细信息对其进行配置。最后,pppd 程序将在您的路由表中配置一个路由,该路由告诉您的 Linux 机器,如果它没有更好的发送位置,则应将数据报发送到 PPP 链接。然后 pppd 程序将愉快地在后台运行,直到线路故障、远程端关闭连接或您在本地终止它。
好的,这听起来很复杂,所以总结一下
pppd 启动。
pppd 读取 /etc/ppp/options。
pppd 执行 /etc/ppp/net-connect。
chat 从 /etc/ppp/net-chat 读取数据。
pppd 从服务器获取 IP 地址详细信息。
pppd 创建 ppp0 设备并配置它。
pppd 创建默认路由。
pppd 在后台运行。
要测试连接,请依次执行以下每个步骤。
步骤 1
run /sbin/ifconfig
ifconfig 程序用于设置或显示网络接口配置。在这里,您只对显示感兴趣。
步骤 2
# /sbin/ifconfig
输出应如列表 1 所示。
inet addr 字段是分配给您的 IP 地址。P-t-P 字段是链接另一端 PPP 机器的地址。这意味着您的 PPP 网络连接已成功建立。
如果您没有看到 ppp0 设备,请检查您的系统日志文件,即 /var/adm/messages,以确保您的 chat 脚本成功运行。更正任何可能的错误。如果您看到任何难看的错误消息,请仔细检查您是否使用了适用于您的内核的正确 PPP 版本。
步骤 3:ping PPP 远程主机。ping 命令向主机发送特殊格式的数据报,该主机将向该主机发送回复。这使我们能够检查我们是否具有到该主机的有效路由。列表 2 显示了我们的情况。列表中的那些 “64 bytes from ...” 行表示我们正在与链接另一端的机器成功通信。这很好,因为它意味着链接正在工作。
如果您没有看到任何 “64 bytes from ...” 行,这意味着您没有正确地与远程机器通信。仔细检查您的 chat 脚本和系统日志文件。
步骤 4:ping 您的域名服务器。这是一个重要的测试,以确保 pppd 放置的默认路由正在工作。为此,请 ping 配置到 /etc/resolv.conf 文件中的域名服务器地址。在我们的例子中
# ping 128.78.64.10
输出将类似于您在 ping PPP 服务器时观察到的输出。
如果此测试失败,则可能意味着您的默认路由未正确添加。要仔细检查,请运行 route 命令,如列表 3 所示。route 命令显示 IP 路由表的内容。-n 选项告诉它不要尝试将 IP 地址转换为主机名。以 0.0.0.0 开头的行是默认路由。如果您没有看到类似这样的行,请仔细检查您是否在 /etc/ppp/options 文件中包含了 defaultroute 选项。如果您有类似这样的行,但它没有指向 ppp0,请检查您的系统是否已在为另一个设备创建默认路由。如果是,请找到哪个 rc 文件正在执行此操作,并注释掉此条目。
步骤 5:ping 远程主机。这是真实而简单的测试。尝试以下任一方法
# ping sunsite.unc.edu
或
# ftp ftp.funet.fi如果这有效,则您已正确连接到互联网。尽情享受吧。
如果命令只是停在那里,并在大约一分钟后给您一条关于无法解析主机名的错误消息,请检查您是否已正确修改了 /etc/resolv.conf 文件,以及您在那里配置的 IP 地址是否是您的 ISP 的域名服务器的正确 IP 地址。
如果您足够幸运,可以与您的 ISP 建立半永久连接,即您可以保持连接任意长时间的连接,您可能希望在电话呼叫因某种原因掉线时让您的 Linux 自动重拨。这是一种简单的方法,假设您已将 PPP 链接配置为由 root 用户激活。
第一个非常重要的步骤是将此行添加到您的 /etc/ppp/options 文件中
-detach
此行告诉 pppd 在成功连接后不要进入后台。下一步是将一行添加到您的 /etc/inittab 文件中,如下所示
pd:23:respawn:/usr/sbin/pppd将此行与与它类似的行放在一起——运行登录程序的行。
此行只是告诉 init 程序它应该自动启动 /usr/sbin/pppd 程序,并且如果该程序崩溃,它应该自动重启它。如果您已将调制解调器配置为升高数据载波检测,并且您已按照我描述的方式配置 pppd,则 init 将确保 pppd 程序始终运行并在其终止时重新运行它。
一个警告——这很简单,但不能防止可能导致电话呼叫成功建立然后挂断的问题。如果您遇到此问题,init 程序会非常乐意地继续重新运行 pppd 程序,直到您告诉它停止。如果出现严重问题,您可能会产生相当多的电话费。
