从局域网的任何位置监控 diald
想象一下,在一个没有拨号音、没有铃声信号、也没有忙音信号的系统上拨打电话。您只需拨打号码,然后等待有人接听或无人接听。过一段时间后,这可能会是一种令人沮丧的体验。这类似于局域网上有人在远程计算机上使用 diald,却没有任何方法来监控远程链路的状态,而这正是我大约一个月前着手解决的问题。
我的家庭局域网包括我的主 Linux 电脑和许多其他运行 Linux 和 Windows 95 组合的计算机。通过将主 Linux 电脑配置为使用 diald 和 IP 伪装,我的妻子可以使用她的 Win95 电脑来查看她的电子邮件、浏览网页以及执行其他 Internet 任务,而无需处理调制解调器、拨号字符串或 Linux 电脑。她只需启动 Netscape,访问 Web 上的站点,然后等待。Linux 电脑拨打 ISP,自动验证并在大约 30 秒内建立连接——除非调制解调器收到忙音信号。不幸的是,没有任何反馈机制来告知 Win95 电脑连接的状态。本文介绍了我的问题解决方案。
一台配备调制解调器并配置为使用 IP 伪装和 diald(“按需拨号”的缩写)的 Linux 电脑,允许局域网上的每台计算机“认为”它直接连接到互联网。源自局域网节点的互联网请求会被发送到 Linux 电脑。如果 diald 确定到互联网服务提供商 (ISP) 的串行链路当前未激活,它将启动拨号序列(因此称为“按需拨号”)。建立连接后,Linux 电脑将通过 ISP 的计算机进行身份验证,并建立到互联网的链路。IP 伪装允许局域网上每台计算机使用单个连接,方法是检查每个发往(或来自)外部世界的数据包,并在适当的地方替换地址。连接的 ISP 端仅看到发往(或来自)它已验证的单个 IP 地址的流量——回复数据包中的地址随后会被替换回原位,然后 IP 伪装盒将数据包放置在局域网侧。虽然非常复杂,但当正确配置时,这一切都工作得非常出色。
然而,当我的妻子查看她的电子邮件时,她无法知道链路的当前状态。她的计算机尝试获取邮件,向运行 diald 的 Linux 电脑发送请求。Linux 电脑启动与 ISP 的拨号和身份验证,但这需要大约 30 秒,而 Windows 95 机器没有那么耐心。当我使用她的机器时,我只是使用 TELNET 连接到 Linux 电脑,并通过执行类似 tail -f /var/log/messages 的操作来观察 diald 的进度,但这需要访问系统日志并了解如何解释它们。
该系统的主要目标是提供一种更简单的方法来监控远程链路的状态。由于我已经安装了 HTTP 服务器 Apache,并在我的 Linux 电脑上运行,并且房子里的所有计算机都具有某种 Web 浏览器,因此基于 HTTP 的解决方案似乎是最简单的。它的优点是只需要更改 Linux 机器,从而使部署非常简单。从概念上讲,需要的是
一种监控 Linux 电脑上 diald 状态的方法
cgi 脚本可以获取该信息并将其传递给客户端的方式
在客户端自动更新信息的某种方法
从底层开始向上工作,您首先需要让 chat 工作。我使用 chat 脚本 /etc/ppp/chat.mindspring(见列表 1)拨号连接到我的 ISP Mindspring。我发现 ISP HOWTO (metalab.unc.edu/mdw/HOWTO/ISP-Hookup-HOWTO.html) 和 diald mini-howto (metalab.unc.edu/linux/HOWTO/mini/Diald.html) 对让 chat 和 diald 良好地工作非常有帮助。IP 伪装 mini-howto (metalab.unc.edu/linux/HOWTO/mini/IP-Masquerade.html) 在帮助我配置 IP 伪装方面发挥了重要作用。通过仔细阅读、细致规划和有条不紊地工作,您应该能够在几个小时内轻松地使您的系统正常工作。
此 chat 脚本使用 SAY 选项,该选项允许从 chat 内部打印字符串到 STDOUT。但是,STDOUT 必须重定向到一个文件才能在此应用程序中发挥作用。这是通过使用 Perl 脚本运行 chat 来完成的(见列表 2)。
此脚本是必要的,因为我们使用单个 diald FIFO(先进先出)来发回消息。正如您从脚本中看到的,我们使用“message”前缀将消息发送到 diald 控制 FIFO。此外,我们需要调用 chat 的复杂方法,因为旧版本的 diald 调用 connect 脚本时,STDERR 被定向到输出设备。通常这工作正常,但我们需要将 STDERR 结果发送到一个文件,而不是发送到调制解调器。从 0.98 开始的 diald 版本默认会将 STDERR 输出定向到监视器,从而使此过程简单得多。幸运的是,diald 设置了许多对该脚本有用的环境变量,包括 MODEM 和 FIFO,这使我们能够编写一个相当可移植的脚本。
在 diald 控制脚本(列表 3)中,请注意 connect 行(第 3 行),它运行 runchat.pl Perl 脚本。它有一个参数,即使用的 chat 选项文件的名称。这在同时运行多个 diald 守护程序的情况下很有用。在我的例子中,一个 diald 建立到我的 ISP 的连接。另一个 diald 拨号连接到我的办公室局域网。两个 diald 脚本之间唯一需要的区别是提供给 runchat 脚本的参数。我的情况下的其他区别是最后一行中指定的 pppd-options 文件,以及 defaultroute 行(我的办公室连接使用单独的路由脚本)。
如果您使用的是更新版本的 diald,则 diald 控制脚本将需要进行一些更改。我仍然使用 diald 版本 0.16.4 和 2.0.36 内核,但我计划在迁移到 2.2 内核后尽快升级到最新的 diald 版本 0.99.1。除了许多错误修复之外,新版本还包括一些功能,这些功能可能对像这样的脚本很有用。您可以在 http://diald.unix.ch/ 找到有关最新版本 diald 的信息,现在由 Mike Jagdis 维护。
还需要一些其他部分才能使所有这些工作。其中之一是建立与 diald 的连接并通过监视器 FIFO 侦听 diald 和 chat 必须说的内容的脚本。此脚本在列表 4 中再现,并且是简陋守护程序的 Perl 实现。
这个简单的脚本维护一个文件 (/tmp/diald.status),其中包含最后几个相关的条目。遵循 Tk dctrl 程序的引导,每当收到 CONNECT 字符串时,该文件就会被清除。这是一种有用的切分事物的方式,因为用户可能只对当前的连接进度感兴趣,而不是对历史数据感兴趣。当 diald 确定需要新连接时,CONNECT 消息是第一个通过 FIFO 传输的消息。另请注意,消息被检测到并以未解析的方式传递到输出文件。
最后,最终用户必须实际看到所有这些工作的成果。这是通过在 Linux 电脑上设置一个特殊的网页来完成的,该网页使客户端浏览器生成一个单独的状态窗口,允许用户在浏览或下载电子邮件时监控 Internet 连接的状态。浏览器的主页设置为适当的本地页面(即,由 Linux 服务器提供的页面),其中包含以下 JavaScript 标记
<SCRIPT LANGUAGE="JavaScript"> <!-- comment hides the script from old browsers newWindow = window.open ( 'http://clyde/cgi-bin/dialdstate.pl?', 'dialdstate',<\n> 'scrollbars=no,status=no,width=365,height=285, status, marginheight=2, marginwidth=2'); // end of hidden portion. --> </SCRIPT>
高度和宽度是凭经验选择的,“clyde”是呈现给局域网的服务器盒子的名称。剩下的就是 dialdstate.pl 程序的内容,它在列表 5 中。
这个脚本除了设置一个带有 JavaScript 的简单页面之外,几乎什么都不做。它不仅仅是一个普通的 HTML 页面,唯一的原因是我们使用自动重新加载来使浏览器每 7 秒自动刷新页面。这是 setTimeout("location.reload() ", 7000); 行,它每 7000 毫秒执行一次 location.reload 命令。这会导致服务器上的 Perl 脚本重新运行并向用户提供最新数据。这在我的用户少、流量小的家庭局域网上很好,但在更大的局域网上部署它之前,您应该仔细考虑负载影响。
此解决方案满足了向用户提供链路状态信息的目标,用户只需付出最少的努力,并且客户端无需自定义软件。但是,与任何项目一样,仍有改进的空间。
可能的未来增强功能包括升级到最新版本的 diald 并利用其更多功能,例如报告多个连接的状态。另一个改进可能是用 C++ 而不是 Perl 重写“守护程序”。现有版本可以工作,但它不是特别优雅。
还可以添加通过 JavaScript 按钮进行远程链路控制(例如,Up、Down、Block 等),但这应该谨慎完成,以避免打开安全漏洞。允许外部站点查看局域网拨号链路的状态不一定是安全问题,但允许外部站点控制它则会是。在我的 Linux 电脑上,我设置了 IP 伪装,使得 HTTP 服务器仅在局域网内可见。另一种方法可能是使用 Apache 中的安全方法来限制对敏感网页的访问。
Ed Beroset (beroset@mindspring.com) 在位于北卡罗来纳州罗利市的 ABB Automation 担任固件经理。在他往返 Chapel Hill 家的长途通勤中,Ed 经常从事他的另一项爱好,业余无线电,作为 KF4UQX。他的妻子 Marilyn 是一位心理治疗师和兼职软件缪斯女神。