Board logo

标题: 在 Linux 上构建无线接入点(2)项目计划-2 [打印本页]

作者: look_w    时间: 2018-5-7 16:45     标题: 在 Linux 上构建无线接入点(2)项目计划-2

网络设置对于接入点,我们真正需要的是一个简单的网桥;来自一个网络的数据包出现在另一个网络上,没有什么特别用途。这个机器不是路由器,也不是 DHCP 服务器或者任何别的东西,它只是一个网桥。当然,可以将它设置为 DHCP 服务器或者其它角色(这样的角色有许多种),但设置为网桥最容易。网桥仅仅在有线网和无线网之间传递数据包。这样,无线设备可以查找任何自己想要找的内容,就好像自己完全连接在物理网络上。
Pebble Linux 基于 Debian,因此这意味着它使用 /etc/network/interfaces。用 Google 可以快速地搜索到一组可供使用的样本命令:
清单 1. 构建网桥
1
2
3
4
5
6
7
8
9
10
11
12
13
iface br0 inet dhcp
  bridge_ports eth0 wlan0
  pre-up ifconfig eth0 0.0.0.0 up
  pre-up ifconfig wlan0 0.0.0.0 up
  pre-up iwconfig wlan0 mode master
  pre-up brctl addbr br0
  pre-up brctl addif eth0
  pre-up brctl addif wlan0
  post-down ifconfig eth0 0.0.0.0 down
  post-down ifconfig wlan0 0.0.0.0 down
  post-down brctl delif br0 eth0
  post-down brctl delif br0 wlan0
  post-down brctl delbr br0




这看起来有点令人望而生畏,但确实一点都不难。接口本身是网桥(br0),使用 dhcp 进行配置,在 eth0(第一块以太网卡)和 wlan0(我们的无线网卡)之间起桥接作用。在启动该接口之前,有一组命令要运行(pre-up),在关闭该接口之后,有另外一组命令要运行(pre-down)。
在本例中,我们需要启动将要进行桥接的那两个接口,将我们的无线网卡置于“master”方式(使它成为接入点),然后构建一个网桥接口并将那两个接口连接到该接口上。完成之后,dhcp 限定符就使我们的机器自己通过 dhcp 获取一个 IP 地址。这实际上是可选的;网桥并不需要有自己的 IP 地址,因为它将透明地把数据包从一个接口转发到另一个接口。不过,如果它有自己的 IP 地址,那么我们就可以在网络上使用接入点本身了;这样做的安全性要差一些,但在用于演示方面会更有趣。
当我们关闭接口时,我们关闭了以太网端口,将它们从网桥上除去,然后除去网桥接口。我们必须先创建网桥接口,然后才能向它添加以太网端口,因此,现在我们先除去以太网端口,然后再删除网桥接口。
这一过程假定这些接口不是由任何其它机制来配置的,因此我们希望注释掉与 wlan0 或 eth0 有关的其它行,但我们确实使用了 /etc/pcmcia/hostap_cs.conf 来设置无线网卡的 ESSID(基站名称)。我们可以在用于 br0 的 pre-up 脚本中这样做,只是对于这块特定的卡,如果将 ESSID 和 WEP 密钥设置得太过于接近,那么卡就会挂起一会儿。(什么是 WEP 密钥?就是那个我们要加入一些内容的密钥。)
您可能认为,可以在 /etc/network/interfaces 中仅仅添上“auto br0”,然后会自动配置接口。遗憾的是,如果无线网卡是 PCMCIA 卡,那么在正常启动网络接口时,PCMCIA 卡的接口将不可用。因此,稍后我将在引导过程中处理这一问题。在 /etc/rc2.d 中创建一个名为“S99local”的文件。在该文件中,加入下面这一行:
1
2
#!/bin/sh
ifup --force -v br0




实际上,--force 和 -v 这两个选项都是可选的。接口不应该立即启动,因此我们不需要         --force 选项。使用         -v 仅仅是为了让我们在配置期间能够看到正在运行的命令。      
现在,保存所做的更改然后重新引导系统。如果一切按计划进行,那么现在您应该能够连接到我们刚刚建立的无线网络(网络标识为“test”),能够运行 DHCP 客户机并从常规的 DHCP 服务器获取 DHCP 服务。(如果不是这样,那么您的有线网络所使用的网块中的某个静态 IP 地址也能行。)
当然,这里有一个明显的缺陷:我们没有使用 WEP(有线对等保密,Wired Equivalent Privacy)密钥。WEP 理论上被认为会使您的网络很安全;实际上,它只会略微减缓入侵者的入侵速度。如果您不介意那些随意的过路人使用您的网络,那么没有 WEP 密钥也不是什么大不了的事情。但是,万一您介意,您就应该设置一个 WEP 密钥。为了做到这一点,我们:在 /etc/network/interfaces 中将 br0 设置中的 iwconfig 行更改为下面的样子:
1
pre-up iwconfig wlan0 mode master key s:blahblahblah1




它将密钥指定为 13 个字符(104 位)的字符串。有些网卡可能无法支持 104 位的密钥;在这种情况下,请使用 5 个字符(40 位)的密钥。如果您的无线网卡在您这么做的时候挂起了,那么请尝试在 /etc/network/interfaces 中用于设置无线密钥的那一行前面添加“pre-up sleep 5”。
现在,我们有了一个使用 WEP 和只读文件系统的无线接入点,因此您可以把它拆下来,再插回去,它将会启动 — 可能没有某些商业性接入点那么快,但它会再次启动,没有任何损失也不会丢失任何文件。
调整以下内容才真正有趣。我们可以让这台机器做各种事情。传统的一个示例是 Web 服务器;媒体可能会把这种事物描绘成一台庞大的液体冷却的机器,它闪着光芒,机声隆隆;但您我都知道,它实际上只占用几兆字节的磁盘空间和对系统产生几乎无法察觉的负载。在这一节中,我们将使用 apt-get 来添加几个软件包(包括 Web 服务器),然后在这个新的本地 Web 服务器上开始运行 CGI 脚本。
让我们从获取当前软件包列表开始。运行         /usr/local/sbin/remountrw 将使我们具备本地介质的写访问权。接下来,我们运行         apt-get update 。该命令会下载大量数据(这就是为什么我们需要 128MB CF 卡的原因了) — 我们正在获取这个 Debian 版本可用的软件包的列表。      
我们将要安装 Apache Web 服务器,这需要我们具有一点前瞻性;我们希望为日志文件分配一块空间,并且我们希望它位于临时磁盘空间中,并且具有读-写权限。创建一个名为 /var/log/apache 的新目录。因为 /var/log 实际上是 /rw/var/log 的符号链接,安装程序会在正确的地方创建它。接下来,运行         apt-get install apache 。在看到几个提示符时按回车键 — 哦!— 您有了一个 Web 服务器。访问这个 Web 服务器;您的 Web 服务器将位于分配给您的机器的 IP 地址上,并且将具有 Debian 所使用的缺省 Apache 配置。      
遗憾的是,在每次重新引导时都会丢弃 /rw 文件系统。如果您希望日志文件下次也能够正确地被创建,那么就必须修改 /rw 文件系统的模板,即 /ro 目录。进入 /ro/var/log,然后创建一个名为 apache 的目录。现在,在重新引导之后,您的 Web 服务器应该已经启动并且正在运行。在我的系统上,Web 服务器占用了 63MB 空间 — 对于 64MB CF 卡,这可能太大了一点。
接下来做什么?CGI 脚本呢?转至 /usr/lib/cgi-bin。您必须挂装文件系统(具有读写权限)来创建脚本。让我们从 hello.cgi 开始:
清单 2. 您好,无线世界!
1
2
3
4
5
#!/usr/bin/perl -w
print <<EOH;
Content-Type: text/plain
Hello, world!
EOH




保存该脚本,使它能够执行(模式为 755),然后尝试访问 Web 服务器上的 /cgi-bin/hello.cgi。
我们还可以做其它什么事情呢?想做什么就做什么。有了 Web 服务器和 Perl 之后,世界就会变得精彩。让我们添加另外一个名为 stats.cgi 的脚本:
清单 3. 获取统计数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
cat <<EOF
Content-Type: text/html
<HTML><HEAD><TITLE>WAP Stats</TITLE></HEAD>
<BODY>
<H2>Stats:</H2>
<PRE>
EOF
ifconfig -a
cat <<EOF
</PRE>
</BODY>
</HTML>
EOF




瞧!网络流量报告……虽然格式不是很好,但谁又在乎这个问题呢?编写这个脚本花了 30 秒钟。
嗯……如果我们想复查我们的配置,该怎么做?以下是 file.cgi:
清单 4. 仅仅作检查
1
2
3
4
5
#!/bin/sh
cat <<EOF
Content-Type: text/plain
EOF
cat $1




不幸的是,将它称之为安全性漏洞有些轻描淡写。但它极好地演示了我们的无线接入点现在是多么的灵活。实际上,我使用该脚本来从系统删除别的脚本;这比使用 scp 要容易一些。
这些示例并不十分深奥;对 CGI 编程的详细讨论已经超出了本文的范围。这里只是为了给您一些启蒙思想。您可以在类似这样的机器上托管一个 weblog,但您可能希望使用某种辅助存储器来存放实际的数据文件。当然,您可以通过 NFS 挂装一个远程磁盘!
在我完成上述设置之后,我所使用的嵌入式系统(Soekris Net4521)有超过 36MB 的可用内存以及大约 50MB 的可用磁盘空间。对于很多存储需求而言,这些空间已经足够了,并且它还留出了足够的可用 CPU 时间用于运行各种小的服务。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0