用 Linux 脚本简化无线网络的管理

发表于:2007-05-25来源:作者:点击数: 标签:
功能强大的工具可以帮助您运行自己的无线 ISP 级别: 初级 Alan Baker 资深 软件工程 师和认证的 IT 专家 2005 年 8 月 01 日 为您的办公室或邻居设置一个无线的 Internet 服务提供者(WISP)并不需要繁重的劳动或昂贵的投资。如果您使用一些很容易购买到的设
功能强大的工具可以帮助您运行自己的无线 ISP

级别: 初级

Alan Baker
资深软件工程师和认证的 IT 专家
2005 年 8 月 01 日

为您的办公室或邻居设置一个无线的 Internet 服务提供者(WISP)并不需要繁重的劳动或昂贵的投资。如果您使用一些很容易购买到的设备和 Linux™ 来构建网络,那么可以利用 shell 脚本的强大功能来简化网络的管理。本文将提供一些您所需要的技巧和脚本。

使用现有的无线路由器创建一个小型的无线网络非常简单。但是为办公室、公寓或邻居提供符合业界标准的无线链接就是另外一回事了。在构建好无线网络之后,就可以运行无线 Internet 服务提供者(WISP)服务。要运行 WISP,则需要回答以下问题:

  • 所提供的到 Internet 的连接品质如何?
  • 哪些客户机可以直接连接到网络上,这些连接的品质又如何?
  • 有足够的带宽满足峰值的需求吗?
  • 最近有哪些客户机连接到网络上,它们的活动频率如何?
  • 哪些客户机具有可靠的连接,哪些客户机的连接不可靠?
  • 客户机有许多传输错误并需要重试吗?
  • 所安装的软件包有可升级的版本吗?
  • 大文件会占用很多空间吗?
  • 如何简化客户机的管理?

在本文中,您将学习如何使用 Linux 脚本来回答这些问题。在开始之前,首先需要设置服务器。

无线服务器硬件
我之所以成为一名无线 Internet 服务提供者,是因为我的邻居没有 DSL 或其他 Internet 接入服务。另外一个 WISP 从附近的一个山顶上提供了一条(昂贵的)连接,因此我决定购买这个服务,与邻居们共享带宽,并共同承担费用。访问点的无线卡会生成一个非常微弱的信号,因此,为了将信号丢失的情况降至最低,我希望能够将天线做得尽可能的短。还希望能够架设一条户外天线,这样就可以让更多的邻居可以访问这个无线链接。这两种设备让我可以将服务器设置在户外的天线上(参考资料 的链接中给出了一张图片,还提供了有关此文中讨论的产品和包的信息)。这个示范性的服务器是一个现有的无线访问点(WAP),它安装在一个防水的 Pelican 箱子中。它并不是非常可靠,因此我常常需要爬上屋顶来解决问题。我需要使用一架梯子来帮助我爬上爬下,以后还需要将这个访问点升级成一个更可靠的系统。下一代的硬件将会:

  • 非常可靠。
  • 支持 10 台客户机,另外提供一些系统管理工具。
  • 使用一个标准的无线网卡。
  • 支持通过以太网加电启动。
  • 是 Linux 友好的。

我购买了一块很便宜的系统板(Soekris Engineering 的 net4521),它可以完全满足这些需求,并且可以使用一块 Compact Flash Card,而不必再使用硬盘。这块系统板不用制冷风扇就可以在温度变化很大的环境中使用。

无线卡芯片确定了该系统板是 Linux 友好的, Intersil/Conexant Prism2/3 芯片也对 Linux 提供了很好的支持。

Linux 软件
Pebble Linux 是一个专门为嵌入式无线应用程序设计的发行版。为其取名 Pebble 就是因为它非常小,并且很简单。这个系统中包含了一些很好的特性,例如:

  • 为实现无线使用而定制的内核;这样就不需要再重新编译内核。
  • 大小;整个系统很小,可以放到一块很小的 Compact Flash Card 中,所以不再需要硬盘驱动器。
  • 以只读方式装载文件系统,因此,即使断电也不会造成文件系统崩溃。
  • 因为基于 Debian Linux 发行版,所以可以使用 Debian 的包。
  • 具有很好的支持。

Pebble Linux 包括很多可用的无线包,利用 Debian 的 apt-get 很容易添加其他包。您可能希望通过在另外一台服务器上放置一些包(例如 ntop)来共享工作负载。这些包可以在一块系统板上与 10 台客户机很好地运行,而不会过度浪费处理器或内存。以下是我推荐的几个开源包:

  • Wonder Shaper,用来确保客户机平等地共享带宽。
  • Wireless Tools(WT),用来与无线驱动器进行通信。
  • Host AP,用于 Prism2/3 芯片的无线访问点软件。
  • pcmcia-cs,用来管理无线网卡。
  • logrotate,用来压缩或删除日志。
  • Net-SNMP,用来收集路由器输出。
  • ntop,用来以图形形式显示利用情况的统计信息。
  • iptables,用作防火墙。

在参考资料中,可以找到这些工具的链接。

所需要的 Linux 无线管理脚本
这些包提供了一些基本的工具来启动无线网络并运行 Linux。从现在开始,要使这些工具一直顺利运行可能是一件头疼的事情;也可能非常简单,但需要使用一些工具来帮您实现以下功能:

  • 管理服务器
  • 管理客户机
  • 管理带宽

为了满足这些需求,我编写了很多脚本;所有这些脚本都可以从一个命令行中直接使用。Linux 具有一个很好的安全 shell(SSH)服务器的实现,因此我可以从任何具有 Internet 连接的地方来对服务器进行管理。

管理服务器
Linux 发行版本通常包括一些简单的管理工具,不过这些工具的功能却很强大。没有以下这些工具,我几乎无法生活:

  • df 给出关于每个文件系统的空间利用率的信息。当您的文件系统中只有有限的空闲空间时,该信息尤其有用。
  • top 给出服务器某个瞬间的快照,其中包含了有关启动时间、CPU 使用情况、内存使用情况和进程的信息。
  • pstree 提供了服务器进程的快照。这些信息很容易理解,因为进程都是以分层形式显示的。

我的 WAP 在内存中有一个只读的文件系统,用于为文件和日志提供服务。这样就可以将一个 Compact Flash Card 的文件系统一直作为只读模式使用。我编写了一些脚本来管理这些有限的空间。

bigfiles:bigfiles 脚本会判断应该删除哪些文件来防止出现空间用尽的情况。它对三种级别的空间利用情况进行了总结:

  1. 文件系统: 文件系统一共有多大?还有多少剩余空间?
  2. 目录: 文件系统中每个目录使用了多少的空间?
  3. 文件: 文件系统中哪些文件的大小超过了 90 KB?

输出结果如下:

清单 1. bigfiles 脚本的输出结果
clearcase/" target="_blank" >cccccc" border="1">

            ------------------------------------------------------------------------------
            Filesystem Size Used Avail Use% Mounted on
            tmpfs 10M 952k 9.0M 10% /rw
            Finding big files in /rw filesystem...
            916k ./var
            4.0k ./usr
            0 ./tmp
            8.0k ./root
            24k ./etc
            0 ./dev
            952k .
            952k total
            ./var/log/router
            ./var/log/messages
            ------------------------------------------------------------------------------
            

checkspace
checkspace 脚本每小时运行一次,负责在这个读写的文件系统上维护最少的可用空间。如果文件系统的利用率达到 80%,那么 checkspace 就会运行 logrotate,后者会根据需要压缩和删除日志文件。

aptgetupgrade:aptgetupgrade 脚本检查包的新版本,并进行必要的更新。这个脚本对 Debian apt-get 命令进行了简单的封装,可以通过 /etc/cron.daily 运行该命令,从而帮助您更新各种补丁。

管理客户机
无线客户机可能会出现一些问题,这一节中讨论的基于 Linux 的管理工具可以帮助您解决这些问题。下面是几个如何解决典型的用户问题的例子:

  • 问题: "Internet 今天是否出过问题?为什么我的浏览器无法找到 www.flakyhost.com 呢?"
  • 解决方案: 首先,使用 scanap 脚本检查无线网络的客户机;这可以告诉您有关所有已连接客户机的无线信号的质量,包括出问题的那些客户机。然后使用 pingall 脚本检查这个 IP 是否有问题;这将告诉您有关到达 ISP 网关、DNS 和所有客户机的延时时间,其中包括那些有问题的客户机。如果这两个脚本都说您的网络没问题,那么不妨试一下 www.flakyhost.com 是否有问题。
  • 问题: "昨天我从 www.flakyhost.com 下载东西时的速度是 X。为什么现在我的速度只有 Y 呢?"
  • 解决方案:要判断您的网络是否被其他人利用了,请运行 countlog 脚本。该脚本可以按照客户机和时间列出今天的传输历史记录。

为了改进简单性和安全性,您可能希望试验一下我为用户提供的一种方法。我获得了每台客户机的 MAC 地址,因此只有那些已知的 MAC 地址才允许连接到这个无线网络上。我为每台客户机都分配了一个固定的 IP 地址,这样只有那些已知的 IP 地址才能通过路由器。将这些客户机的信息保存在某个地方要比同步并复制配置文件容易得多。我在 /etc/hosts 中为每台客户机的 IP 地址都分配了一个容易记忆的名字,并在同一行中写下了该客户机的 MAC 地址。例如:

清单 2. 分配一个主机名和 MAC 地址

            192.168.168.198 wet11two 00:0C:41:BE:BF:B0
            

请参阅参考资料中 /etc/hosts 的一个示例实现。

networkingrestart:networkingrestart 脚本负责启动网络,并对所有有效的客户机进行身份验证。它将读取 /etc/hosts 文件,然后将这个 MAC 地址添加到无线访问控制列表中。

gethost:在向 gethost 脚本传递一个 IP 地址、主机名或 MAC 地址时,它就会从 /etc/hosts 文件中返回所有这三种内容。countlog、pingscan 和 scanap 脚本都会使用 gethost 脚本,也可以在命令行中直接使用此脚本。

scanap:scanap 脚本的作用是显示 IP 地址、MAC 地址、主机名,以及客户机与 AP 之间的连接的质量。它会对 Wireless Tools 的 iwlist 的输出结果重新进行格式化,并添加 MAC 地址的信息,这样就可以在每一行中对每台客户机的状态进行总结。它的输出结果如下所示:

清单 3. scanap 脚本的输出

            --------------------------------------------------------------
            MAC Address...... Quality Signal Noise. IP Address....... Name
            00:0C:41:BE:BF:B0 238/92 -29 -35 192.168.168.198 wet11two
            ------------------------------------------------
            

管理带宽
WISP 要负责处理有线网络中的所有复杂问题,以及特定于无线环境的一些问题。下面这些脚本可以确保您所提供的带宽既稳又快。

errors:errors 脚本会对 Linux 的 /proc/net/ 中的信息进行统计,并给出这个访问点的所有传输错误率的快照。它还将输出结果写入一个表格文件,供以后处理使用。它的输出结果如下:

清单 4. errors 脚本的输出结果

            ------------------------------------------------------
            13 22:20 TX Octets: 294080 TX errors: 1665 TX error ratio: 176
            13 22:20 RX Octets: 893539 RX errors: 3225913 RX error ratio: 0
            ------------------------------------------------------
            

这个例子说明第一次成功传送的报文的数量比需要重新传送的报文的数量多 176 倍,还说明发送报文时出现的错误远远多于接收报文的错误。这些数字仅仅是我们需要观察的一些指标,因此如果这些数字并不一致,也不用担心。使用情况会对这些比率值造成非常大的影响。如果不使用网络,就不会有成功的报文,因此这个比率就是 0。如果很少使用网络,那么这个比率就会很低。随人们越来越多地使用网络,这个比率可能会极其高。

pingscan:pingscan 脚本负责测量网络的延时,它将说明客户机是否具有最快、最可靠的吞吐量。它向客户机发送 4 个短的 ping 包(每个是 56 个字符)和 4 个长的 ping 包(每个是 1,024 个字符),然后返回以下信息,每行的内容如下:

  • 客户机的主机名和 IP 地址。
  • 时间戳。
  • 接收到短 ping 包的响应的个数。
  • 接收到长 ping 包的响应的个数。
  • 对短 ping 包响应超过 1 秒的个数。
  • 对长 ping 包响应超过 1 秒的个数。

它还要将结果记录到一个电子表格文件中,便于以后进行分析。在如清单 5 所示的结果中,这个主机目前执行得很好。这些响应来自 4 个短的 ping 包和长的 ping 包。没有一个响应超过 1 秒。

清单 5. pingscan 脚本的输出

            -------------------------------------------------------
            wet11two,2005-03-18,23:59,4,4,0,0
            -------------------------------------------------------
            

下一个示例输出清单是在一天后执行的。在这一天中,同一台主机上丢失了一些响应信息 —— 4 个短 ping 包中只有一个收到了响应,4 个长 ping 包中只有 3 个收到了响应。

清单 6. 示例 pingscan 脚本的输出

            -------------------------------------------------------
            wet11two,2005-03-19,23:59,1,3,0,0
            -------------------------------------------------------
            

如果其他客户机都运行良好(4,4,0,0),那么就是这台主机目前出现了问题。另一方面,如果多台客户机上都丢失了响应信息,那么问题就可能在于访问点上。

通信的监视
了解 AP 上有多少通信是非常有用的。实现这种功能的一种方法是通过 SNMP 来记录路由器的通信信息,然后对这些日志记录进行统计。不同路由器的日志也有所不同,因此您需要以不同的方式对它们进行处理。

我将路由器配置为将其 SNMP 的记录发送到一个搜集器主机(在这里是 AP)的 IP 地址。在 AP 一端,我将运行 snmpd 和 snmptrapd 守护进程,将这些记录保存到一个文件中。这些记录如下所示:

清单 7. 记录搜集

            "@out 192.168.168.192 2983 208.222.234.90 80."
            "@in 211.107.232.1 51550 192.168.168.196 21."
            

外发的记录是一个 Web 请求,从 192.168.168.192 发往 208.222.234.90。传入的记录是一个 FTP 请求,从 211.107.232.1 发往 192.168.168.196。

您可以从这个文件中提取很多有用的信息 —— 例如,可能有一些您希望阻塞的病毒探测。countlog 脚本可以使用两种不同的方法来统计这些传入的记录和外发的记录。它可以统计最后 n 分钟内的请求数量,其中 n 可以是一个自行定义的数字:

清单 8. countlog 脚本统计 n 分钟内的请求数量

            Checking 5 minutes before 23:59...
            101 requests in 5 minutes
            An average of 20 requests per minute
            

它还可以统计过去 24 小时内请求的个数:

清单 9. countlog 脚本统计过去 24 小时内请求的个数

            Start... Total Outbound and Inbound Today
            00:00... out: 192 in: 63 out/min: 3
            .
            .
            .
            19:00... out: 243 in: 96 out/min: 4
            20:00... out: 308 in: 66 out/min: 5
            21:00... out: 151 in: 103 out/min: 2
            22:00... out: 206 in: 94 out/min: 3
            23:00... out: 160 in: 70 out/min: 2
            Totals.. 2095 1759
            IP Address (Host Name) Total Outbound Today
            192.168.168.8 (cheltenham) 659
            192.168.168.191 (t30lan) 156
            192.168.168.192 (downstairs) 1044
            192.168.168.196 (opteron) 236
            Total all IP's.... 2095
            

结束语
很多命令行 shell 脚本都可以简化 WISP 的管理。下面是最后几点提示:

  • 不要在客户端使用 USB 无线网桥。它们的功能非常有限,当客户机关机之后,就无法 ping 到它们了。
  • 不要试图通过一个非常便宜的家用路由器来运行一个很大的无线网络。这样会产生不可预知的后果。

使用本文中介绍的工具和技术,您应该可以搭建并运行自己的无线网络。

原文转自:http://www.ltesting.net