西非的无线电电子邮件:完整版本

作者:Wayne Marshall

编者注:以下是发表在 2002 年 11 月号 Linux Journal 上同名文章的完整版本。

在西非正面地带几内亚温暖绿色的内陆深处,达博拉、基西杜古和恩泽雷科雷等分散的村镇的现场人员现在可以直接从他们的桌面上享受定期的互联网电子邮件访问。在这里,我们弥合了数字鸿沟,而且看不到电话线或卫星天线。相反,我们正在通过高频 (HF) 无线电波,在数百英里的距离上移动邮件——穿越丛林覆盖的山脉和高耸的棕榈热带草原。我们的项目称为无线电电子邮件,以下是它的故事。

几内亚共和国是一个腰果形的国家,拥有大西洋景观地产,位于西非西部赤道以北 10 度。这是一个美丽且资源丰富的国家,总陆地面积与俄勒冈州大致相当。就非洲国家而言,几内亚是一个平静的和平与稳定区域,通常不会引起其自身边界以外的太多关注。

但近年来,几内亚在世界事件舞台上悄然扮演了英雄般的角色。它为多达 50 万因邻国塞拉利昂和利比里亚的残酷战争和内乱而流离失所的人们提供了安全和受欢迎的避难所。

国际救援委员会 (IRC) 在几内亚开展了最大的行动之一,为安置在该国各地许多难民营的最多 20 万难民人口提供服务和支持。当我的妻子在 2001 年夏天接受了该项目国家主任的职位时,我开始参与 IRC。很快,我们开始了对难民营的视察之旅,长途跋涉前往该项目在内陆的三个外地办事处。我们的第一个目的地是一个遥远而尘土飞扬的村庄,名字令人愉快,叫做基西杜古——在当地口语中经常被称为基西。

在首都科纳克里以外旅行,人们立即发现几内亚的基础设施很少,尤其是在电网和电信系统方面——更不用说星巴克和互联网宽带接入了。因此,IRC 外地办事处必须提供自己的基础设施:用于发电的柴油发电机和高频 (HF) 双向无线电装置,用于与数百英里外的其他办事处和移动单位进行通信。

考虑到这种孤立和普遍缺乏连接性,当我们到达基西时,我非常惊讶。在这里,我发现无线电操作员正在使用他的设备,通过无线方式将二进制文件从他的台式电脑传输到另一个外地办事处!

这种能力让我感到惊讶和好奇。在操作员的无线电装置顶部,连接到他的 PC 的串行端口,放着一个标有 9002 HF 数据调制解调器的肮脏黑盒子。我注意到操作员使用专有的 MS-DOS 程序进行文件传输,但我立即开始想:如果这个设备真的是某种调制解调器,在无线电的以太中移动二进制数据,为什么我们不能用 Linux 设置它并通过 PPP 连接进行网络连接呢?

经过一些研究和测试,我很快证实,该设备确实可以构成广域网络的基础,为每个外地办事处的所有人员提供通过科纳克里办事处完全访问互联网电子邮件的权限。此外,由于 IRC 已经拥有大部分设备——并且由于我们将使用 Linux 和其他免费提供的开源软件——该系统的实施成本可以忽略不计,并且不会增加运营费用。只需购买一些网卡和 5 类电缆,我们就可以将我们的偏远地区办事处与世界其他地方连接起来。我开发了系统的设计和规范,我们称之为无线电电子邮件的项目自 2002 年 1 月以来一直在持续运行。

高频无线电传播距离远

如果您最近一直在转向无线,那么您很可能正在使用 802.11b 的微波、高带宽频率。如果是这样,您就会知道,在晴朗的天气里,您或许可以获得大约 10 英里左右的视线连接。这肯定不适用于我们需要在非洲农村地区覆盖的广阔距离和荒野地形。

高频无线电是另一种动物。它的较长波长在景观中传播,从电离层反射,以跟随地球的曲率。这使得高频信号的范围达到数百英里。从科纳克里到恩泽雷科雷——IRC 几内亚最远的外地办事处——高频无线电可以轻松覆盖超过 375 英里(600 公里)的直线距离。当然,有时连接这两个点的道路要长得多——对于那些不幸的人来说,这是一场令人肠胃翻滚、脊椎剧烈震动的为期两天的折磨。

因此,高频无线电的巨大优势在于它可以传播很远的距离,轻松地跃过路径上的障碍。现在来说坏消息:在高频无线电的无线游戏中,范围获胜,但在数据容量方面却一败涂地。如果 802.11b 被认为是宽带,那么可以将高频无线电视为几乎没有带宽。我们在这里使用的无线电调制解调器的规格是令人厌食的 2400 波特!

等等,情况更糟。双向无线电是经典的半双工通信介质;也就是说,您要么正在传输(按下通话键),要么正在接收,而不是同时进行。再加上调制解调器硬件本身实施的强大的错误检查协议,意味着实际链路体验更像是 300 波特。有人还记得 300 波特吗?除非您用放射性碳测量您的耐心,否则您远程登录会话的梦想将会破灭和粉碎。至于在线浏览、聊天、视频会议等,最好甚至不要考虑。

然而,对于经典的存储转发应用程序(如基于文本的电子邮件),高频无线电的带宽限制是可行的。我们只需要密切关注我们的配置并尽可能地进行优化。对于高频无线电,每个数据包都非常宝贵。

无线电网络拓扑

鉴于高频无线电的这些功能和限制,我们项目的设计策略是在外地办事处之间使用无线电调制解调器,拓扑结构如图 1 的参考网络所示。在科纳克里,我们在主机 coyah 上有一个全时互联网网关。主机 congo 上的无线电调制解调器充当每个外地办事处的拨入中心。我们在外地办事处和科纳克里之间建立定期的 PPP 链路,并在 TCP/IP 上使用我们精心选择的客户端-服务器协议。虽然我们可能已经使用 UUCP 为外地办事处实施了电子邮件,但我们的 TCP/IP 系统更易于配置,并且可以与现有网络和电子邮件系统集成。此设置也很容易转换为使用更快的电信链路,例如通过陆线或卫星。如果外地办事处可以获得这些链路(并且预算可以支持它们),IRC 网络就可以简单地插入。

Radio E-mail in West Africa: The Complete Version

图 1. 无线电网络拓扑

但是,就目前而言,我们没有奢侈到可以将无线电专用于全时数据通信连接。事实上,语音通信仍然是无线电设备的核心用途,为外地办事处和移动单位人员的安全和保障提供了重要的生命线。我们的实施和程序必须补充这条生命线,而不是损害它。由于无线电上的数据会话会阻止链路两端的语音呼叫,因此我们制定了策略和配置,将每次会话的连接时间限制在 15 分钟以内。否则,我们将保持无线电空闲以进行语音联系。在外地,无线电操作员有程序协议,用于在一天中的固定时间定期与科纳克里进行拨号连接,以进行电子邮件交换。为这些传输建立了时间表,但无线电操作员仍然保持调整时间表和中断会话的自由度,以适应紧急语音通信。由于这些原因,所有拨号都必须在无线电操作员的控制下进行,而不是像我们在其他连接更好的情况下那样,通过 cron 作业或 diald 进行设置。

本项目中使用的设备由澳大利亚双向无线电硬件制造商 Codan 制造。虽然还有其他制造商——包括摩托罗拉、建伍和八重洲——但在世界这一地区,Codan 似乎是国际援助组织的首选无线电。无论外籍人士聚集在哪里,您都会看到他们的大型白色陆地巡洋舰,上面有官方标记,并且每个前保险杠上都显眼地螺栓固定着粗壮的 Codan 鞭状天线。虽然这些粗壮的黑色鞭状天线非常坚固耐用且实用,但它们的象征性权威价值——例如在穿越许多可能令人生畏的军事检查站时——无疑是它们最主要的功能。

Codan 调制解调器技巧和陷阱

本项目中使用的调制解调器是 9002 型号。(信不信由你,Codan 还制造了一款 2400 波特的传真调制解调器,型号为 9001。我们在当地市场上以 500 美元的价格找到了一台二手的。)这些调制解调器配备了基本的类似 Hayes 的 AT 命令集,因此它们易于配置、操作和故障排除,可以使用任何适用于 Linux 的电信应用程序,例如 Minicom 或 Kermit。

但是,此调制解调器与您可能已连接到电话线的 Sportster 调制解调器之间存在一些显着差异。首先,Codan 单元实际上是作为 DTE(数据终端设备)而不是 DCE(数据通信设备)构建的。要将其连接到您的串行端口,您需要一根特殊的 DB-9 空调制解调器电缆,其接线方式与 David Lawler 的“Text-Terminal-HOWTO”中 diagrammed 的完全相同。由于并非所有描述为空调制解调器的电缆都以相同方式接线,因此此细节至关重要。此外,AT 命令不像您在标准 USR 型号上期望找到的那样广泛,并且略有不同。当然,此调制解调器移动数据的速度比您可能想象的要慢得多。令人想起冷藏后著名的番茄酱滴落的速度。

配置 mgetty 和 PPP

回到网络设置,科纳克里无线电主机 congo(别名为 radiohub)配置为 PPP 服务器,准备接受来自外地办事处的无线电拨入连接。与传统的电话拨入配置一样,我们使用 mgetty 监视串行线路,初始化调制解调器,等待传入呼叫,应答 RING 并启动 PPP 守护程序。

9002 的工作方式与 mgetty 期望的非常相似,示例 mgetty.config 文件(清单 1)显示了如何操作。清单中的注释描述了关键设置。此文件中最重要的行是 init-chat 参数给出的调制解调器初始化字符串。在这里,我们首先使用出厂默认设置 (AT&F) 将调制解调器设置为已知状态,然后进行防御性冗余:关闭所有命令、本地和远程回显 (E0 L0 R0);忽略载波 (X0);使用硬件流控制 (&K3);关闭自动应答 (S0=0 &A=0);并重置站地址 (&I=nnnn,其中 nnnn 类似于电话号码,是其他无线电呼叫以到达此特定站点的唯一标识符。)

清单 1. mgetty.config

在 mgetty 应答 RING 并从另一端获得 CONNECT 返回后,会发生什么?这由 mgetty 的 login.conf 文件(清单 2)控制。在拨入系统中,通常让 mgetty 查找传入的 PPP 数据包,然后自动启动 PPP 守护程序,通常在链路协商过程中使用 CHAP 进行身份验证。以魔术字符串 /AutoPPP/ 开头的行处理了此类配置。

清单 2. login.conf

但是,根据我们的经验,无线电链路的高延迟使得 /AutoPPP/ 配置启动缓慢。因此,我们接下来要做的会令人震惊:我们完全放弃传统的身份验证!在我们的配置中,传入连接的聊天脚本提供的登录名用于直接启动 PPP 守护程序。当 mgetty 将登录名与 login.conf 文件的第一字段中的条目(例如 Pklogin)匹配时,它会运行第四字段中指定的程序,例如 /usr/local/sbin/pppd.login.kenya。从本质上讲,远程系统使用的登录名用于控制访问。请注意,Pklogin 作为系统帐户是伪造的,您可以确信我没有告诉您我们真正使用的字符串!(另请注意,即使在建立连接之前,我们也有一个隐式的真人身份验证系统,当操作员通过语音同意锁定在特定频道上,然后再启动链路时。)

当 mgetty 获取 login.conf 文件中列出的登录名时,它会将控制权传递给相应的启动脚本,例如 pppd.login.kenya(清单 3)。这反过来又启动 PPP 守护程序,并为特定的远程主机使用选项文件,例如 options.kenya(清单 4)。

清单 3. pppd.login.kenya

清单 4. options.kenya

在这里,您可能希望避免痛苦的汗水、眼泪和其他情感分泌物,并注意 lcp-restart 和 ipcp-restart 选项。这些参数给出了 pppd 在再次尝试之前等待接收对 PPP 协商特定阶段的回复的时间(以秒为单位)。这些参数的默认值为 3 秒,这通常在使用常规电信时绰绰有余,并且可能这就是您之前从未遇到过这些选项的原因。

但是,在无线电上,如果这些重启默认值未延长,您只会给自己带来一个无用的咆哮毛球。以下是发生的情况。当 pppd 启动时,每个对等方都开始与另一个对等方进行协商过程,以就连接的所有参数达成一致。在这些初步讨论期间,当链路的一端在其重启间隔内没有收到另一端的回复时,pppd 会重复传输。但是,与此同时,远程端收到原始传输并发送回其回复。本地端收到对其第一次传输的回复,认为它对其第二次传输有适当的回复,因此继续进行下一步协商。但是,本地服务器随后收到了对其第二次传输的意外回复,并且协商在未解决的混乱中崩溃。

通过延长 lcp-restart 和 ipcp-restart 参数,您可以延迟发送重复传输,以便两端的对等方有足够的时间接收回复。几乎在所有情况下,远程端都会接收并回复每个原始阶段协商请求,但往返时间可能需要几秒钟。在这里,我们配置了慷慨的 16 秒延迟,并且再也没有遇到任何问题。

将我们的注意力转移到内陆,外地的每个远程主机都配置为拨号连接科纳克里的无线电服务器,使用与清单 5-8 中所示的基西杜古的肯尼亚主机相对应的 PPP 配置。这些反映了服务器的关键配置问题,例如关键的调制解调器初始化字符串(清单 8)和 pppd 的基本选项(清单 6)。

清单 5. ppp.start

清单 6. options.codan

清单 7. call.congo

清单 8. dial.congo

在我们所有的测试、失败和旅行折磨之后,当我们最终通过无线电波在几内亚大气层中无形地传播时,我们第一次建立链路,这是一个快乐而令人惊奇的日子。从肯尼亚,我们实际上与刚果建立了 ssh 连接,只是为了与科纳克里的无线电操作员进行交谈会话,他们正在观看他们的终端屏幕:“来自基西的问候!”

随着配置细节最终得到解决,我们发现 PPP 链路虽然速度很慢,但可以可靠地建立,并且在一天中的任何时间都保持稳定,即使在其他方面听起来模糊不清的频道上也是如此。当然,所有无线电和天线都应调整到最佳性能。但是,一旦您建立链路,就会令人欣慰地发现无线电调制解调器完全有能力维护它,即使在条件不理想的情况下也是如此。因为不知何故,条件总是有办法变得不理想。

灌木丛中的 qmail

在西非,似乎几乎所有东西都只是用弯曲的钉子和唾液勉强地挂在一起。虽然这证明了几内亚人在面对稀缺时的足智多谋和聪明才智,但这确实使硬件和网络的环境变得恶劣。我发现电源线被砍断并用透明胶带拼接在一起,主板用扎带和纸板楔子固定到位。这里永远炎热、多尘、多虫且潮湿。发电机熄火,插头被踢掉,雷击,没有任何东西接地。简而言之,我们在尝试可靠地实施高科技时面临着最恶劣的环境。

仅出于这些原因,我们可能会使用 Dan Bernstein 出色的、非常可靠的 qmail 工具来移动邮件。qmail 在设计时特别注意可靠性,确保消息在处理的每个阶段都安全地写入磁盘。如果消息由 qmail 处理——尤其是在交付到 Maildir(Bernstein 开发的特殊邮箱目录格式)时——您可以确信该消息已得到妥善且真正地交付。否则,邮件始终安全地排队在磁盘上,以便稍后交付。此功能对于我们在非洲环境中遇到的频繁断电和网络中断至关重要。

除了 qmail 的核心可靠性之外,Bernstein 还开发了许多专门用途的工具和应用程序,非常适合无线电电子邮件项目。在这些工具中,最重要的是 qmail 包括一个 QMTP 服务器,实施 Bernstein 自己的快速邮件传输协议。QMTP 可以从 serialmail 软件包访问,这是一个补充程序套件,由 Bernstein 专门为在慢速拨号连接上移动邮件而设计。我们的连接当然可以被认为是慢速连接!通过使用 qmail、QMTP 和 serialmail——控制我们自己网络内的整个电子邮件传递链——我们拥有尽可能高效且可靠地通过高频无线电移动邮件的最佳解决方案。

如图 1 的参考网络所示,qmail 在不少于五个主机上运行:中央邮件服务器 coyah、无线电中心服务器 congo 和三个外地办事处主机中的每一个。这是大量的 qmail!事实上,我们的生产网络在单独的网关/防火墙系统上添加了第六个 qmail 安装。这配置了所谓的迷你 qmail 系统,使用 Bernstein 的快速邮件排队协议 (QMQP) 通过防火墙将传入邮件直接排队到邮件中心主机 coyah。表 1 显示了安装在这些不同系统中的每个系统上的 qmail 组件。

qmail 组件

 

网关/防火墙

邮件中心

无线电中心

外地主机

qmail-smtpd

Y

Y

Y

Y

qmail-qmqpc

Y

   

qmail-qmqpd

 

Y

  

qmail-qmtpd

  

Y

Y

qmail-pop3d

 

Y

 

Y

fastforward

 

Y

 

Y

serialmail

  

Y

Y

daemontools

Y

Y

Y

Y

ucspi-tcpi

Y

Y

Y

Y

djbdns

Y

Y

 

Y

qturn

  

Y

 

安装和配置如此多的 qmail 服务器后,您会非常熟悉 qmail 的所有方面;它是一个功能强大且灵活的系统。请参阅“资源”以获取一些指导,并准备花一些时间研究“The Big Qmail Picture”、Bernstein 的 FAQ 文档和 PIC 文件。所有安装都严格按照 Dave Sill 的“Life with qmail”说明进行,这是设置生产 qmail 系统的不可或缺的指南。以下讨论假设您熟悉 qmail 及其方式:其控制文件、特殊用户别名 qmail 虚拟域机制、点 qmail 传递指令和 Maildir 邮箱传递。

前往基西

对于本文中给出的电子邮件示例,我们将使用不存在的 refugee.ngo 域来表示 IRC-Guinea 的实际域 irc.org.gn。IRC-Guinea 网络上的每个用户,无论是在科纳克里还是在外地办事处,都被分配了一个 firstname.lastname@refugee.ngo 形式的电子邮件地址。发送到 refugee.ngo 域的所有邮件都由邮件中心主机处理,并根据需要从那里路由。发件人无需了解用户的特定分配位置,也无需使用任何特殊形式的寻址。

为了说明如何使用 qmail 完成此操作,让我们首先考虑一条到达(或源自)科纳克里的消息,该消息发送给 rhonda.rabbit@refugee.ngo,该用户恰好被派往基西杜古的外地办事处。关键处理步骤如图 2 所示,并在下面更详细地描述。

Radio E-mail in West Africa: The Complete Version

图 2. 发往基西杜古的无线电电子邮件

在邮件中心服务器 coyah 上,qmail 在其 locals 控制文件中找到域 refugee.ngo,并尝试在本地传递消息,即将消息传递到主机 coyah 上的用户帐户。首先,它在系统 /etc/passwd 数据库中检查名为 rhonda.rabbit 的用户。当 qmail 未能在那里找到用户时,它会将消息交给特殊别名用户,并根据 /var/qmail/alias/.qmail-default 中的指令进行处理。在这里,我们安装了 fastforward 命令,指示在从文件 /etc/aliases 构建的中央数据库中进行查找。现在找到了 rhonda.rabbit 的条目,电子邮件消息将返回到 qmail,并带有新的信封地址 rhonda.rabbit@kissidougou.refugee.ngo。

仍然在 coyah 上,qmail 现在没有在其 locals 或 virtualdomains 控制文件中找到 kissidougou.refugee.ngo,因此它将消息排队以进行远程传递。但在 qmail 尝试通过名称服务器查找找到 kissidougou.refugee.ngo 域的 MX 记录(该记录不存在)之前,它会在 smtproutes 控制文件中进行检查并找到匹配项。通过这种方式,所有发往 kissidougou.refugee.ngo 以及所有其他远程办事处的邮件都直接中继到无线电中心主机。(smtproutes 机制帮助我们避免在本地名称服务器中设置和委派多个子域和 MX 记录的复杂性。)

当消息到达无线电中心 congo 时,qmail 不会在 locals 控制文件中找到域 kissidougou.refugee.ngo。事实上,无线电中心可能配置为没有 locals 控制文件。相反,qmail 在其 virtualdomains 控制文件中找到了匹配项。文件 kissidougou.refugee.ngo:qturn-kissidougou 中的匹配条目指示 qmail 转发发送到虚拟域 kissidougou.refugee.ngo 的所有消息,并在原始信封地址前添加字符串 qturn-kissidougou-。那么,在我们的示例消息的情况下,地址现在被重写为 qturn-kissidougou-rhonda.rabbit@kissidougou.refugee.ngo 并本地传递给用户 qturn。

qturn 是我们在无线电中心 congo 上设置的一个特殊用户帐户,其主目录为 /var/qmail/qturn,用于接收所有通过高频无线电调制解调器传递到远程办事处的邮件。根据 qmail 的点 qmail 约定,qmail 会在 qturn 的主目录中查找 /var/qmail/qturn/.qmail-kissidougou 中的本地传递指令。我们在这里的指令告诉 qmail 将邮件传递到 Maildir 邮箱 ./kissidougou/.QMAIL.PPP/。(同样,对于发送到达博拉的消息,例如,点 qmail 文件 ~/.qmail-dabola 将指示传递到 Maildir 邮箱 ./dabola/.QMAIL.PPP/。)

qmail 现在认为消息已传递。它已退出 qmail 排队机制,并且不再进行自主传递或转发尝试。

相反,我们等待与基西杜古的远程主机肯尼亚的下一个 PPP 连接。然后,我们可以使用 serialmail 软件包,使用 QMTP 将收集在 /var/qmail/qturn/kissidougou/.QMAIL.PPP/ 邮箱中的所有邮件——相对而言——通过链路发送出去。通过链路发送收集的邮件的命令序列是

  # cd /var/qmail/qturn/kissidougou
  # maildirqmtp  .QMAIL.PPP  qturn-kissidougou-  10.0.10.243

maildirqmtp /var/qmail/qturn/kissidougou/.QMAIL.PPP/ qturn-kissidougou- 10.37.0.3

maildirqmtp 的第一个参数是要传输的邮件的 Maildir 目录的路径。第三个参数是目标 qmail-qmtpd 服务器的 IP 地址,在本例中是我们分配给基西端 PPP 连接的静态 IP 地址。

第二个参数的目的可能不太明显。它提供了应从每条消息的信封地址中删除的前置字符串。回想一下,示例消息地址的本地部分已重写为 qturn-kissidougou-rhonda.rabbit。当 maildirqmtp 发送此消息时,前置的 qturn-kissidougou- 将被剥离,并且信封地址再次写为 rhonda.rabbit@kissidougou.refugee.ngo。

然后,该消息飞过几内亚,在高频以太的蛛丝般细流中在非洲天空翱翔,经过漫长而壮观的旅程后,轻轻地降落在基西无线电天线上。在这里,肯尼亚的 qmail 系统现在可以完成其传递。

同样,qmail 首先检查其 locals 控制文件,并确实在条目中找到了 kissidougou.refugee.ngo,因为这里是我们想要本地传递消息的地方。虽然肯尼亚的 /etc/passwd 文件中没有名为 rhonda.rabbit 的用户,但 /etc/aliases 中的 fastforward 查找确实找到了匹配项,并将消息的传递设置为用户帐户 rrabbit。/home/rrabbit/.qmail 中的点 qmail 传递指令——与所有设置为接收 POP3 电子邮件的用户一样——配置为将邮件传递到用户主目录中名为 .QMAIL.POP/ 的 Maildir 邮箱。

巧合的是,我们已将 qmail 的 POP3 守护程序配置为从用户主目录中名为 .QMAIL.POP 的 Maildir 传递邮件。兔子女士的笔记本电脑连接到基西杜古的本地网络,急切地等待着来自外界的消息,现在终于听到了邮件到达的喜悦铃声,“您有新邮件”。无线电电子邮件工作了:他们笑了,他们哭了,他们跳舞了。

从基西发出

Radio E-mail in West Africa: The Complete Version

不久之后,基西杜古的用户将希望尝试向其他人发送自己的消息。如果您已经了解了 qmail 的全部内容,那么您可能已经有一些想法,可以如何将邮件从外地发送回互联网上的任何地址。但是,事实证明,从基西杜古向基西杜古以外的其他 refugee.ngo 用户(无论是在科纳克里还是在另一个外地办事处)发送电子邮件时,有两个棘手的部分。图 3 考虑了从基西杜古向科纳克里的用户发送消息的情况,该消息发送给 lois.lion@refugee.ngo。

图 3. 来自基西杜古的无线电电子邮件

在基西杜古和科纳克里,我们都希望保持使用 firstname.lastname@refugee.ngo 向用户发送邮件的约定,无论收件人的实际分配地点在哪里。这意味着 refugee.ngo 也必须列在肯尼亚的 locals 控制文件中,以便 qmail 将接受和传递源自基西本地网络并发送给在那里发布的收件人的邮件。这避免了不必要的往返科纳克里邮件中心的延迟和额外流量。

那么,问题是如何转发发送给 refugee.ngo 用户但未在本地找到的邮件。解决方案的第一部分是通过使用 -p 开关在直通模式下设置 fastforward。使用此选项,如果在肯尼亚的 /etc/aliases 数据库中找不到用户,则 fastforward 退出 0,从而允许 alias .qmail-default 文件中的进一步指令处理该消息。

这使我们来到了解决方案的第二部分。如图所示,此文件中的第二行

使用 qmail 的 forward 实用程序来发送任何发往 refugee.ngo 地址但本地未找到的邮件,将地址的域名部分重写为 mailhub.refugee.ngo。在我们的示例中,信封地址被重写为 lois.lion@mailhub.refugee.ngo,并返回 qmail 进行进一步处理。

qmail 再次检查 locals 控制文件,这次没有找到 mailhub.refugee.ngo 的条目。但现在 virtualdomains 控制文件中有一个匹配的条目。这个特殊的条目,第一个字段为空,是 qmail 通配符表达式的一种形式,其作用是将任何域都视为虚拟域。在本例中,条目

:qrelay-ppp

告诉 qmail 将任何域的所有消息转发给用户 qrelay,并在原始地址前加上字符串 qrelay-ppp-。现在我们的出站消息将被寻址到 qrelay-ppp-lois.lion@mailhub.refugee.ngo。(任何其他发往互联网的地址也会被同样重写,例如 qrelay-ppp-guinix@yahoo.com。)

类似于 radiohub congo 上的用户 qturn,qrelay 是我们在所有外地主机(如肯尼亚)上设置的特殊用户帐户,用于接收所有通过 HF 无线电调制解调器进行出站传输的邮件。qrelay 用户的主目录为 /var/qmail/qrelay,其 ~/.qmail-ppp 中的 dot-qmail 指令告诉 qmail 将邮件传递到 Maildir 邮箱 ./.QMAIL.PPP/。在此,所有出站邮件的消息都将收集到一起,直到我们下一次通过无线电建立 PPP 连接。然后我们将再次使用 QMTP 和 serialmail,但这次方向相反。

当连接建立后,将收集到的邮件批次发送到科纳克里的 radiohub 的命令序列是

  # cd /var/qmail/qrelay
  # maildirqmtp  .QMAIL.PPP  qrelay-ppp-  10.0.10.241

与前面的示例一样,maildirqmtp 的第一个参数是包含所有出站邮件的 Maildir 目录的路径。第三个参数是分配给 PPP 连接的 radiohub 端的 IP 地址。第二个参数是要从每个信封地址中删除的前缀字符串。现在,当 maildirqmtp 发送示例消息时,它将被恢复为 lois.lion@mailhub.refugee.ngo。(任何发送给 guinix 的电子邮件都将被恢复为 guinix@yahoo.com。)

消息从 Kissi 无线跳跃而出,追随着彩虹和炎热的哈麦丹风,优雅地穿越地球地形的荒野和危险,安全抵达科纳克里的 radiohub congo。在这里它不会停留。当 qmail 在 locals 控制文件中找不到任何匹配的条目时,它会立即将消息排队以进行远程传递。smtproutes 控制文件中的条目具有通配符效果,将发往任何域的消息中继回 mailhub 服务器。此配置有目的地将 radiohub 主机隔离为仅用于 HF 链路的服务器,而将 mailhub 主机用于所有其他电子邮件服务和管理。

当 qmail 在 coyah 上接收到消息时,它现在在 locals 控制文件中找到了 mailhub.refugee.ngo 的条目,并启动本地传递。按照现在应该很熟悉的顺序,fastforward 在 /etc/aliases 数据库中匹配 lois.lion,并将消息传递给 llion 用户帐户进行传递。然后,消息被传递到 llion 的 POP3 邮箱,即名为 ./.QMAIL.POP/ 的 Maildir。狮子女士渴望收到来自外地兔子女士的消息,她扑向鼠标——看,消息就直接送达她的桌面。

如果 lois.lion 被重新分配到 Nzerekore 的外地办事处怎么办?管理员将在 mailhub 的 /etc/aliases 文件中进行更改,并运行 newaliases 命令的 fastforward 版本来更新 fastforward 数据库。现在,qmail 将把发往 lois.lane 的消息转向,以便通过 HF 无线电传递到 lois.lane@nzerekore.refugee.ngo,就像 rhonda.rabbit 示例中那样。这样,科纳克里就充当所有电子邮件流量的中心枢纽,外地办事处永远不需要彼此直接建立连接。

操作员界面和 qturn

外地每个无线电电子邮件服务器都在无头模式下运行,通过操作员桌面 PC 的 Telnet 会话,从简单的命令行界面进行控制。基本界面由四个命令组成,通常按以下顺序运行

  ppp.start
  mail.get
  mail.send
  ppp.stop

简单的 shell 脚本执行各自的任务,每个脚本都为操作员提供关于当时正在发生的事情的少量反馈。这些功能可以进一步收集到一个命令中,例如 mail.run,但我们希望使操作员能够根据语音通信的需求,对无线电访问保持一定的自主权。例如,如果获取邮件花费了 15 分钟或更长时间,操作员可能会停止会话,重新建立语音通信进行安全检查,然后在几分钟后启动一个单独的会话来发送出站邮件。

命令界面表明我们不尝试同时获取和发送邮件。相反,我们先做一个,然后再做另一个。这是对 HF 无线电链路的低速、半双工带宽的另一种妥协。就网络流量而言,此链路就像一条单车道的乡间小路。稍多一点流量就会形成一个又长又窄的停车场。

应该很容易弄清楚 mail.send 脚本是围绕第二个示例中描述的 maildirqmtp 命令的简单包装器。可能不太明显的是我们如何获取邮件。也就是说,外地操作员如何在科纳克里的 radiohub 服务器上运行 maildirqmtp 命令?

与大多数 UNIX 事物一样,方法不止一种 (TMTOWTDI)。例如,您可以选择设置 ssh 以远程执行示例中显示的 maildirqmtp 命令。或者,您可以直接在 radiohub 上设置 POP3 服务器,并通过链路使用 fetchmail(使用 —qvirtual 选项来剥离添加到每个信封地址的前缀),尽管这样您将失去 QMTP 的优势。

对于无线电电子邮件项目,我们决定利用 Dan Bernstein 的 daemontools 和 ucspi-tcpi 软件包,这些软件包已作为我们标准的 Life with qmail 安装的一部分安装。这些软件包中的工具使设置专用服务器变得异常容易。我们的服务器称为 qturn,它以 Bernstein 的 AutoTURN 注释为模型,这些注释在他的 serialmail 软件包的文档中进行了描述。通过 qturn,我们保留了 QMTP 的显著效率,同时避免了建立和验证 ssh 连接所涉及的耗时开销。

在 radiohub 上运行的 qturn 服务器的组件在列表 9-11 中提供。原理很简单。qturn run 脚本(列表 9)设置为 daemontools 服务,监听您选择的特定端口(此处我们使用 55210)。每当建立到该端口的连接时,就会执行 qturnd.sh 脚本(列表 11)。此脚本读取 tcpserver 调用传递给它的 $TCPREMOTE 环境变量,并获取我们分配给传入连接的静态 IP 地址。然后,该脚本将此 IP 地址与用于该外地办事处的 Maildir 目录匹配。然后运行 maildirqmtp 命令,将 Maildir 中收集的邮件发送到远程主机上的 QMTP 服务器,同时将状态输出定向到客户端进程可以读取的文件句柄。

Listing 9. qturn.run

Listing 10. qturn_log.run

Listing 11. qturnd.sh

现在,客户端上的 mail.get 脚本很简单,如列表 12 所示。它调用 tcpclient 连接到使用 tcpserver 在 radiohub 上创建的 qturn 服务器,并将从该进程返回的流重定向到标准输出。就是这样!客户端/服务器编程再简单不过了。

Listing 12. mail.get

非洲算法

正如我们可能已经提到的,HF 无线电链路速度有点慢。然而,尽管如此,我们仍然设法通过它传输了相当数量的邮件。平均每天,超过 300 条消息通过无线电波在科纳克里和外地办事处之间传输,每个办事处通过两到三个简短的连接。正如所有互联网技术的典型情况一样,每一种尝试都会刺激更大的胃口。

鉴于无线电电子邮件固有的局限性,我们尝试保持尽可能开放的使用政策。例如,员工可以自由地使用无线电电子邮件与世界任何地方的朋友和家人进行个人通信,并且任何用户可以发送的消息数量没有限制。我们唯一明确的政策限制是要求用户不要订阅邮件列表。

为了防止无线电链路因巨大的附件(例如大型文档和图形文件)而长时间拥塞,所有连接到无线电的 qmail 服务器(即科纳克里的 radiohub 和每个外地办事处服务器)都运行消息大小限制为 8,000 个字符。这足以容纳三到四页文本,并通过 qmail 的 databytes 控制文件进行配置。我们建议用户注意此消息大小限制,建议他们在通信中坚持使用纯文本,并相应地配置他们的邮件客户端软件。但是,通过附件和文件压缩可以挤入 8,000 字节限制的任何内容都可以自由发送。(科纳克里的用户拥有全职、宽带互联网网关,受到的限制没有那么严格。在这里,databytes 控制文件设置为 1 兆字节。)

正如人们对我们选择的软件所期望的那样,该系统已被证明非常可靠。尽管科纳克里经常发生间歇性停电,但我们确实尝试通过使用发电机和电池备用电源来保持 mailhub 服务器 coyah 始终运行。到目前为止,这些措施使这台机器自首次安装以来一直完美运行,截至撰写本文时,已连续运行超过三个月,没有重启。

然而,如果该系统不能长期可持续,那么这种可靠性将毫无意义。在我们于外地安装第一个无线电服务器的两个月前,我们在感兴趣且有能力的 IRC 员工中组建了一个网络用户/UNIX 小组。该小组定期且热情地开会,学习 Linux/UNIX 并培养网络管理技能。UNIX 是一个语言丰富的操作环境,我认为它在非洲人中找到了天然的亲和力,他们的语言能力似乎天生就很出色。无论如何,该小组现在有许多功能正常的生产系统可供工作和娱乐,主要使用回收的硬件。虽然本文重点介绍了 qmail 和串行通信,但为此项目安装的 Linux 服务器还托管了一系列典型的其他服务器和服务,包括 DHCP、DNS、natd、Apache、FTP、Samba 和 PostgreSQL。IRC-NU/UG 提供了一个人际网络,该网络将在未来几年继续维持和发展技术网络。

该项目的成功经验很容易在世界任何地方复制。学校、政府部门和其他非政府组织可以轻松地通过 HF 无线电构建远程网络解决方案,在其他方式无法访问的地方提供访问,并且成本极低。一旦安装,这些系统几乎不需要管理,并且可以快速适应替代的 TCP/IP 运营商。电子邮件系统本身的维护仅涉及用户帐户的例行添加/删除,同时保持 /etc/aliases 文件处于最新状态。

我们自己的无线电电子邮件项目的当前成果是,我们现在为几内亚各地四个办事处的 50 多台桌面设备和 150 名员工提供邮件服务。整个广域网都在单个公共 IP 地址后面提供服务,每月 ISP 总成本为 150 美元(美元)。无线电电子邮件项目主要基于现有硬件,跨越了界限,为其用户开启了以前不可能实现的对话。

最重要的是,该系统在整个组织和整个几内亚部署了标准网络和互联网技术,利用了免费提供的、一流的、无国界的开源技术,这些技术是所有全球连接的基础。这不仅在尚无互联网的地方建立了基层网络基础设施,而且有助于建设非洲互联未来所必需的核心能力。

资源

Dan Bernstein 的 qmail 和工具

Dave Sill 的 “Life with qmail”

Andre Opperman 的 “The Big Qmail Picture”

Bushmail 是一家位于南非的商业供应商,为撒哈拉以南非洲的许多地区提供公开访问的无线电电子邮件网络。

Mission Aviation Fellowship 提供了有关 HF 无线电调制解调器使用的更多信息,特别是面向 E-Smith Linux 发行版的使用。

Codan

国际救援委员会

Wayne Marshall 是一位 UNIX 程序员和技术顾问,居住在几内亚,他从未打算成为一名电子邮件管理员。他和他的妻子 Paula 喜欢旅行和非洲的天空。

电子邮件: guinix@yahoo.com

加载 Disqus 评论