21.7. 使用SLIP

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

21.7.1. 设置SLIP客户端

下面是一个在静态主机网络上设置FreeBSD机器的方法.对于动态主机名分配(您的地址在每次拨号时都会改变), 您可能还需要更复杂的设置.

首先,确定您的modem连接的串行口. 许多人会设置符号连接, 比如/dev/modem指向真实的设备名 /dev/cuaaN.这充许您抽像真实的设备名. 当您需 要在/etc.kermrc文件中修复整个系统上的许多文件时, 这是一件非常麻烦的事情!

Note: /dev/cuaa0 is COM1, cuaa1 is COM2, etc.

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

pseudo-device   sl      1

在 FreeBSD 5.X 中, 则应使用:

device   sl

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

21.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. 在FreeBSD5.0以前的版本中,请确保/etc/host.conf绑定hosts必须是存在的.从FreeBSD 5.0开始,系统开始改用 文件/etc/nsswitch.conf, hosts行的dns选项之前必须有files选项. 缺少这些可能会发生很滑稽的事.

  3. 编辑/etc/rc.conf.

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

      hostname="myname.my.domain"
      

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

    2. 改变以下这些行将sl0添加到网络接口 列表中:

      network_interfaces="lo0"
      

      改为:

      network_interfaces="lo0 sl0"
      
    3. 加入以下这一行设置sl0的启动标志:

      ifconfig_sl0="inet ${hostname} slip-gateway netmask 0xffffff00 up"
      
    4. 改变这一行以指明默认的路由:

      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. 重启计算机,然后确认使用了正确的主机名.

21.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进行连接.

    Note: 将密码以纯文本的形式存放在文件系统无论如何都是个 主意. Do it at your own risk.

  2. 退出kermit(您可以用 Ctrl-z将其挂起),以root用户键入:

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

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

21.7.1.3. 关闭连接

按下面的步骤做:

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

kill slattach. 切记您一定要是 root用户才有权限. 然后回到kermit(如果想将其挂起,执行命令fg)再从中退出(q).

slattach的联机手册说必须用ifconfig sl0 down 将这个接口标记为关闭,但对我来说,这似乎没有任何区别. (ifconfig sl0仍报告一样的东西.)

有时候,您的modem会拒绝退出 (我的时常这样).遇到这种情况,您只要启动kermit然后再次退出.一般在试二次就可以了.

21.7.1.4. 问题解答

如果不行,尽管来问我.一般可以这样解决问题:

  • 执行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时得到一条``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)
    

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

21.7.2. 设置SLIP服务器

本文提供了在FreeBSD上设置SLIP服务的建议,主要是指配置您的系统使其能根据远程SLIP客户端的 登录自动地开启连接.

21.7.2.1. 前提条件

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

另外还假定您已经设置好了您的modem并配置了相应的文件允许通过modem登录. 如果您还没有准备好您的系统,请 参考拨号服务的配置指南; 如果您能使用网页浏览器,也可以浏览 http://www.FreeBSD.org/docs.html上的指南列表. 您还需要参考sio(4)以获取串行端口设备驱动的信息, ttys(5),gettytab(5), getty(8), & init(8)以获取配置系统以接受modem登录的 相关信息,也许还有 stty(1)以获取有关串行口参数设置的信息(比如clocal指直线串行 接口).

21.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接口.

21.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.loginsliplogin )绑定的接口(在上面的例子中,是slip.login参数列表的第一个参数)运行 ifconfig以设置SLIP接口的本地IP地址(dc-slip),远程IP地址(sl-helmer), 掩码(0xfffffc00),及其它附加的标志(autocomp). 如果出现错误 ,sliplogin 通常会使用syslog守护进程将有用的信息写入 /var/log/messages 参考syslogd(8)syslog.conf(5)联机手册及/etc/syslog.conf, 以获知syslogd是如何工作的).

好了,让我们开始设置系统 .

21.7.2.3. 内核配置

FreeBSD默认的内核一般定义了两个SLIP接口:(sl0sl1); 您可以使用 netstat -i命令查看您的内核是否定义了这些接口.

netstat -i样例输出:

Name  Mtu   Network     Address            Ipkts Ierrs    Opkts Oerrs  Coll
ed0   1500  <Link>0.0.c0.2c.5f.4a         291311     0   174209     0   133
ed0   1500  138.247.224 ivory             291311     0   174209     0   133
lo0   65535 <Link>                            79     0       79     0     0
lo0   65535 loop        localhost             79     0       79     0     0
sl0*  296   <Link>                             0     0        0     0     0
sl1*  296   <Link>                             0     0        0     0     0

netstat -i显示的sl0 sl1接口表明您的内核内建了两个SLIP接口. ( sl0sl1 之后的星号表明 这两个接口是“关闭”的.)

然而,FreeBSD默认的内核并没有配置额外的包 (默认的,您的FreeBSD不会被作为一个路由器) 因为Internet RFC对Internet主机有特殊要求(参考 RFCs 1009 [Requirements for Internet Gateways], 1122 [Requirements for Internet Hosts -- Communication Layers], 还有 1127 [A Perspective on the Host Requirements RFCs]). 如果您想让FreeBSD SLIP服务器成为一个路由器,就必须编辑 /etc/rc.conf,将gateway_enable变量设为YES.

然后您要重新启动使新的设置生效.

您会发现靠近默认内核配置文件(/sys/i386/conf/GENERIC)的最后, 有这么一行:

pseudo-device sl 2

这一行定义内核中可用的SLIP设备个数;行末尾的数字表示同时进行操作的SLIP连接的最大个数.

请参考Chapter 8FreeBSD内核配置这一章以获取配置内核的帮助.

21.7.2.4. Sliplogin配置

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

21.7.2.4.1. slip.hosts Configuration

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

  • SLIP用户的登录ID

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

  • SLIP连接的远程地址

  • 网络掩网

本地和远程地址可以是主机名 (通过文件/etc/hosts或者域名服务解析为IP地址, 在FreeBSD 5.X上这取决于文件/etc/nsswitch.conf的设置 在FreeBSD 4.X里,则是/etc/host.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代理,而是我们在本节用于介绍的术语). 如果您不能确定选择何种方式或者如何分配地址,请参考"前提条件"(Section 21.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表中的项.

21.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) 的联机手册以获取完整的使用方法.

Note: 创建 /etc/sliphome/slip.login/etc/sliphome/slip.logout时,一定要设置 “执行(execute)”位 (chmod 755 /etc/sliphome/slip.login /etc/sliphome/slip.logout) ,否则 sliplogin将无法执行它.

21.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

If you are using “proxy ARP”, you will want to have /etc/sliphome/slip.logout remove the ARP entry for the SLIP client:

#!/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 删除slip.login在SLIP客户登录时添加的ARP项 .

再次强调:确保您创建/etc/sliphome/slip.logout时设置了执行位 (ie, chmod 755 /etc/sliphome/slip.logout).

21.7.2.5. 路由考虑

如果您不使用“ARP代理”的 方式来路由SLIP客户端与网络的其余部分(可能是Internet)之间的数据包, 您就必须通过SLIP服务器向最近的默认路由器添加静态路由以路由您的SLIP客户子网.

21.7.2.5.1. 静态路由

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

21.7.2.5.2. 运行GateD®

Note: GateD®现在是一个私有软件,无法取得它的源代码 ( GateD上有更多的信息 ).This section only exists to ensure backwards compatibility for those that are still using an older version.

为了避免静态路由使您头疼,您可以在FreeBSD SLIP服务器上安装 GateD ,然后配置它使用合适的路由协议 (RIP/OSPF/BGP/EGP)以告知其它路由器有关SLIP子网的信息. 您需要编写一个名为 /etc/gated.conf 文件来配置您的gated;这里有一个样例,与作者所使用的相同:

#
# 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 文件 通过RIP向以太网广播有关SLIP子网的信息xxx.xxx.yy; 如果您使用的以太网驱动与ed不同 您需要将ed改成合适的接口. 这个示例文件也设置了将跟踪信息写入/var/tmp/gated.output 以诊断GateD的活动;如果GateD工作正常, 您当然也可以关闭跟踪选项.要把xxx.xxx.yy 改成实际的SLIP子网网络地址 (确保同时更改了 proto direct中的掩码 ).

一旦您在系统上安装并配置了 GateD,您需要告知 FreeBSDGateD的启动脚本以代替 routed. 最古老的做法是在/etc/rc.conf中设置 router router_flags变量. 参考 GateD的联机手册以获得有关命令行参数的信息.