28.7. 使用SLIP

Originally contributed by Satoshi Asami.
With input from Guy HelmerPiero Serini.

警告:

这节内容只在 FreeBSD 7.X 上可用。

28.7.1. 设置 SLIP 客户端

下面是在静态主机网络上配置 FreeBSD 机器使用 SLIP 的方法。 对于动态主机名分配 (您的地址会随每次拨号而不同), 您可能需要稍复杂一些的设置。

首先, 您需要确认调制解调器所连接的串口。 许多人会设置一个符号连接, 例如 /dev/modem, 用以指向实际的设备名, 如 /dev/cuadN。 这样您就可以对实际的设备名进行抽象, 以备调制解调器换到其他串口时方便调整之用。 不然, 修改 /etc 和遍布于系统中的 .kermrc 文件将是一件很麻烦的事情!

注意:

/dev/cuad0 对应 COM1, 而 /dev/cuad1 则对应 COM2, 等等。

确保您的内核文件包含以下内容:

device   sl

这包含在GENERIC内核, 所以这应该不会是个问题, 除非您 已经删除了它。

28.7.1.1. 只需做一次的事情

  1. 把您本地网络上的机器、 网关以及域名服务器, 都加入到 /etc/hosts 文件中。 我们的是下面这个样子:

    127.0.0.1               localhost loghost
    136.152.64.181          water.CS.Example.EDU water.CS water
    136.152.64.1            inr-3.CS.Example.EDU inr-3 slip-gateway
    128.32.136.9            ns1.Example.EDU ns1
    128.32.136.12           ns2.Example.EDU ns2
  2. 请确保在您的 /etc/nsswitch.conf 中的 hosts: 小节里面, files 先于 dns 出现。 如果不是这样的话, 可能会产生一些不希望的现象。

  3. 编辑/etc/rc.conf

    1. 编辑以下这行设置主机名(hostname):

      hostname="myname.my.domain"

      应该用您主机的Internet全名代替。

    2. 改变这一行以指明默认的路由:

      defaultrouter="NO"

      改为:

      defaultrouter="slip-gateway"
  4. 创建文件/etc/resolv.conf, 写入以下内容:

    domain CS.Example.EDU
    nameserver 128.32.136.9
    nameserver 128.32.136.12

    正如您看到的, 这些行设置了域名服务器。 当然, 实际的域名和IP地址取决于您的环境。

  5. 设置roottoor的密码(其它任何没有密码的帐号)。

  6. 重启计算机, 然后确认使用了正确的主机名。

28.7.1.2. 创建一个SLIP连接

  1. 在命令提示符之后输入 slip 进行拨号, 输入您的机器名和口令。 具体需要输入什么, 与您的环境密切相关。 如果使用 Kermit, 则可以使用类似下面的脚本:

    # kermit setup
    set modem hayes
    set line /dev/modem
    set speed 115200
    set parity none
    set flow rts/cts
    set terminal bytesize 8
    set file type binary
    # The next macro will dial up and login
    define slip dial 643-9600, input 10 =>, if failure stop, -
    output slip\x0d, input 10 Username:, if failure stop, -
    output silvia\x0d, input 10 Password:, if failure stop, -
    output ***\x0d, echo \x0aCONNECTED\x0a

    当然, 您还需要修改用户名和口令来满足实际需要。 完成这些操作之后, 只需在 Kermit 提示符之后输入 slip 就可以连接了。

    注意:

    将密码以纯文本的形式存放在文件系统无论如何都是个 主意。 请考虑这样做的风险。

  2. 在这里退出 Kermit (也可以用 Ctrl+z 将其挂起), 以 root 用户键入:

    # slattach -h -c -s 115200 /dev/modem

    如果您能ping通路由器另一端的主机, 就是连接好了! 如果不行, 您可以使用-a选项代替 -c作为slattach的参数。

28.7.1.3. 关闭连接

按下面的步骤做:

# kill -INT `cat /var/run/slattach.modem.pid`

来杀掉 slattach。 切记上述操作只有以 root 身份才能完成。 接下来回到 kermit (如果之前是将它挂起了, 则使用 fg) 并退出 (q)。

slattach(8) 联机手册中提到, 必须使用 ifconfig sl0 down 才能将接口标记为关闭, 但和这样做似乎没有什么区别。 (ifconfig sl0 仍然报告同样的东西。)

有时, 您的 modem 可能会拒绝挂断。 这种情况下, 只需重新启动 kermit 并再次退出它就可以了。 一般来说试二次就可以了。

28.7.1.4. 问题解答

如果还不行, 尽管发邮件到 freebsd-net 邮件列表来提问。 常见的问题包括:

  • 执行 slattach 时不使用 -c-a选项 (这应该不是关键的, 但有些用户报告这样做解决了问题)。

  • 使用s10替换 sl0 (在一些字体下很难看出不同)。

  • 试试ifconfig sl0来查看您的接口状态。 例如, 您可以这样做:

    # ifconfig sl0
    sl0: flags=10<POINTOPOINT>
            inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00
  • 如果在使用 ping(8) 时得到了 no route to host 这样的提示, 则说明您的路由表可能有问题。 可以用 netstat -r 命令来显示当前的路由:

    # netstat -r
    Routing tables
    Destination      Gateway            Flags     Refs     Use  IfaceMTU    Rtt    Netmasks:
    
    (root node)
    (root node)
    
    Route Tree for Protocol Family inet:
    (root node) =>
    default          inr-3.Example.EDU  UG          8   224515  sl0 -      -
    localhost.Exampl localhost.Example. UH          5    42127  lo0 -       0.438
    inr-3.Example.ED water.CS.Example.E UH          1        0  sl0 -      -
    water.CS.Example localhost.Example. UGH        34 47641234  lo0 -       0.438
    (root node)

    前述的例子来自于一个非常繁忙的系统。 您系统上的这些数字会因网络活动的不同而改变。

28.7.2. 设置SLIP服务器

本文提供了在 FreeBSD 上设置 SLIP 服务, 也就是如何配置您的系统, 使其能在远程 SLIP 客户端登录时自动地开启连接的建议。

28.7.2.1. 前提条件

这一节技术性很强, 所以要求您有一定的背景知识。 本节假定您熟悉 TCP/IP 网络协议, 特别是网络和节点寻址、 子网掩码、 子网划分、 路由、 路由协议 (如RIP) 等知识。 在拨号服务器上配置 SLIP 需要这些概念性的知识。 如果您不熟悉它们, 请先阅读 Craig Hunt 的 TCP/IP 网络管理 由O'Reilly & Associates, Inc. 出版 (ISBN 0-937175-82-X), 或 Douglas Comer 有关 TCP/IP 协议的书籍。

此外还假定您已经配置好了您的调制解调器以及相应的系统文件, 以允许通过调制解调器进行登录。 如果您还没有为此配置好系统, 请参见 第 27.4 节 “拨入服务” 以了解关于如何进行拨号服务的配置。 您可能也会想看一看 sio(4) 的联机手册, 以了解关于串口设备驱动的进一步信息, 以及 ttys(5)gettytab(5)getty(8) & init(8) 上关于怎样配置系统来接受来自调制解调器的登录请求的具体情况, 还有 stty(1) 以了解关于设置串口参数 (例如 clocal 表示串口直联) 等。

28.7.2.2. 快速浏览

使用FreeBSD作为SLIP服务器, 在典型配置时, 它是这样工作的: 一个SLIP客户拨号并以专用的login ID登录到FreeBSD SLIP服务器系统。 这个用户使用 /usr/sbin/sliplogin 作为 shell。 sliplogin 程序会在文件 /etc/sliphome/slip.hosts 中查找这个用户的项, 如果找到了匹配项, 就将串行线连接到一个可用的 SLIP 接口, 然后运行 shell 脚本 /etc/sliphome/slip.login 以配置 SLIP 接口。

28.7.2.2.1. 一个SLIP服务器登录的例子

例如, 如果一个SLIP用户的ID是Shelmerg, 在/etc/master.passwdShelmerg的项如下的所示:

Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliplogin

Shelmerg登录时, sliplogin在文件 /etc/sliphome/slip.hosts中搜索与用户ID匹配的行;如下所示:

Shelmerg        dc-slip sl-helmer       0xfffffc00		  autocomp

sliplogin找到这条区配行, 并将串行线与另一个可用的SLIP接口连起来, 然后执行/etc/sliphome/slip.login脚本:

/etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp

如果一切顺利 /etc/sliphome/slip.login 将在 sliplogin 绑定的 SLIP 接口上发出 ifconfig (前述的例子中是 SLIP 接口 0, 这是 slip.login 的第一个参数), 以设置本地 IP 地址 (dc-slip)、 远程 IP 地址 (sl-helmer)、 这一 SLIP 接口的子网掩码 (0xfffffc00), 以及任何其他标志 (autocomp)。 如果发生错误, sliplogin 通常会通过 syslogd 的 daemon facility 记下有用的信息, 前者会把这些信息保存到 /var/log/messages (参见 syslogd(8)syslog.conf(5) 以及 /etc/syslog.conf 的联机手册, 以了解 syslogd 在记录什么, 以及这些内容将被记在哪里)。

28.7.2.3. 内核配置

FreeBSD 的默认内核 (GENERIC) 提供了 SLIP (sl(4)) 支持; 使用定制的内核时, 您必须把下面的设置加入到配置文件:

device   sl

默认情况下, 您的 FreeBSD 计算机不会转发包。 如果您希望将 FreeBSD SLIP 服务器作为路由器使用, 就需要修改 /etc/rc.conf 文件, 将 gateway_enable 变量设为 YES。 这样下次系统引导时就能够保持这一配置了。

要立即应用这些配置, 可以 root 的身份运行:

# /etc/rc.d/routing start

请参阅 第 9 章 配置FreeBSD的内核 以了解如何配置 FreeBSD 内核, 并获得在重新配置内核方面的指导。

28.7.2.4. Sliplogin配置

正如先前所提到的, /etc/sliphome 目录中有三个文件, 它们共同构成 /usr/sbin/sliplogin 的配置 (参考 sliplogin 的联机手册 sliplogin(8)): 用于定义 SLIP 用户和相关的 IP 地址的 slip.hosts、 通常仅用于配置 SLIP 接口的 slip.login, 以及 (可选的) slip.logout, 用以撤销由 slip.login 所执行的动作。

28.7.2.4.1. 配置 slip.hosts

/etc/sliphome/slip.hosts里的每行包含至少四个元素, 元素之间由空格隔开:

  • SLIP用户的登录ID

  • SLIP连接的本地地址(指SLIP服务器)

  • SLIP连接的远程地址

  • 网络掩网

本地和远程地址可以是主机名 (通过文件/etc/hosts或者域名服务解析为IP地址, 这取决于文件/etc/nsswitch.conf 中的设置), 网络掩网可以是一个 能通过文件/etc/networks解析的名字。 在一个样例系统中, /etc/sliphome/slip.hosts是这样的:

#
# login local-addr      remote-addr     mask            opt1    opt2
#                                               (normal,compress,noicmp)
#
Shelmerg  dc-slip       sl-helmerg      0xfffffc00      autocomp

在这行末尾是一或多个选项:

  • normal ──不压缩报头

  • compress ── 压缩报头

  • autocomp ──如果远程端允许, 压缩报头

  • noicmp ──禁用ICMP数据包 (这样就会丢弃所有的ping数据包, 不占用您的带宽)

对SLIP连接的本地及远程地址的选择取决是您是准备在SLIP服务器上使用 TCP/IP 子网还是使用ARP代理 (它并不是真正的ARP代理, 而是我们在本节用于介绍的术语)。 如果您不能确定选择何种方式或者如何分配地址, 请参考"前提条件"(第 28.7.2.1 节 “前提条件”)里列出的TCP/IP书籍 或者向您的IP网络管理员请教。

如果打算为您的 SLIP 客户使用一个独立的子网, 就需要先从分配得到的网络号中取出一个子网号, 然后再在这个子网里给每个 SLIP 客户分配 IP 地址。 接下来, 您还需要通过 SLIP 服务器在最近的 IP 路由器上配置一个指向 SLIP 子网的静态路由。

如果要使用 代理 ARP 的方式, 您还需要从 SLIP 服务器的以太子网中为每个 SLIP 客户分配IP地址, 还必须修改/etc/sliphome/slip.login/etc/sliphome/slip.logout脚本以使用 arp(8)来管理在 SLIP 服务器 ARP 表中的 代理 ARP 项。

28.7.2.4.2. slip.login Configuration

典型的/etc/sliphome/slip.login 如下所示:

#!/bin/sh -
#
#       @(#)slip.login  5.1 (Berkeley) 7/1/90

#
# generic login file for a slip line.  sliplogin invokes this with
# the parameters:
#      1        2         3        4          5         6     7-n
#   slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6

这个slip.login脚本仅仅为带有相应本地及远程地址和掩码的SLIP接口执行 ifconfig

如果您决定使用ARP代理 方式(而非为您的SLIP客户使用独立的子网), 您的/etc/sliphome/slip.login 应该是这样:

#!/bin/sh -
#
#       @(#)slip.login  5.1 (Berkeley) 7/1/90

#
# generic login file for a slip line.  sliplogin invokes this with
# the parameters:
#      1        2         3        4          5         6     7-n
#   slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6
# Answer ARP requests for the SLIP client with our Ethernet addr
/usr/sbin/arp -s $5 00:11:22:33:44:55 pub

slip.login新加的行arp -s $5 00:11:22:33:44:55 pub 在 SLIP 服务器的 ARP 表中加入了一个表项。 这个ARP项使得每当这个以太网上的其它 IP 节点对 SLIP 客户端 IP 地址进行 ARP 请求时, SLIP 服务器会以自已的以太网MAC地址作为回应。

当使用以上的例子时, 一定要将 以太网MAC地址 (00:11:22:33:44:55) 替换成您系统网卡的MAC地址, 否则ARP代理 将完全无法工作! 您可以查看 netstat -i 输出结果以取得以太网 MAC 地址; 输出的第二行应该是这样:

ed0   1500  <Link>0.2.c1.28.5f.4a         191923	0   129457     0   116

这行表明这个系统的以太网MAC地址是00:02:c1:28:5f:4a ──netstat -i输出的以太网MAC地址必须改成用冒号隔开, 并且要单个十六进数前加上。 这是arp(8)要求的格式; 参考arp(8) 的联机手册以获取完整的使用方法。

注意:

在编写 /etc/sliphome/slip.login/etc/sliphome/slip.logout 时, 一定要设置 可执行 (execute) 位 (换言之, chmod 755 /etc/sliphome/slip.login /etc/sliphome/slip.logout), 否则 sliplogin将无法执行它。

28.7.2.4.3. slip.logout配置

/etc/sliphome/slip.logout并不是必需的 (除非您使用了ARP代理), 如果您准备创建它, 这里有一个基本的 slip.logout 脚本的例子:

#!/bin/sh -
#
#       slip.logout

#
# logout file for a slip line.  sliplogin invokes this with
# the parameters:
#      1        2         3        4          5         6     7-n
#   slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 down

如果使用了 代理 ARP, 则可能希望 /etc/sliphome/slip.logout 在用户注销时自动为 SLIP 客户端删除 ARP 项:

#!/bin/sh -
#
#       @(#)slip.logout

#
# logout file for a slip line.  sliplogin invokes this with
# the parameters:
#      1        2         3        4          5         6     7-n
#   slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 down
# Quit answering ARP requests for the SLIP client
/usr/sbin/arp -d $5

arp -d $5 将删除由 代理 ARP slip.login 在 SLIP 客户程序登录时所生成的 ARP 项。

再次强调: 建立 /etc/sliphome/slip.logout 之后, 一定要设置可执行位 (也就是说, chmod 755 /etc/sliphome/slip.logout)。

28.7.2.5. 路由考虑

如果没有使用 代理 ARP 的方法来在您的 SLIP 客户机和网络的其余部分 (也可能是 Internet) 之间路由数据包, 您可能需要增加离您最近的默认路由器的静态路由, 以便通过 SLIP 服务器来在 SLIP 客户机子网上进行路由。

28.7.2.5.1. 静态路由

向您最近的默认路由添加一个静态路由可以说是很麻烦 (或者说是不可能, 如果您没有权限这么做)。 如果在您的组织中使用多路由器网络, 有些路由器 (比如 Cisco 和 Proteon 生产的) 不但要配置指向 SLIP 子网的路由, 而且还需要配置将哪些静态路由传给其它的路由器。 所以一些专家意见和问题解答对于使基于静态路由表的路由正常工作很有必要。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.