幽灵般进入网络

作者:Scott Steadman
背景

最近,我突然想摆弄一下家庭网络管理,以便获得一些 Unix 和异构网络管理的经验。我有三台 Windows 电脑(两台装有 Windows 95,一台装有 Windows 3.1)连接到一台 Linux 服务器。我将 LinTel 电脑用作本地文件服务器和连接家庭网络到互联网的网关。

我用来处理文件服务器任务的软件是 SAMBA。我设置 SAMBA 的主要参考资料是 1996 年 7 月刊的Linux Journal 上关于该主题的优秀文章。

在选择拨号程序时,我考虑了两个要求

  1. 我不想每次想要访问互联网时都手动登录我的 ISP。

  2. 我不希望我的 LinTel 电脑在启动时呼叫我的 ISP,然后保持连接直到我关闭它。我希望通过不垄断电话线来体谅 ISP 的其他客户。

Eric Schenk 编写的一个名为 diald 的程序满足了这两个要求。我使用 diald 在我有发往互联网的流量时连接到我的 ISP。如果指定的时间间隔内没有流量,它也会自动断开与 ISP 的连接。

我为多家可以访问互联网的公司工作,在工作时,我喜欢时不时地通过互联网访问我的家用 Linux 服务器——以防我在午休时间发现一些有趣的东西,想在家里摆弄一下。因此,我设置我的服务器在 15 到 60 分钟之间的各种随机间隔连接到互联网,徘徊五分钟,如果没有流量则断开连接。当我的服务器连接时,我可以下载任何我想要的东西。我称这个过程为幽灵化。

这些是我让幽灵化工作的步骤。根据您是否已经安装了 Linux 以及它的版本,您可能可以跳过一些步骤。

Linux 安装

我做的第一件事是从 Red Hat Software (https://#/) 获取 Red Hat 4.0。我听说过 Red Hat 的好评,并且喜欢他们的“Red Hat 软件包管理器”来处理软件错误修复和升级——它确实让生活更轻松。我按照安装过程中给出的说明安装了 Red Hat。

接下来,我从 sunsite.unc.edu 下载了当时可用的最新内核版本 2.0.29,并使用特定于硬件的设置配置了我的新内核。

幽灵化的另一个必要条件是 IP 伪装。我找到了三个关于 IP 伪装的良好信息来源

  1. 最权威的是 IP 伪装资源主页,网址为 http://www.wwonline.com/~achau/ipmasq/。

  2. IP 伪装迷你 HOWTO,可能在您最喜欢的互联网 Linux 站点上找到。

  3. 最后一个是 1996 年 7 月刊的 Linux Journal 中的 IP 伪装文章。我从 IP 伪装资源主页下载了内核 2.0.28 及更高版本的最新 IP 伪装补丁,它在我的 2.0.29 内核上运行良好。同样,我所要做的就是按照说明使用 make menuconfig 方法重新配置内核。以下是 IP 伪装工作的相关设置

  4. 代码成熟度级别选项 下,启用“提示开发和/或不完整的代码/驱动程序”。(IP 伪装代码仍然被认为是 alpha 代码。)

  5. 网络选项 下,启用“网络防火墙”、“网络别名”、“TCP/IP 网络”、“IP 转发/网关”、“IP 多播”、“IP 防火墙”、“IP 记帐”、“IP 伪装 (实验性)”和“IP 隧道”。

配置内核的其余部分后,我只需继续按照说明构建它。我建议执行 make zdisk 并确保系统从软盘启动正常,然后再执行 make zlilo。这样旧内核就不会意外地被清除掉。我的 make 过程是

make dep
make config
make -j5 zdisk
make -j5 modules
make modules_install

然后我从软盘重新启动,并密切关注启动信息。成功重新启动后,返回到 Linux 源代码目录并执行 make zlilo-j5 开关使 make 同时生成最多五个编译。这种编译方法极大地加快了构建过程。

设置 PPP 守护进程

安装 Red Hat 后,我设置了点对点协议守护进程 (pppd);这允许我的 Linux 服务器与互联网通信。ppp 守护进程随 Red Hat 软件包一起提供,并在选择网络软件包时自动安装。

首先,我设置了一个名为 /etc/ppp/options 的配置文件,然后创建了一个聊天脚本,告诉 ppp 守护进程如何与我的 ISP 通信。我使用的配置文件如下所示

modem
/dev/cua0
38400
asyncmap 0
defaultroute

pppd 的手册页详细解释了这些行。Red Hat 附带的默认配置文件应该适合您的用途。唯一需要关注的行是 /dev/cua0——这一行告诉 ppp 守护进程在哪里找到您的调制解调器。

在可以使用 pppd 与互联网通信之前,您必须拨号并连接到您的 ISP。这通常涉及一个称为握手的过程,由一个名为 chat 的程序实现。聊天脚本向 chat 程序发送登录到您的 ISP 的指令。聊天脚本基本上是一系列 waitsend 字符串。Red Hat 提供了一个在 X-Windows 下运行的网络配置工具,可用于创建和测试聊天脚本。我有一个名为 /etc/sysconfig/network-scripts/chat-ppp0 的聊天脚本(见清单 1[脚注])。我使用以下命令将此脚本符号链接到我的 /etc/ppp 子目录中

cd /etc/ppp
ln -s /etc/sysconfig/network-scripts/chat-ppp0

您需要修改我的聊天脚本,通过更改电话号码、用户名和密码响应以匹配您自己的。您可能还需要根据您的 ISP 的要求修改 ppp default 行——请联系您的 ISP 获取该信息。

清单 1. 聊天脚本

现在,我希望系统在成功连接或断开与互联网的连接后立即执行一些操作。幸运的是,pppd 有一些功能可以轻松实现这一点。当 ppp 链接建立时,守护进程会检查是否存在名为 /etc/ppp/ip-up 的脚本。如果此脚本存在,则 ppp 守护进程会使用指定的连接参数调用它。我的这个脚本版本出现在清单 2 中——请注意脚本顶部的注释指示了 pppd 传递给脚本的参数。

清单 2. /etc/ppp/ip-up 脚本

当 ppp 链接断开时,ppp 守护进程会检查是否存在名为 /etc/ppp/ip-down 的文件。如果此文件存在,则在 ppp 链接终止时调用它。我的脚本内容如清单 3 所示。此脚本主要执行一些清理工作——撤消我在 ip-up 脚本中所做的工作。

清单 3. /etc/ppp/ip-down 脚本

设置拨号器守护进程

接下来,我获取并设置了拨号器守护进程 diald。这个方便的软件会等待直到它看到一个发往互联网的 IP 数据包,如果 ppp 连接未建立,则自动启动 ppp 守护进程,然后连接到互联网。

此软件包可以从 http://www.dna.lth.se/~erics/diald.html 获取。一个警告——最新版本的 diald 是 0.16。我正在使用 0.14。我尝试过 0.15,但它在终止连接后重新连接时出现问题。我还没有时间测试 0.16 版本。0.14 版本对我来说工作正常。如果您有兴趣升级到最新和最好的 diald,请给我发送电子邮件,我会告诉您它现在是否工作正常。在本文发表时,我应该已经测试过了。只需按照包含的说明构建和安装 diald

清单 4: /etc/ppp/diald-up 脚本

安装 diald 后,我创建了一些脚本来轻松启动和关闭它。启动它的脚本名为 /etc/ppp/diald-up,如清单 4 所示,其中包含大量注释。

由于此脚本有点晦涩难懂,我将更详细地介绍它。route 命令用于告诉网络软件如何从您的计算机到达其他计算机和网络。通常,当网络软件在路由表中找不到其他合适的路由时,会使用默认路由。要查看您的路由表,请使用 netstat -rn 命令。有关更多信息,请参阅 netstat 手册页。

清单 4 中的第一个命令删除默认路由,以确保它可供 diald 或 ppp 守护进程使用。此删除是必要的,因为有时如果已分配默认路由,diald 和 ppp 将不会重新分配默认路由。

第二个命令启动拨号器守护进程。(有关更多详细信息,请参阅 diald 手册页。)要在您的脚本中使用此行,您需要更改三项

  1. 通信设备 /dev/cua0

  2. 本地地址 10.10.10.1

  3. 远程地址 192.168.1.2

如果您有固定的 IP 地址,您还需要从脚本中删除 dynamic 开关行。

第三、第四和第五个命令用于设置防火墙。这些命令必须在拨号器守护进程之后运行,因为它通过默认路由将网络伪装到互联网。每当数据包需要通过默认路由离开时,拨号器守护进程都会感知到它,并使用 ppp 守护进程建立与互联网的连接。

我还有一个脚本可以优雅地关闭拨号器守护进程。我称之为 /etc/ppp/diald-down,源代码如清单 5 所示。

清单 5: /etc/ppp/diald-down

可以使用在 diald-up 脚本中的 diald 命令行上指定的命名管道与拨号器守护进程进行通信。我使用推荐的名称 /etc/diald.fifo。此命名管道允许您在程序运行时更改程序的各种参数,并优雅地退出程序,而无需使用 kill 命令。

清单 5 中的第一个命令告诉拨号器守护进程清理并退出。第二个命令将默认路由重置回以太网卡。

测试拨号器守护进程

要测试 diald 脚本,在一个虚拟控制台中执行 tail -f /var/log/messages,在另一个虚拟控制台中键入 ping 192.9.9.1 以 ping sun.com。键入 ping 命令后,您可以切换回第一个控制台并观看 diald 吐出状态消息。这些状态消息告诉您 diald 是否正确拨打您的调制解调器并激活 pppd。如果 ppp 似乎连接正常,您可以切换回另一个控制台,看看 ping 是否返回。如果没有,请不要惊慌——只需使用 Ctrl-C 打断它并重试。有时,当 diald 将路由从 slip 接口切换到 ppp 接口时,数据包会丢失。

我在上面的命令中使用了 IP 地址,假设您的机器上没有运行名称服务器。如果您有兴趣在您的机器上启动并运行名称服务器——我推荐这样做——一些好的信息来源是 DNS HOWTO 和 Olaf Kirch 的 Linux 网络管理员指南

创建 Appear 脚本

接下来,我创建了一个 appear 脚本。appear 脚本使 diald 连接到互联网,然后发送服务器可以访问的位置的指示到所需位置。我创建了一个名为 /etc/ppp/appear 的脚本来完成这项工作。此脚本如清单 6 所示。

清单 6: /etc/ppp/appear 脚本

最后,我在 /etc/crontab 文件中添加了一个条目。此文件由 cron 守护进程使用,以确定何时运行什么。(有关 cron 的更多信息,请查看 cron 手册页。)这是我添加的行

30 07 * * 1-5 root /etc/ppp/appear

此条目告诉 cron 守护进程在周一至周五的上午 7:30 启动您的 appear 脚本。appear 脚本每天只需以这种方式启动一次;然后它会在时间合适时重新启动自身。

完成所有这些步骤后,我就设置好了在互联网上幽灵化来回,如果您一直在遵循这些步骤,您也将准备就绪。

关于 Windows 95 配置的注意事项

如果您像我一样决定将一些 WinTel 电脑连接到您的 Linux 服务器,这里有一些提示可以帮助您启动并运行。

在以下示例中,我假设您的个人网络位于 192.168.1.* 子网中,Linux 服务器位于 192.168.1.1,而您的 Win95 机器位于 IP 地址 192.168.1.2。

在您的 Win95 控制面板中选择网络图标。然后在列表中选择 TCP/IP -> 网卡 条目。单击属性,以便出现属性窗口,并执行以下操作

  1. IP 地址 选项卡下,选择“指定 IP 地址”,并在 IP 地址字段中输入 192.168.1.2,并在“子网掩码”字段中输入 255.255.255.0。

  2. 网关 选项卡下,在“新网关”字段中输入 192.168.1.1,然后单击 添加 按钮。这告诉 Windows Linux 服务器是网关。

  3. DNS 配置 选项卡下,选择“启用 DNS”,并在“主机”字段中输入您的机器的主机名。然后输入您用于内部网络的域。

  4. 如果您的 Linux 服务器上运行着 DNS 名称服务器,请在“DNS 服务器搜索顺序”字段中输入 192.168.1.1,然后单击 添加。如果您要使用您的 ISP 的名称服务器,请改为在此字段中输入您的 ISP 的名称服务器 IP 地址。

  5. 在“域后缀搜索顺序”字段中,您可以重新输入您的内部域,然后单击 添加 按钮。

  6. 最后,单击 确定 按钮。Windows 将重新启动,您将准备就绪。

结论

这种设置对我来说效果很好。每天早上上班前,我都会决定是否希望能够从办公室通过互联网访问我的电脑。如果我希望如此,我只需打开它,然后在早上 7:30,cron 启动 appear 脚本,我就开始工作了。

有一些安全问题需要注意——一旦您的服务器连接到互联网,任何人都可以访问它。为了防止人们从任何地方 telnet 到您的服务器,请将以下行添加到您的 /etc/hosts.deny 文件中

ALL: ALL

此条目拒绝从任何地方访问您的电脑——这是一个很好的默认设置。现在将以下条目添加到您的 /etc/hosts.allow 文件中

ALL: LOCAL myisp.net mywork.com

此条目仅允许您从本地网络、ISP 和工作场所的系统连接。(有关这些文件的更多信息,请参阅 hosts.allow 的手册页。)

Scott Steadman (ss@stdmn.com) 是一位合同程序员,与他可爱的妻子 Kim 和他们的两只猫住在佐治亚州劳伦斯维尔。

加载 Disqus 评论