幽灵般进入网络
最近,我突然想摆弄一下家庭网络管理,以便获得一些 Unix 和异构网络管理的经验。我有三台 Windows 电脑(两台装有 Windows 95,一台装有 Windows 3.1)连接到一台 Linux 服务器。我将 LinTel 电脑用作本地文件服务器和连接家庭网络到互联网的网关。
我用来处理文件服务器任务的软件是 SAMBA。我设置 SAMBA 的主要参考资料是 1996 年 7 月刊的Linux Journal 上关于该主题的优秀文章。
在选择拨号程序时,我考虑了两个要求
我不想每次想要访问互联网时都手动登录我的 ISP。
我不希望我的 LinTel 电脑在启动时呼叫我的 ISP,然后保持连接直到我关闭它。我希望通过不垄断电话线来体谅 ISP 的其他客户。
Eric Schenk 编写的一个名为 diald 的程序满足了这两个要求。我使用 diald 在我有发往互联网的流量时连接到我的 ISP。如果指定的时间间隔内没有流量,它也会自动断开与 ISP 的连接。
我为多家可以访问互联网的公司工作,在工作时,我喜欢时不时地通过互联网访问我的家用 Linux 服务器——以防我在午休时间发现一些有趣的东西,想在家里摆弄一下。因此,我设置我的服务器在 15 到 60 分钟之间的各种随机间隔连接到互联网,徘徊五分钟,如果没有流量则断开连接。当我的服务器连接时,我可以下载任何我想要的东西。我称这个过程为幽灵化。
这些是我让幽灵化工作的步骤。根据您是否已经安装了 Linux 以及它的版本,您可能可以跳过一些步骤。
我做的第一件事是从 Red Hat Software (https://#/) 获取 Red Hat 4.0。我听说过 Red Hat 的好评,并且喜欢他们的“Red Hat 软件包管理器”来处理软件错误修复和升级——它确实让生活更轻松。我按照安装过程中给出的说明安装了 Red Hat。
接下来,我从 sunsite.unc.edu 下载了当时可用的最新内核版本 2.0.29,并使用特定于硬件的设置配置了我的新内核。
幽灵化的另一个必要条件是 IP 伪装。我找到了三个关于 IP 伪装的良好信息来源
最权威的是 IP 伪装资源主页,网址为 http://www.wwonline.com/~achau/ipmasq/。
IP 伪装迷你 HOWTO,可能在您最喜欢的互联网 Linux 站点上找到。
最后一个是 1996 年 7 月刊的 Linux Journal 中的 IP 伪装文章。我从 IP 伪装资源主页下载了内核 2.0.28 及更高版本的最新 IP 伪装补丁,它在我的 2.0.29 内核上运行良好。同样,我所要做的就是按照说明使用 make menuconfig 方法重新配置内核。以下是 IP 伪装工作的相关设置
在 代码成熟度级别选项 下,启用“提示开发和/或不完整的代码/驱动程序”。(IP 伪装代码仍然被认为是 alpha 代码。)
在 网络选项 下,启用“网络防火墙”、“网络别名”、“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 同时生成最多五个编译。这种编译方法极大地加快了构建过程。
安装 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 的指令。聊天脚本基本上是一系列 wait 和 send 字符串。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 获取该信息。
现在,我希望系统在成功连接或断开与互联网的连接后立即执行一些操作。幸运的是,pppd 有一些功能可以轻松实现这一点。当 ppp 链接建立时,守护进程会检查是否存在名为 /etc/ppp/ip-up 的脚本。如果此脚本存在,则 ppp 守护进程会使用指定的连接参数调用它。我的这个脚本版本出现在清单 2 中——请注意脚本顶部的注释指示了 pppd 传递给脚本的参数。
当 ppp 链接断开时,ppp 守护进程会检查是否存在名为 /etc/ppp/ip-down 的文件。如果此文件存在,则在 ppp 链接终止时调用它。我的脚本内容如清单 3 所示。此脚本主要执行一些清理工作——撤消我在 ip-up 脚本中所做的工作。
接下来,我获取并设置了拨号器守护进程 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。
安装 diald 后,我创建了一些脚本来轻松启动和关闭它。启动它的脚本名为 /etc/ppp/diald-up,如清单 4 所示,其中包含大量注释。
由于此脚本有点晦涩难懂,我将更详细地介绍它。route 命令用于告诉网络软件如何从您的计算机到达其他计算机和网络。通常,当网络软件在路由表中找不到其他合适的路由时,会使用默认路由。要查看您的路由表,请使用 netstat -rn 命令。有关更多信息,请参阅 netstat 手册页。
清单 4 中的第一个命令删除默认路由,以确保它可供 diald 或 ppp 守护进程使用。此删除是必要的,因为有时如果已分配默认路由,diald 和 ppp 将不会重新分配默认路由。
第二个命令启动拨号器守护进程。(有关更多详细信息,请参阅 diald 手册页。)要在您的脚本中使用此行,您需要更改三项
通信设备 /dev/cua0
本地地址 10.10.10.1
远程地址 192.168.1.2
如果您有固定的 IP 地址,您还需要从脚本中删除 dynamic 开关行。
第三、第四和第五个命令用于设置防火墙。这些命令必须在拨号器守护进程之后运行,因为它通过默认路由将网络伪装到互联网。每当数据包需要通过默认路由离开时,拨号器守护进程都会感知到它,并使用 ppp 守护进程建立与互联网的连接。
我还有一个脚本可以优雅地关闭拨号器守护进程。我称之为 /etc/ppp/diald-down,源代码如清单 5 所示。
可以使用在 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 脚本使 diald 连接到互联网,然后发送服务器可以访问的位置的指示到所需位置。我创建了一个名为 /etc/ppp/appear 的脚本来完成这项工作。此脚本如清单 6 所示。
最后,我在 /etc/crontab 文件中添加了一个条目。此文件由 cron 守护进程使用,以确定何时运行什么。(有关 cron 的更多信息,请查看 cron 手册页。)这是我添加的行
30 07 * * 1-5 root /etc/ppp/appear
此条目告诉 cron 守护进程在周一至周五的上午 7:30 启动您的 appear 脚本。appear 脚本每天只需以这种方式启动一次;然后它会在时间合适时重新启动自身。
完成所有这些步骤后,我就设置好了在互联网上幽灵化来回,如果您一直在遵循这些步骤,您也将准备就绪。
如果您像我一样决定将一些 WinTel 电脑连接到您的 Linux 服务器,这里有一些提示可以帮助您启动并运行。
在以下示例中,我假设您的个人网络位于 192.168.1.* 子网中,Linux 服务器位于 192.168.1.1,而您的 Win95 机器位于 IP 地址 192.168.1.2。
在您的 Win95 控制面板中选择网络图标。然后在列表中选择 TCP/IP -> 网卡 条目。单击属性,以便出现属性窗口,并执行以下操作
在 IP 地址 选项卡下,选择“指定 IP 地址”,并在 IP 地址字段中输入 192.168.1.2,并在“子网掩码”字段中输入 255.255.255.0。
在 网关 选项卡下,在“新网关”字段中输入 192.168.1.1,然后单击 添加 按钮。这告诉 Windows Linux 服务器是网关。
在 DNS 配置 选项卡下,选择“启用 DNS”,并在“主机”字段中输入您的机器的主机名。然后输入您用于内部网络的域。
如果您的 Linux 服务器上运行着 DNS 名称服务器,请在“DNS 服务器搜索顺序”字段中输入 192.168.1.1,然后单击 添加。如果您要使用您的 ISP 的名称服务器,请改为在此字段中输入您的 ISP 的名称服务器 IP 地址。
在“域后缀搜索顺序”字段中,您可以重新输入您的内部域,然后单击 添加 按钮。
最后,单击 确定 按钮。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 和他们的两只猫住在佐治亚州劳伦斯维尔。