使用 Linux 和 Intranet 构建 ISP

作者:Eric Harlow

我意外地成为了马里兰州巴尔的摩地区一家小型 ISP 的创始人。我和我的妻子一直难以找到一家廉价且可靠的互联网接入提供商。在无休止地遇到忙音后,我们决定租用一条专用的 28.8 线路,并将其用作我们连接互联网的通道。这样连接将始终畅通可用,我们两人都可以用它来浏览互联网。下一步自然而然地就是向其他人提供接入服务。除了帮助人们接入互联网并让我获得 Linux 技术经验之外,它还可以为我们提供收入来源,以弥补部分成本。但是,在您决定成为 ISP 并赚大钱之前,我应该警告您,竞争非常激烈,我们尚未盈利。

我们拥有的互联网服务器设置很简单:一台 Linux 机器,带有四条用于拨号的接入线路和一条用于维护专用连接的输出线路。我们目前在该机器上支持大约 20 个用户。虽然很简单,但这种设置可能会出现问题:如果四个用户拨入,则每个用户将获得 (28.8/4) = 7.2Kbps 的连接速度。但是,大多数时候,只有一位用户登录到我们的机器,他将获得全部带宽。此外,当多个用户登录时,一个可能正在下载或撰写电子邮件,另一个可能正在阅读网页,第三个可能走到洗手间了。

构建 Linux 互联网服务器您需要采取的首要步骤之一是重新编译内核,启用网络功能、IP 转发/网关功能以及选择任何其他驱动程序。我们的 Linux 机器上有一块网卡和一块 Cyclades Cyclom 16YeP 卡(一块多端口串行卡),因此我们启用了这些选项。当您启用 IP 转发/网关功能时,它使 Linux 机器能够将通过您的网络收到的数据包转发到互联网。

设置期间的另一个重要步骤是从您的 ISP 那里获得一个支持点对点协议 (PPP) 的帐户。您可以每月花费约 100 美元获得一条专用的 28.8 连接,这将为您提供对互联网的完全访问权限,供您的网络使用。最好您还注册一个静态 IP 地址或一个 C 类地址和一个域名。静态 IP 地址允许您始终使用相同的 IP 地址登录互联网。我们有一个 C 类地址,因此本讨论仅使用 C 类地址。C 类地址为您提供一个地址块 (255),您可以使用它来设置您的内部网络 (Intranet)。如果您没有 C 类地址,而是静态 IP 地址,则必须使用 IP 伪装才能从您的 LAN 访问互联网。[请参阅 Chris Kostick 在 1996 年 7 月号的 Linux Journal 中发表的“使用 Linux 进行 IP 伪装”—编者注。]

我们开始构建我们的互联网服务器,首先致电我们的 ISP 并注册了一个带有域名和专用 28.8 线路的 C 类地址。在我们收到我们的 C 类地址块 (206.156.217.*) 后,我为我们的主机 (206.156.217.10) 选择了一个地址,并继续使用 Linux 捆绑的 netconfig 实用程序设置我们的网络。

您的 ISP 应该能够维护您机器的域名服务器 (DNS) 条目。DNS 条目允许互联网冲浪者使用您的域名访问您的 IP 地址。像我们的 (206.156.217.10) 这样的 IP 地址很难记住且没有描述性;DNS 条目允许冲浪者和客户使用 NetBrain.com 访问我们的机器,而无需知道 IP 地址。

在 resolv.conf 文件中,应该列出您将要访问的域名服务器。该文件应如下所示

#resolv.conf
Nameserver 206.156.208.2
nameserver 206.156.208.8
设置 PPP

使用 ppp-on 脚本(pppd 包的一部分),您可以建立您希望如何设置 PPP 连接。ppp-on 脚本如列表 1所示。您可以使用此列表设置参数,例如您的机器和主机机器的 IP 地址、您是在调制解调器上还是通过网络运行 pppd 以及您用于建立连接的设备。ppp-on 脚本调用 ppp-on-dialer 脚本,该脚本实际上拨打调制解调器以连接到您的 ISP。ppp-on-dialer 使用 chat,它拨打调制解调器并处理通过 ISP 的启动屏幕(用户名、密码)。(将 0.0.0.0 作为远程参数传递是另一种说法“我们不在乎”。)ppp-on 脚本中的重要参数包括

  • 115200—串行端口速度—这并不意味着您的调制解调器有那么快,但通过一些压缩,它可能会接近。

  • /dev/ttyC2—您的调制解调器端口默认路由—指定此连接是机器的默认路由,如果它无法在本地找到地址。

列表 2. ppp-on-dialer 脚本

请注意,chat 有 ogin my_loginassword: my_password 行。这是 chat 的说法,“如果您看到 ogin:,则键入 my_login;然后当您看到 assword 时,键入 my_password。”您必须手动拨入您的 ISP,使用终端程序查看此登录屏幕的外观。

如果您键入 ppp-on 并听到调制解调器拨号并连接,那么您已经迈出了运行互联网服务器的第一步。当 PPP 运行时,您应该能够从 Linux shell ping 您的 ISP 的一台机器。一个很好的 ping 地址是您的 ISP 的 DNS 机器。

如果 ping 成功,请尝试查看 TELNET 是否工作。一个简单的检查是 telnet 到其中一个 MOO 站点 (telnet baymoo.org 8888)。如果这有效,则您已连接并且正在正确路由。如果您在另一台机器上有一个帐户,您也可以通过 TELNET 测试传入连接。这更多是为了确保您的 ISP 具有正确的 DNS 条目。如果您收到 Unknown host 错误,则要么您的 ISP 没有输入条目,要么它尚未传输出去—有时需要几天才能传播到所有其他机器。

将其他机器连接到您的服务器

一旦您与互联网的连接稳定,就该连接您的网络了。您的 Linux 机器和您的其他机器都应该安装了网卡,并且您的 Linux 机器应该编译了内核并带有适当的驱动程序。

假设您要设置 Doofus(一个 Windows 95 客户端)并将其连接到您的网络,以便它能够访问互联网。为 Doofus 选择 IP 地址 206.156.217.7(它可以是您的 C 类块中任何可用的数字)。要设置 Windows 95 机器以访问您的 Linux 服务器,您必须进入控制面板并选择网络。确保 TCP/IP 已绑定到您的网卡。属性按钮允许您在您的每台机器上设置以下项目

  • IP 地址:如果您有 C 类地址,您可以分配 IP 地址 206.156.217.7 和子网掩码 255.255.255.0。

  • DNS 配置:选择启用 DNS,并为您的机器指定名称 Doofus 作为主机,NetBrain.com 作为域。此设置为 Windows 机器提供名称 Doofus.NetBrain.com—或者换一种说法,DoofusNetBrain.com 内。DNS 服务器搜索顺序应添加您的 DNS 条目,使其与 Linux 服务器的 /etc/resolv.conf nameserver 条目相同。

  • WINS 配置:选择禁用 WINS 解析

  • 绑定:为您的 Linux 机器添加网关。网关帮助您的机器找到出网关并进入互联网的路径。我们向已安装的网关列表中添加了 206.156.217.10。

测试您的 Windows 95 客户端

在您重新启动您的 Win95 机器后,您应该能够使用 ping 206.156.217.7 从您的 Linux 主机 ping 它。如果失败,可能的问题可能是电缆、Linux 驱动程序、Win95 驱动程序或您的 Win95 配置。现在从另一边... 当您准备好测试您的 Windows 95 客户端时,打开一个 MS-DOS 窗口并 ping 您的服务器。命令 ping 206.156.217.10 应该从您的服务器获得响应。您应该能够 TELNET 到您的机器 (telnet mickeymouse.com),并且还应该能够启动浏览器并访问任何您感兴趣的网站。就这么简单。

用于拨号接入的多端口串行卡

大多数个人计算机只有两个串行端口,其中一个通常被鼠标使用。提供拨号接入的最佳方法是购买多端口串行卡。我们使用 Cyclades Cyclom 16Yep 卡,它提供 16 个串行端口供调制解调器使用。更重要的是,驱动程序已内置到 Linux 内核中。

在您购买特定卡之前,请确保该卡的驱动程序存在,并且您的机器已将驱动程序编译到内核中。您可能必须使用 MAKEDEV 创建您的串行卡使用的端口。我们的 Cyclades 卡使用 ttyC0-ttyC15 作为串行端口,而不是标准串行端口 ttyS0 和 ttyS1。幸运的是,Cyclades 卡附带了一个 makecyc 安装脚本,它为我完成了这项工作。

初始化串行端口

需要调用程序 setserial 来初始化串行端口。可能需要编辑 /etc/rc.d/rc.serial 文件以正确设置您的服务器的串行端口。要将 com2 用于拨出调制解调器,请将以下行放入 rc.serial

#standard serial port - com2:
setserial /dev/cua1 spd_vhi auto_irq autoconfig

对于 Cyclades 卡,我将端口 3-10 /dev/cub2 - /dev/cub10(一些未使用—用于扩展)配置如下

#configure Cyclades serial ports
setserial -b /dev/cub2 spd_vhi autoirq skip_test
setserial -b /dev/cub3 spd_vhi autoirq skip_test
setserial -b /dev/cub4 spd_vhi autoirq skip_test
setserial -b /dev/cub5 spd_vhi autoirq skip_test
setserial -b /dev/cub6 spd_vhi autoirq skip_test
setserial -b /dev/cub7 spd_vhi autoirq skip_test
setserial -b /dev/cub8 spd_vhi autoirq skip_test
setserial -b /dev/cub9 spd_vhi autoirq skip_test
确保从启动 rc 文件之一(通常是 rc.s)调用 rc.serial 文件。这将在启动期间自动配置您的串行端口。
修改 gettys 文件

接下来,您需要配置主机以侦听串行端口上的传入连接并应答这些连接。/etc/gettydefs 文件用于设置 gettys,它建立与机器的连接。当安装标准版本的 Linux 时,您会在 /etc/gettydefs 文件中找到以下行

c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c2:1235:respawn:/sbin/agetty 38400 tty2 linux
c3:1235:respawn:/sbin/agetty 38400 tty3 linux
c4:1235:respawn:/sbin/agetty 38400 tty4 linux
c5:1235:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux

这为您的控制台(键盘)提供了六个虚拟登录。行 /sbin/agetty 中的第四项是轮询控制台以进行登录的程序。以下参数描述了登录速度、终端号和终端仿真。在参数列表之后,为您拨号线路添加以下行。

# Dial-up lines using /sbin/getty
# (actually getty_ps)
s1:345:respawn:/sbin/getty ttyC2 115200 vt100
s2:345:respawn:/sbin/getty ttyC3 115200 vt100
s3:345:respawn:/sbin/getty ttyC4 115200 vt100
由于在串行端口上使用 agetty 遇到问题,我们对拨号线路使用了不同的 getty (getty_ps)。我们还听说 getty_ps 更可靠。您也可以对拨号线路使用 mgetty,但 getty_ps 对我们来说效果很好。但是,getty_ps 的参数略有不同:getty 名称后面的参数是 tty、/etc/gettydef 标签和终端仿真默认值。前面几行中的 115200 指的是 /etc/gettydefs 文件中显示的标签
#/etc/gettydefs
# Modem locked at 115200: Serial port is at
# 115200, modem is much less, but should be
# able to compress.
#
# Last line of this file is described in next
# comment line as fields separated by # signs.
# label # initial-flags # final-flags # login prompt # next label
115200# B115200 CS8 CRTSCTS # B115200 SANE -ISTRIP CRTSCTS #@S login: #115200
现在您必须为 getty_ps 提供启动值。在目录 /etc/defaults 中,放置每个拨号线路的配置文件。对于拨号线路 /dev/ttyC2,我们有一个相应的名为 /etc/default/getty.ttyC2 的文件,如列表 3所示。

如果一切按计划进行,主机应该能够接受 shell 登录。您应该能够拨入您的机器并在 shell 中运行命令。

要监视拨号连接,您可以在 /etc/default/getty.tty?? 文件中设置 DEBUG=777 以创建日志文件。这将帮助您识别问题,如果调制解调器不应答或未正确配置。输出将转储到 syslog 文件,通常在 /var/adm/syslog 中。

用户的拨号 Shell 访问

此确认(为人们提供 shell 拨号访问)可以修改为向客户提供拨号 PPP 访问。我们选择修改默认的 login 程序(在 poeigl 包中),因为我们想同时提供 PPP 和 shell 访问(当我在远程设置某人的机器时很有用)。ppplogin 程序的提示符如下所示

Username: jsmith
Password:
Please select PPP or Shell access:
1) PPP
2) Shell
Please enter your choice: 1

如果用户选择 shell,Linux 将调用用户定义的标准 shell。如果选择 PPP,则脚本将为拨号用户调用 pppd 并动态分配给他一个 IP 地址。用于调用 ppp 脚本文件的 C 代码部分如下所示

/* --- PPP account login --- */
execlp ("/bin/sh", "-sh", "-c",
   "/etc/ppp/ppplogin", (char *)0);
fprintf (stderr,
   "login: couldn't exec shell script: %s.\n",
strerror (errno));
exit(0);
/etc/ppp/ppplogin 如列表 4所示。

当用户选择 ppp 时,服务器会查找拨入人员正在使用的 tty,并将 IP 地址分配给 tty。如果用户始终在特定线路上呼叫,则会给他分配相同的 IP 地址。在第一条线路上拨入的用户在 ttyC6 上进入。这用于为用户分配 IP 地址 206.156.217.31。这将创建一个到拨号线路的 PPP 链接,就像到我的主机的 PPP 链接一样。ppplogin 脚本中与此 tty/ppp 连接相关的重要参数如下

  • Detach—不要作为后台进程运行。

  • Modem—使用载波线路检测诸如挂断之类的事件

  • 206.156.217.10:206.156.217.35—我被称为 206.156.217.10,而另一端的人被称为 206.156.217.35。

保持连接建立

早期我们发现我们的专用连接经常被电话公司断开。我通过使用一个名为 pppupd 的程序解决了这个问题,该程序不断 ping 我们的 ISP 的机器,如果 ping 失败,它会调用 ppp-on 脚本来重新拨号连接。

传真服务和无缝 Windows 95 拨号

我们的大多数客户都是 Windows 95 用户,他们不喜欢每次登录服务器时都必须键入用户名和密码。为了消除这种烦恼,我们找到了一个不同的 getty 包,名为 mgetty,它为想要使用“拨号网络”对话框的 Windows 95 用户提供 PPP 拨号器的自动检测。这为我们节省了大量支持 Windows 95 用户的时间。mgetty 包 (http://sunsite.unc.edu/pub/Linux/system/Serial/mgetty+sendfax) 很难设置,因此在构建之前请阅读文档。此软件包的一个出色功能是在传入的调制解调器线路上接收传真,而无需额外的硬件或其他线路。我们可以使用相同的拨号线路来接收传真。

电子邮件

我们的电子邮件通过我的 Linux 安装自动配置。您可以安装 pine 以进行 shell 访问,并安装 POP v3 以进行 POP 服务器电子邮件。如果您没有安装 POP 服务器,您可以从各种站点(例如 sunsite.unc.edu)获取名为 pop3d 的软件包,并按照说明进行安装。

Web 服务器

如果您希望您的机器托管网页,则必须安装 Web 服务器。我们下载了 Apache Web 服务器 (https://apache.ac.cn/),并使用可用的文档重新编译和配置了它。编译源代码应该创建一个 httpd 可执行文件,该文件可以复制到 /usr/sbin 中。此外,在 /etc/rc.d/rc.local 配置文件中添加行 /usr/sbin/httpd,以便在启动期间自动启动它。

Building an ISP Using Linux and an Intranet
Eric Harlow 自 1996 年 2 月以来一直在 Linux 上运行 NetBrain。他目前是 RDA Consultants Ltd. 的顾问。他的电子邮件地址是 brain@netbrain.com。
加载 Disqus 评论