使用SLiRP和PPP实现准互联网连接

作者:Jim Knoble

现在是90年代。世界上越来越多的人听说过“连接到互联网”。其中一些人实际上已经实现了技术、智力和文化上的飞跃,进入了“网络空间”。而他们中的一些人正在使用Linux来连接网络。我是所有这三个群体的一份子。事实上,我已经变得非常依赖我的互联网连接——它就像拥有一部电话,只是更贵。

要连接到互联网,你过去只有两种选择:要么是直接(且昂贵)的互联网连接,就像公司和机构使用的那种,要么是通过调制解调器连接到别人的机器上,那台机器有直接的互联网连接,你的电脑就像一个“哑终端”一样使用。如果你愿意,你今天仍然可以这样做,但是随着像SLIP(串行线路互联网协议)和PPP(点对点协议)这样的“真正的”网络连接越来越普及,真正想感觉自己桌子上只有一台哑终端的互联网用户越来越少了。然而,由于一些原因,我们中的一些人唯一可用的互联网接入方式是拨号哑终端式的互联网账户,或者“shell”账户。

SLiRP应运而生。SLiRP是一个免费提供的软件包,由Danny Gasparovski(danjo@blitzen.canberra.edu.au)编写,它使普通的shell账户像SLIP或PPP账户一样工作。还有其他所谓的“SLIP模拟器”(其中一个更著名的是The Internet Adaptor——参见参考侧边栏),以及“终端多路复用器”,例如term,它在shell账户和本地计算机之间使用非标准协议。SLiRP比这两类软件都具有优势,作者在SLiRP软件包随附的README文件中详细介绍了许多优势,以及一些缺点。

远程端:安装SLiRP

SLiRP不在您的“本地”计算机(否则将是哑终端的那台计算机)上运行,而是在“远程”计算机(实际连接到互联网的那台计算机)上运行。为了正确安装SLiRP,您需要以下条件

  • 远程主机上的Unix shell账户

  • 远程主机上可用的C编译器

  • 您知道如何在远程主机上使用的编辑器

如果您不确定是否拥有可用的编译器或编辑器,请联系您的系统管理员,或熟悉您远程站点的其他人。

安装SLiRP的步骤如下

获取SLiRP

在撰写本文时,SLiRP的最新版本是slirp-0.95h.tar.gz。请参阅参考侧边栏以查找SLiRP。获得软件包后,将其“untar”到有用的位置(例如/usr/local/src)——可以使用命令tar zxvf slirp-0.95h.tar.gz

编译源代码

SLiRP软件包的slirp-0.95h/docs中包含各种文档。编译SLiRP的说明位于slirp-0.95h/docs/README.compiling中,其要点是:切换到slirp-0.95h/src目录并运行位于该目录中的configure程序(通常通过键入./configure);然后通过键入make构建程序。如果您遇到问题,请查阅文件slirp-0.95h/docs/README.getting-help。

安装程序

成功编译SLiRP后,您需要将SLiRP二进制文件放在您可以运行它的位置。如果您还没有自己的程序目录,我建议创建一个名为~/bin的目录,然后将其添加到您的登录脚本中的PATH中。如果您不确定如何在您的系统上执行此操作,请咨询您的系统管理员。然后,从slirp-0.95h/src目录中,执行以下命令

strip slirp
cp slirp ~/bin
chmod 0700 ~/bin/slirp

(或者,如果您的站点有GNU `install'可用,您可以使用install -s -m 0700 slirp ~/bin一步完成上述操作。)

配置SLiRP

这是棘手的部分,部分原因是SLiRP是一个不断发展的产品,其文档不一定完全完整和最新;但是,我建议在执行任何其他操作之前阅读slirp-0.95h/docs/CONFIG和slirp-0.95h/docs/README.ppp。接下来,使用您最喜欢的文本编辑器,创建SLiRP的配置文件,名为~/.slirprc。至少,您需要包含一个baudrate设置。如果您计划使用SLiRP来模拟PPP,您还应该包含一个ppp标志、一个asyncmap设置以及mtumru值。您的.slirprc文件可能看起来像我的文件

baudrate 115200
ppp
asyncmap 0
mtu 552
mru 552
log start

您很可能需要调整“baudrate”以适合您的调制解调器——可能需要进行一些实验。[“baudrate”实际上应该是每秒比特数,或bpsrate。即使是碰巧知道他们的14400 bps调制解调器以2400波特运行的极客也不应该将baudrate参数设置为2400.. —ED]

安装并配置SLiRP后,您只需键入slirp即可启动它;然后SLiRP将尝试发起连接。

本地端:在Linux下安装PPP

SLiRP只是您网络连接的一半;您还需要在本地Linux机器上激活连接的另一半。Linux和SLiRP一样,“说”SLIP和PPP——也就是说,对通过SLIP连接和PPP连接的TCP/IP网络的支持内置于Linux内核中。但是,尽管两者在Linux下都可用,但我强烈建议使用PPP而不是SLIP,原因如下

  • PPP是互联网标准协议——这意味着它已经过互联网架构委员会(IAB)批准的标准化流程,并且是互联网协议套件的正式组成部分。相比之下,SLIP是“互联网非标准”,并且不在标准轨道上。

  • PPP可以在一些非8位透明的连接上工作;SLIP则不行。

  • PPP可以支持身份验证、对等地址协商、数据包头压缩和点对点错误纠正;SLIP都不能支持这些(尽管压缩SLIP或CSLIP支持数据包头压缩)。

简而言之,我认为PPP能够提供比SLIP更强大和可靠的连接,而不会显着降低连接的表面速度。

Linux下的PPP支持分为两部分。一部分是网络系统驱动程序的一部分,内置于Linux内核中。另一部分是名为pppd守护进程,它作为一个单独的软件包提供。

今天大多数发行版都内置了PPP支持,但如果您的Linux系统是从较旧的发行版构建的,您可能需要安装PPP支持。为了在Linux下正确安装PPP网络,您需要安装gcc,以及以下之一

  • 内核版本为1.1.13或更高版本,并编译了PPP支持的Linux内核,或者

  • 内核版本为1.0或更高版本的Linux内核,以及编译Linux内核的一些经验或可以帮助您完成此操作的人。

如果您不知道您的内核是否已编译PPP支持,请在启动机器时查找类似于以下内容的消息

PPP: version 0.2.7 (4 channels) [...]

您还可以使用命令dmesg | grep PPP在内核启动消息中搜索上述行。如果不存在PPP消息,您将需要重新编译内核以添加PPP支持(除非您正在使用PPP内核模块;某些发行版附带可用的PPP模块)。如果您不知道您的内核版本是什么,请使用uname -a命令显示有关您系统的信息。如果您的内核版本低于1.1.13,您可能需要重新编译内核并安装较新的PPP驱动程序才能使用PPP。如果您需要重新编译内核,特别是如果您需要安装较新的PPP驱动程序,请参阅pppd软件包随附的文档和Linux文档项目的PPP-HOWTOKernel-HOWTO以获取更多信息。

设置PPP的步骤如下

获取pppd

在撰写本文时,pppd的最新版本是ppp-2.1.2d.tar.gz。您可能已经拥有pppd;许多Linux发行版都包含它。您可以使用以下命令检查它:find / -name "pppd*" -print。如果您的发行版已经安装了pppd,您可以继续进行配置步骤。如果您要编译pppd,请将源软件包untar到有用的位置(例如您untar SLiRP的位置)。

编译和安装pppd

pppd软件包附带了详细的说明,包括一些专门针对Linux用户的说明,位于pppd-2.1.2d/README和pppd-2.1.2d/README.linux中。我建议您在编译和安装pppd之前阅读这两个文档以及pppd-2.1.2d/linux中的任何文档。然后,切换到pppd-2.1.2d/pppd目录并使用cp Makefile.linux Makefile创建Makefile(我建议复制而不是链接,以便您可以在必要时更改makefile,而不会影响原始文件)。检查makefile以确保BINDIRMANDIR设置为安装pppd二进制文件和手册页的正确位置(为了符合Linux文件系统标准,它们可能应该设置为/usr/sbin和/usr/man)。使用您最喜欢的文本编辑器对makefile进行任何必要的更改。通过运行make构建pppd。要安装pppd,请首先成为超级用户(通过以root身份登录或使用su命令),然后键入make install;这将安装pppd二进制文件和手册页。如果您要替换旧版本的pppd,您可能希望制作旧pppd的备份副本,直到您确定新版本可以正常工作为止。[如果您正在使用最新的开发内核,您还需要最新版本的pppd;它将是2.2.0系列中的最新版本,与较旧的2.1.2系列pppd源保存在相同的位置—ED]

编译和安装chat

pppd软件包附带了一个名为chat的实用程序,它执行“expect-send”脚本,用于拨号调制解调器、执行自动登录等。chat位于pppd-2.1.2d/chat/。编译和安装chat的步骤与pppd基本相同:复制makefile,编辑以适合您的系统,make,然后以超级用户身份make install。但是,chat手册页需要手动安装;使用

install -m 0444 -o root -g man chat.8 /usr/man/man8/

来执行此操作。

配置pppd

现在是阅读pppd手册页的好时机。虽然它相当长,但手册页包含一些对于理解如何设置pppd至关重要的信息,包括对pppd调用的几个脚本的解释。正确配置pppd需要几个步骤,并且使其方便使用还需要一些步骤

  • 创建系统范围的pppd配置文件/etc/ppp/options。

  • 修改网络配置文件以使用PPP连接。

  • 创建脚本/etc/ppp/ip-up和/etc/ppp/ip-down,以在PPP链接变为活动状态时以及在关闭之前执行任何必要的操作。

  • 配置系统日志记录工具,以便将来自pppd的消息写入系统日志。

  • 创建脚本以优雅地启动和停止pppd。

系统范围的配置文件/etc/ppp/options是使pppd工作的最重要的事情。即使您不打算在其中存储配置信息,该文件也必须存在并且可由root用户读取——否则,pppd将无法启动。不幸的是,pppd有太多可能的选项要配置,以至于很难从头开始构建配置文件。我整理了一个pppd的选项文件模板,其中包含每个可配置的选项以及直接从pppd手册页中摘取的解释性文本,并使其可匿名FTP免费获取(有关位置,请参阅参考资料)。我建议获取psetopt.tgz软件包以用作配置的起点。

pppd的配置文件如下所示

## /etc/ppp/options -- config file for pppd
# async character map -- 32-bit hex; each bit
# is a character that needs to be escaped for
# pppd to receive it.  0x00000001 represents
# "<\>x00", and 0x80000000 represents "<\>x1f".
asyncmap 0
# Use hardware flow control (i.e. RTS/CTS) to
# control the flow of data on the serial port.
crtscts
# Add a default route to the system routing
# tables, using the peer as the gateway, when
# IPCP negotiation is successfully completed.
# This entry is removed when the PPP connection
# is broken.
defaultroute
# Set the MRU [Maximum Receive Unit] value to <n>
# for negotiation.  pppd will ask the peer to send
# packets of no more than <n> bytes. The minimum
# MRU value is 128. The default MRU value is 1500.
# A value of 296 is recommended for slow links
# (40 bytes for TCP/IP header + 256 bytes of data)
mru 552
# Disables the default behaviour when no local IP
# address is specified, which is to determine (if
# possible) the local IP address from the
# hostname. With this option, the peer will have
# to supply the local IP address during IPCP
# negotiation (unless it is specified explicitly on
# the command line or in an options file).
noipdefault

此文件假定调制解调器设置为使用硬件流控制(crtscts),本地机器和远程机器之间的链接是8位干净的(asyncmap 0),并且远程机器将告诉pppd本地机器的IP地址是什么(noipdefault)。它还告诉pppd向系统路由表添加“默认路由”(defaultroute),这通常是我们拨号上网连接所需要的,并将“最大接收单元”,即pppd将接受的最大PPP数据包,设置为552(mru 552)。

如果您想为您的调制解调器使用软件流控制而不是硬件流控制,您可以使用xonxoff代替crtscts。您还需要将XON和XOFF字符添加到asyncmap选项中,如下所示:asyncmap后面的数字是一个32位十六进制数,其中每个位代表一个介于0x00(^@)和0x1f(^_)之间的字符,该字符必须“转义”,或者作为双字节序列发送,以避免在传输中被吞噬或损坏;asyncmap 000a0000转义字符0x13(^S)和0x11(^Q),即XON/XOFF字符。您还需要将此asyncmap设置添加到远程主机上的SLiRP配置文件中。

您需要修改或检查的Linux系统上的网络配置文件是

  • /etc/rc.d/rc.inet1或/etc/rc.net,网络配置文件(它可能被称为稍微不同的名称,具体取决于您的发行版)

  • /etc/hosts,主机名到地址的配置文件

  • /etc/resolv.conf,解析器配置文件

pppd随附的README.linux文件中的“常规网络配置”标题下详细讨论了这些文件的配置;但是,以下几项对于将pppd与SLiRP一起使用很重要

  • 在/etc/hosts中,使用地址`10.0.2.15'作为您的Linux机器的地址;这是SLiRP默认使用的地址。例如,我自己的机器名为“zephyr”,在虚构的域“earth”中,并且在我的主机表中环回条目之后出现以下行

10.0.2.15 zephyr.earth zephyr
  • 为了填写/etc/resolv.conf的nameserver部分,您需要知道远程主机的名称服务器的地址。有三种方法可以找到此信息,按从最少到最多的努力排序

    (1)使用命令nslookup,它将打印默认名称服务器的名称和数字地址(使用exit退出nslookup);

    (2)使用命令cat /etc/resolv.conf读取远程解析器配置文件——它应该具有名称服务器条目,就像您需要的条目一样;或

    (3)询问系统管理员,他可能愿意也可能不愿意向您提供该信息。

您可能希望在PPP链接打开时执行某些操作,并在PPP链接关闭时执行其他操作;您可以将此类操作放在名为/etc/ppp/ip-up和/etc/ppp/ip-down的脚本中。例如,我配置了smail(我的邮件传递代理)将外发邮件发送给我的互联网帐户提供商,这只有在我的PPP链接启动时才可用。在我的ip-up脚本中,我有一个命令将任何排队的外发邮件发送到智能主机进行传递。

#!/bin/sh
#
# /etc/ppp/ip-up -- do net-stuff when ppp is up
# send queued outgoing mail over new net connection
/usr/sbin/runq

ip-up和ip-down程序不必是shell脚本——它们也可以用Perl、Tcl或任何其他脚本语言编写。但是,脚本应该是可执行的,即它们应该设置了执行权限(使用

不要断开以下行

chmod 0755 /etc/ppp/ip-up /etc/ppp/ip-down

并且脚本的第一行应该是#!path-to-program格式,其中包含应运行脚本的程序的完整路径(例如,Bourne shell脚本为#!/bin/sh,Perl为#!/usr/local/bin/perl)。

pppd将消息和一些调试信息发送到系统日志记录工具syslogd。您可能希望配置syslogd,以便将这些消息记录到单独的日志文件中;为此,您需要成为超级用户并修改syslogd配置文件/etc/syslog.conf。pppd记录到“daemon”工具,因此我们将以下行添加到syslog.conf

# Log daemon-related messages in a special place
daemon.*        /var/log/daemon.log

您应该将守护程序日志放在与其他系统日志相同的位置;Linux文件系统标准建议使用/var/log。为了使syslogd重新读取其配置文件,请使用命令kill -HUP pid向其发送挂起信号,其中pid是syslogd的数字进程ID,如ps ax命令生成的列表中所示。或者,使用killall -HUP syslogd

由于从命令行尝试启动和停止pppd可能有点繁琐,我建议创建两个名为ppp-on和ppp-off的可执行脚本。pppd软件包附带了pppd-2.1.2d/chat中的示例脚本,您可能希望将其用作指南。每个脚本的简单版本如图图1图2所示。您可能应该将脚本安装在与安装pppd相同的位置(对于我的系统,为/usr/local/ppp/bin)。

图1. ppp-on脚本示例

图2. ppp-off脚本示例

使关系正常工作

在远程主机上安装了SLiRP,并在Linux机器上安装了pppd之后,现在是时候尝试使它们协同工作了。最好在最初几次使用您喜欢的通信软件包(例如kermit、minicom或Seyon)拨号连接到您的互联网服务提供商(远程机器),以便测试登录和连接过程。需要执行以下几个步骤

  • 在您的本地机器上使用命令netstat -rn显示系统路由表。如果netstat不可用,请尝试使用命令/sbin/route。如果这两个命令都不可用,您可能需要从您的Linux发行版安装一个网络软件包——在此处停止并检查您的发行版文档或咨询您当地的Linux专家。您的路由表应类似于图3。

图3. 初始路由表

  • 启动您最喜欢的通信软件包。

  • 设置您的调制解调器在DTR掉线时不挂断(请查阅您的调制解调器文档,了解如何执行此操作——对于Hayes兼容调制解调器,命令通常为at&d0)。

  • 如果您的通信软件包具有会话日志记录功能(例如,kermit的log session命令),请打开会话日志记录。

  • 拨号连接到远程机器并像往常一样登录。如果您的通信软件包没有会话日志记录功能,您应该手动记录登录过程,写下出现的提示以及您键入的响应。

  • 从您的shell提示符启动SLiRP,使用命令slirp

  • 如果您在上面启动了会话日志记录,请停止会话日志记录,并挂起您的通信程序或断开其与调制解调器的连接(我建议使用第二个;在kermit中,您可以在命令提示符下说set line来断开连接,而无需挂断或退出kermit)。

  • 使用命令ppp-on启动pppd。

  • 等待几秒钟以使连接建立,然后再次显示网络路由表。您的路由表现在应该具有类似于图4的远程主机条目,其中xxx.xxx.xxx.xxx是远程主机的IP地址。

图4. 最终路由表

  • 如果您的路由表看起来是正确的,请尝试使用命令telnet xxx.xxx.xxx.xxx连接到远程机器,使用路由表中显示的IP地址,并像往常一样登录。如果有效,请尝试[telnet 远程机器的主机名或telnet到您知道的另一台主机。您已连接!完成后,使用ppp-off停止pppd,并恢复您的通信程序。要停止SLiRP,请稍等片刻,然后键入0(零)五次。SLiRP实际上需要每个0之间有一个短暂的停顿才能将其识别为关机字符串,但是正常的打字速度可以正常工作。注销并挂断您的调制解调器。

  • 如果这些路由表条目未出现,请首先检查您的pppd配置文件/etc/ppp/options是否包含defaultroute条目。接下来,检查您的pppd配置文件中是否没有passivesilent条目——默认情况下,SLiRP静默等待PPP连接的另一端(在本例中为pppd)发送配置数据包。如果条目不存在,请使用命令ps ax | grep pppd检查pppd是否仍处于活动状态——如果它不是处于被动或静默模式,pppd将在发送一定数量(默认情况下为10个)的配置请求后超时。

  • 如果pppd超时,请检查系统日志中来自pppd的条目。如果您没有如上所述配置syslogd以捕获来自pppd的消息,那么现在是执行此操作的好时机。请注意,您可以通过在pppd的配置文件中放置debug条目来增加来自pppd的系统日志消息级别。SLiRP还将执行多个级别的日志记录:slirp -d ~/slirp.log会将调试输出记录到远程主机上的文件~/slirp.log;将条目log start添加到SLiRP配置文件~/.slirprc会将启动信息记录到~/.slirp_start;并将条目debug添加到SLiRP配置文件的PPP部分会将PPP调试输出记录到文件~/ppplog。

将各个部分粘合在一起

一旦您让pppd和SLiRP相互通信,您就可以创建一个更复杂的ppp-on脚本,以自动拨号连接到远程主机、登录、启动slirp,然后在您的Linux机器上启动pppd。我创建了这样一个脚本,它使用了pppd软件包附带的“chat”实用程序;它如图图5所示。

图5. 带有chat选项的复杂ppp-on脚本

此shell脚本旨在在特定目录(例如~/.ppp或/usr/local/ppp/script)中查找“chat脚本”,以用于拨号和登录。当使用参数启动时,例如ppp-on my-isp-name,此版本的ppp-on将使用名为~/.ppp/my-isp-name.chat的chat脚本进行拨号和登录。此功能允许单个用户拥有多个用于多个互联网服务提供商的拨号脚本,并允许多个用户保持其密码的私密性。

当使用-c选项启动时,此ppp-on脚本还可以在启动PPP连接后执行自定义脚本。例如,ppp-on -c将在启动pppd后执行名为~/.ppp/default.ppp的脚本,而ppp-on -c my-isp-name将使用chat脚本拨号并自动登录,如上所述,然后在启动pppd后执行~/.ppp/my-isp-name.ppp。在多用户环境中,这可以作为/etc/ppp/ip-up脚本的有用替代品。此外,此ppp-on脚本允许使用详细选项-v将chat脚本的执行记录到系统日志中以进行调试。

chat脚本由以空格分隔的“expect-send”字符串序列组成。chat期望在其标准输入上接收脚本中的第一个非关键字字符串;当它接收到时,它会发送下一个非关键字字符串,后跟一个回车符到标准输出,依此类推。要制作自定义的chat脚本,您可以使用您在登录远程主机时制作的会话日志。此处显示了一个示例会话日志和生成的chat脚本;您可能还希望查阅chat的手册页。

首先,示例会话日志

at
OK
atz
OK
at&b0s0=0
OK
atdtMY-PHONE-NUMBER
CARRIER 28800
PROTOCOL: LAP-M
CONNECT 115200
Welcome to My Internet Service Provider
suchandsuch login: MY-LOGIN-ID
Password:
--SYSTEM NEWS--
        blah blah blah blah
        blah blah blah blah blah blah.
TERM = unknown
TERM = (vt100) vt102
MY-SHELL-PROMPT% slirp

这是与会话日志匹配的chat脚本

ABORT BUSY
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
TIMEOUT 2   OK-at-OK atz
TIMEOUT 5   OK at&b0s0=0
            OK atdtMY-PHONE-NUMBER
TIMEOUT 60  CONNECT ""
TIMEOUT 10  ogin:--ogin: MY-LOGIN-ID
            ssword: \qMY-PASSWORD
            (vt100) vt102
            MY-SHELL-PROMPT% slirp

该脚本使用了chat的几个功能,这些功能使执行自动登录更容易

  • ABORT关键字,如果在任何时候收到列出的任何字符串,则中止脚本。

  • TIMEOUT关键字,用于调整chat超时(以秒为单位),这样您就不必等待45秒才能发现您的调制解调器没有响应。

  • 用引号括起来的“空”发送字符串,"",(chat接受单引号或双引号),它只是发送一个回车符。

  • 使用连字符的“子期望”序列(如果未收到第一个字符串,则chat发送第一个连字符后面的字符串,后跟一个回车符,然后期望第二个连字符后面的字符串;如果收到第一个字符串,则跳过连字符序列的其余部分)

  • \q(“静默”)转义序列,它使字符串不被记录,确保您的远程密码不会出现在系统日志中。

如果我们能够使用SLiRP、pppd和chat更轻松地登录到远程主机,那么我们也应该能够更轻松地注销。ppp-off脚本(参见图2)做了一些这方面的工作,但还不够。pppd确实有一个disconnect选项,但是由于您可能希望使用pppd连接到多个互联网服务提供商,其中一个或多个可能不使用SLiRP,因此有一个更灵活的解决方案:与其尝试使用pppd挂断电话(这不是它的工作),不如使用chat退出SLiRP并在pppd断开PPP链接后挂断电话。

图6. remote-slirp-off脚本

图6包含一个名为remote-slirp-off的shell脚本,它正是这样做的。此shell脚本显示了作为chat的参数而不是从脚本文件中读取的chat脚本。请注意chat转义序列的双反斜杠——如果它们没有加倍,shell会删除它们,并且后面的字符似乎只是发送字符串的一部分。\d转义延迟一秒钟,而\p转义延迟十分之一秒。\c表示在其中出现的发送字符串之后不要发送回车符。该脚本还提供了一个详细选项-v,用于将chat记录到系统日志中以进行调试。与chat一样,remote-slirp-off期望调制解调器同时位于标准输入和标准输出上。

借助上述脚本的“粘合剂”,包括您为拨号连接到您的互联网帐户而定制的chat脚本,您可以使用简单的命令启动pppd和SLiRP之间的PPP连接

ppp-on name-of-chat-script

您可以使用简单的命令序列停止连接

ppp-off
remote-slirp-ff </dev/modem >/dev/modem

如果您确实必须使用简单的一个词的命令来执行这些操作,您可以轻松地将它们放入别名、shell函数或另一个shell脚本中。

结语

除了我在此处讨论的功能和能力之外,SLiRP还具有更复杂的功能,用于负载均衡和重新启动中断的连接,以及实用程序,用于启动远程shell,而无需通过telnet登录或通过SLiRP连接发送文件,而无需使用FTP;但是,对于正常工作的互联网连接来说,这些都不是必需的。查看SLiRP随附的文档和SLiRP WWW页面,以获取有关这些附加功能的更多信息。

注意不要对SLiRP连接过于上瘾。记住:它就像拥有一部电话,只是更贵。

Jim Knoble (jmknoble@mercury.interpath.com) 自从运行CP/M的家用Heathkit Z80机器时代以来就一直是计算机的朋友,并且自1992年末以来一直在学习Linux。当Jim不在工作时,他喜欢国际民间舞蹈、在教堂合唱团唱歌、复习德语、骑自行车、烤面包、远足和写诗。他住在北卡罗来纳州教堂山,这里是许多优秀的Linux产品和人才的故乡。Jim希望有一天世界将体验到持久的和平。

加载Disqus评论