25.7 使用SLIP

Originally contributed by Satoshi Asami. With input from Guy Helmer 和 Piero Serini.

25.7.1 设置SLIP客户端

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

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

注意: /dev/cuaa0 (或 FreeBSD 6.X 中的 /dev/cuad0) 对应 COM1, 而 cuaa1 (或 /dev/cuad1) 则对应 COM2, 等等。

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

device   sl

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

25.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. 在 FreeBSD 5.0 之前的版本中, 请务必确保 /etc/host.conf 中的 hostsbind 之前出现。 从 FreeBSD 5.0 开始, 系统转而使用 /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. 重启计算机, 然后确认使用了正确的主机名。

25.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的参数。

25.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 并再次退出它就可以了。 一般来说试二次就可以了。

25.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)
    

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

25.7.2 设置SLIP服务器

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

25.7.2.1 前提条件

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

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

25.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 接口。

25.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 在记录什么, 以及这些内容将被记在哪里)。

25.7.2.3 内核配置

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

device   sl

  默认情况下, 您的 FreeBSD 计算机不会转发包。 如果您希望将 FreeBSD SLIP 服务器作为路由器使用, 就需要修改 /etc/rc.conf 文件, 并加入一项将 gateway_enable 变量设为 YES 的设制。

  接下来需要重新启动以便使新设置生效。

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

25.7.2.4 Sliplogin配置

  正如先前所提到的, /etc/sliphome目录有三个文件构成/usr/sbin/sliplogin的配置 (参考sliplogin的联机手册sliplogin(8)):slip.hosts, 定义SLIP用户及有关IP地址; slip.login, 一般只配置SLIP接口; 文件 slip.logout(可选的), 串行连接终止时, 撤消slip.login所做的修改。

25.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代理, 而是我们在本节用于介绍的术语)。 如果您不能确定选择何种方式或者如何分配地址, 请参考"前提条件"(第 25.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)来管理proxy-ARP在服务器ARP表中的项。

25.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将无法执行它。

25.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)。

25.7.2.5 路由考虑

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

25.7.2.5.1 静态路由

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

25.7.2.5.2 运行GateD®

注意: GateD现在是一个私有软件, 因而您无法得到其源代码 (在 GateD 上提供了进一步的详情)。 这一节内容主要是为了确保与仍在使用旧版软件的用户兼容而保留。

  另一种避免静态路由所造成的头疼的方法, 是在您的 FreeBSD SLIP 服务器上安装 GateD, 并配置它使用合适的路由协议 (RIP/OSPF/BGP/EGP) 来告诉其他路由器您的 SLIP 子网的存在。 您需要编写一个 /etc/gated.conf 文件来配置 GateD; 这里是 FreeBSD SLIP 服务器作者编写的一个例子:

#
# gated configuration file for dc.dsu.edu; for gated version 3.5alpha5
# Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface
#
#
# tracing options
#
traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ;

rip yes {
  interface sl noripout noripin ;
  interface ed ripin ripout version 1 ;
  traceoptions route ;
} ;

#
# Turn on a bunch of tracing info for the interface to the kernel:
kernel {
  traceoptions remnants request routes info interface ;
} ;

#
# Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP
#

export proto rip interface ed {
  proto direct {
      xxx.xxx.yy mask 255.255.252.0 metric 1; # SLIP connections
  } ;
} ;

#
# Accept routes from RIP via ed Ethernet interfaces

import proto rip interface ed {
  all ;
} ;

  上面这个 gated.conf 示例文件, 将把关于 SLIP 子网 xxx.xxx.yy 的信息, 通过 RIP 广播到 Ethernet 上; 如果您使用了的 Ethernet 驱动不是 ed, 则需要把 ed 改为相应的网络接口。 这个例子也配置了将跟踪信息写到 /var/tmp/gated.output 以提供调试 GateD 活动的信息; 当然, 如果 GateD 工作正常, 就可以关闭这些跟踪信息了。 您需要把 xxx.xxx.yy 改成您自己的 SLIP 子网 (一定要同时修改 proto direct 小节)。

  一旦在系统中安装并配置了 GateD, 就可以告诉 FreeBSD 启动脚本来运行 GateD 而不是 routed 了。 最简单的办法,是配置 routerrouter_flags 两个 /etc/rc.conf 变量。 请参见 GateD 的联机手册, 以了解更多关于命令行参数的信息。

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

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