第七章 串行线路IP
串行线路协议SLIP和PPP为资金缺乏者提供Internet连接。除了需要一个modem和一块配有FI
FO缓冲的串行板(卡)外,不再需要其它的硬件了。使用它并不比使用一个邮箱复杂,并且
不断增长的私人机构以可以接受的价格为大家提供拨号上网IP。
Linux有SLIP和PPP两种驱动程序。SLIP已存在相当长的时间了,并且工作的很稳定。PPP驱动
程序是由Michael Callahan and Al Longyear最近开发的。PPP将在下一章中讨论。
7.1 一般需求
要使用SLIP或PPP,你当然必须配置一些如前章所讨论的那些基本网络特性。起码,你必须设
置回送(loopback)接口,并且提供名字解析。当连接到Internet上时,你当然要用到DNS。
最方便的方法是将某个名字服务器的地址写入resolv.conf文件中;SLIP链接一旦被激活,就
会查询这个服务器。名字服务器离你拨入的地方越近越好。
然而,这个方法并不是最佳的,因为所有的名字查找仍然都要通过你的SLIP/PPP链接。如果
你担心这样做所耗费的带宽,你也可以设置一个只缓冲(caching-only)名字服务器。它并
不真的服务于一个域,而只是作为你的主机所产生的所有DNS查询的一个中继。这个方案的优
点在于它建立了一个缓冲,大多数的查询只需往串行线路上发送一次。一个只缓冲服务器的
named.boot文件看上去象这样:
; named.boot file for caching-only server
directory /var/named
primary 0.0.127.in-addr.arpa db.127.0.0 ; loopback net
cache . db.cache ; root servers
除了这个name.boot文件,你也还需要设置db.cache文件,其中含有有效根名字服务器的一张
列表。这些在解析器的配置一章中的最后讨论。
7.2 SLIP操作
拨号(上网)IP服务器通常使用特殊的用户帐号提供SLIP服务。在登陆进这样一个帐号以后
,你不会进入普通的shell程序;而是执行一个程序或shell脚本,激活串行线路的服务器SL
IP驱动程序并且配置适当的网络接口。然后你需要在链接的你这端做同样的工作。
在某些操作系统上,SLIP驱动程序是用户空间程序;在Linux下,它是内核的一部分,这使得
它更快一些。然而,这需要将串行线路明确地转换成SLIP模式。这是通过特殊的tty线路规程
,SLIPDISC,来做到的。当tty为普通线路规程(DISCO)时,它将使用普通的read(2)和wri
te(2)调用只与用户进程交换数据,而SLIP驱动程序不能从tty读取或写进数据。在SLIPDISC
规程里,规则正好相反:现在任何用户空间进程从tty的读取和写入被阻止,此时,从串行端
口来的所有数据将被直接地传递到SLIP驱动程序。
SLIP驱动程序本身可以识别SLIP协议的多种变化。除了普通的SLIP,它也能理解CSLIP,这在
输出的IP包上执行所谓的Van Jacobson头压缩。[1] 这显著地改进了交互式会话的吞吐量。
另外,对于这些协议的每一种有六比特的版本。
将串行线路转换为SLIP模式的一种简单方法是通过使用slattach工具。假设你的modem连在/
dev/cua3上,并且成功地登录上SLIP服务器。然后执行:
# slattach /dev/cua3 &
这将cua3的线路规程转换成SLIPDISC,并把它连接到SLIP网络接口之一。如果这是你的第一
次激活的SLIP链接,该线路将连至sl0;第二个将连至sl1,以此类推。目前的内核同时支持
多达八个SLIP链接。
Slattach所选择的缺省的压缩封装是CSLIP。你可以使用-p开关来选择任何其它的模式。要使
用常规的SLIP(无压缩的),可以使用
# slattach -p slip /dev/cua3 &
其它的模式有cslip、slip6、cslip6(SLIP的六比特版本)、以及适应性SLIP(adaptive S
LIP)的adaptive。后者让内核找出远端所用的是那一种SLIP压缩封装类型。
注意,你必须使用与你的对等点同样的压缩封装。例如,如果cowslip使用CSLIP,你也必须
使用它。如果选择不匹配,那么将会出现ping到远程主机将收不到任何返回信息包的现象。
如果其它的主机ping你,那么在你的控制台上也会出现象“不能建立ICMP头”(“Can’t b
uild ICMP header”)的信息。避免这些问题的一种方法是使用适应性SLIP。
实际上,slattach并不仅仅允许你使能SLIP,同样也可以激活串行线路的其它协议,如PPP或
KISS(另一个由无线电爱好者使用的协议)。详细信息,请参考slattach(8)再线手册。
在将线路转至SLIP驱动程序以后,你必须配置这个网络接口。再一次,我们使用标准的ifco
nfig和route命令来做这个配置。假设从vlager,我们拨号到一个名为cowslip的服务器。那
么你要执行
#ifconfig sl0 vlager pointopoint cowslip
# route add cowslip
# route add default gw cowslip
第一个命令将接口配置成到cowslip的点对点链接,而第二、第三个命令增加到cowslip的路
由以及使用cowslip作为一个缺省的网关。
当拆卸一个SLIP链接时,你首先必须使用带del选项的route命令移去所有通过cowslip的路由
,将接口关闭,并向slattch发送一个hangup信号。然后,你必须再次使用你的终端程序挂断
modem:
# route del default
# route del cowslip
# ifconfig sl0 down
# kill -HUP 516
7.3 使用dip
现在来看,上面讲的是非常简单的。然而,你也许想使上面的步骤自动地执行,这样你就可
以只调用一个简单的命令来执行上面给出的所有步骤了。这也就是dip所要做的。[2] 在写作
这本手册时它的当前发行版本是3.3.7。它已被许多人大大地修改过了,所以它已不再是原来
的dip程序了。这些不同的开发变化有希望在今后的版本中合并。
Dip为简单的脚本语言提供了一个解释器,它能为你处理modem,将线路转变为SLIP模式,并
配置接口。这是非常基本的和有局限性的,但对于大多数情况已足够有效了。某天一个新的
dip版本将能适用于更为广泛的语言。
为了配置SLIP接口,dip需要root权限。现在可以临时使用dip将uid置为root,因此所有的用
户能够拨号到某个SLIP服务器而不需要给这些用户root权限。这是非常危险的,因为用dip设
置假的接口和默认路由可能会严重地破坏网络的路由。更糟的是,这将给你的用户连接到任
何SLIP服务器的能力,并在你的网络上带来危险的攻击。所以如果你想允许你的用户建立一
个SLIP连接,就为每个期望的SLIP服务器写一个小的包装程序,并且让这些包装程序调用包
括建立连接用的特定脚本的dip。那么,这些程序就可以安全地置成root的uid。[3]
7.3.1 一个简单的脚本程序
图7.1列出了一个简单的脚本程序。通过用脚本程序的名字作为参数调用dip,它可以用于连
接cowslip:
# dip cowslip.dip
DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
Written by Fred N. van Kempen, MicroWalt Corporation.
connected to cowslip.moo.com with addr 193.174.7.129
#
当激活了SLIP并连接到cowslip以后,dip将从终端上脱开并运行于后台。此时你就可以在SL
IP连接上使用通常的网络服务了。要想终止连接,只需用-k选项调用dip。这使用/etc/dip.
pid [4]中记录的进程id dip给dip进程发送了一个挂断信号:
# kill ?k
在dip的脚本语言中,前加美元符号的关键字表示变量名。Dip有一个预定义的变量集,将在
下面列出。例如,$remote和$local含有与SLIP连接有关的本地以及远程主机的主机名。
# Sample dip script for dialing up cowslip
# Set local and remote name and address
get $local vlager
get $remote cowslip
port cua3 # choose a serial port
speed 38400 # set speed to max
modem HAYES # set modem type
reset # reset modem and tty
flush # flush out modem response
# Prepare for dialing.
send ATQ0V1E1X1\r
wait OK 2
if $errlvl != 0 goto error
dial 41988
if $errlvl != 0 goto error
wait CONNECT 60
if $errlvl != 0 goto error
# Okay, we"re connected now
sleep 3
send \r\n\r\n
wait ogin: 10
if $errlvl != 0 goto error
send Svlager\n
wait ssword: 5
if $errlvl != 0 goto error
send hey-jude\n
wait running 30
if $errlvl != 0 goto error
# We have logged in, and the remote side is firing up SLIP.
print Connected to $remote with address $rmtip
default # Make this link our default route
mode SLIP # We go to SLIP mode, too
# fall through in case of error
error:
print SLIP to $remote failed.
图7.1 一个dip脚本样本
样本脚本程序中的头两句是get命令,这是dip设置变量的方法。这里,本地和远程主机名分
别设置成了vlager和cowslip。
接下来的五句用来设置终端线路和modem。Reset向modem发送了一个复位串;对于Hayes兼容
的modem,这是个ATZ命令。下一个语句刷出modem的响应,以使得接下来的几行中的登录会话
能够正常的工作。这个对话是非常直观的:它简单地拨出cowslip的号码41988,并且使用口
令hey-jude登录进Svlager帐号