第16章 PPP和SLIP
16.1 概要
FreeBSD有很多方法可以将计算机与计算机连接起来。通过一个拨号modem来建立一个网络或Internet连接,或允许其他人与你连接,要求使用PPP或SLIP。这章描述了设置这些基于modem的通信服务的细节情况。
读完这章,你将了解这些:
如何设置用户级PPP。
如何设置内核级PPP。
如何设置PPPoE(PPP over Ethernet)。
如何设置PPPoA(PPP over ATM)。
如何配置和安装一个SLIP客户端和服务器。
在阅读这章之前,你应当:
熟悉基本的网络术语。
理解拨号连接和PPP ,SLIP的基础知识。
你可能想知道在用户级PPP和 内核级PPP之间有什么主要的不同。回答很简单:用户级PPP处理用户水平的输入输出数据,而不是在内核水平。在内核与用户之间拷贝数据,花费可能要昂贵一些,但它允许提供更多特性的PPP执行机制。用户级PPP使用tun设备与外部世界联系,而内核级PPP使用PPP设备。
注意:在这一章中,用户级PPP将简单地作为PPP,除非特别需要区别它与其他PPP软件如Pppd的不同。另外,在这章所解释的所有命令都需要在root下执行。
16.2 使用用户级PPP
16.2.1 用户级PPP
假设
这篇文档假设你具备下面这些条件:
你有一个ISP提供的用于连接使用PPP的帐号。
另外,你有一个modem或其他连接到你的系统并正确配置好的设备,允许你连接到你的ISP。
你ISP的拨号号码。
你的登陆名称和口令(可能是一个规则的UNIX风格的登陆和口令对,也可能是PAP 或CHAP登陆和口令对)。
一个或几个域名服务器的IP地址。通常,你将会从ISP那儿得到两个IP地址。如果他们至少给你一个,那你就可以在你的ppp.conf文件中启用dns命令来告诉ppp设置域名服务器。这个特性依赖与你的ISP的支持DNS交换的PPP执行机制。
下面的信息是由你的ISP提供的,但不是必需的:
你ISP的网关地址。网关是你要连接和被设置成默认路由的机器。如果你没有这个信息,那在我们连接时你的ISP的PPP服务器会自动告诉你正确的值。
这个IP号码被ppp作为HISADDR。
你需要的子网掩码。如果你的ISP不提供给你,你可以使用255.255.255.255。
如果你的ISP提供给你一个静态的IP地址和主机名,你可以键入它。否则,可以由ISP来动态指定。
如果你不知道这些信息,请与你的ISP联系。
注意:在这节中,所有例子显示的配置文件信息都通过行来编号。这些编号只是为了在解释和讨论时变得更方便,而并不意味着实际存在着这些号码。适当地用tab键和space键来进行缩排也是必要的。
准备内核
正如前面提到的,ppp使用tun设备。如果这个设备没有被编译进内核,ppp将要求把它作为一个模块来加载。Tunnel驱动是动态的,所以设备的任何号码都可以被创建(你不应当仅限于内核配置的值)。
注意:应当指出的是tunnel驱动按要求创建设备,所以ifconfig –a将不会显示任何tun设备。
检查tun设备
通常情况下,绝大所数用户将只使用一个tun设备(/dev/tun0)。参考下面的tun0,可以把tunN中的N用你系统中适合的号码来替换。
对于没有启用DEVFS的FreeBSD,应当先检查一下是否存在tun0设备。
最简单的方法是重新编译设备。要重新编译设备,可以这样做:
# cd /dev
# sh MAKEDEV tun0
如果你需要在内核中有16个tunnel设备,你必须创建它们。这可以通过执行下面的命令来完成:
# cd /dev
# sh MAKEDEV tun15
命名最终的配置
检查系统中IP地址与主机名的匹配情况,反之亦然。它可以被配置成寻找描述IP分布的主机地图。第一个是一个叫做/etc/hosts的文件。看看host的联机手册了解更多信息。第二个是Internet域名服务(DNS)。有关DNS和DNS服务的信息,请参考第17.9节。
最后是用来执行名称映射的系统呼叫的设置,但你必须告诉它哪儿可以找到信息。对于FreeBSD 5.0以前的版本,可以通过编辑/etc/host.conf文件来完成。FreeBSD 5.0则使用/etc/nsswitch.conf文件。
编辑/etc/host.conf
对于FreeBSD 5.0以前的版本,这个文件包含了下面两行:
hosts
bind
这个要求你先看文件/etc/hosts,如果名字找不到,可以参考DNS。
编辑/etc/nsswitch.conf
对于FreeBSD 5.0或以后的版本,这个文件将包含至少下面几行:
hosts: files,dns
这个要求你先看文件/etc/hosts,如果名字找不到,可以参考DNS。
编辑/etc/hosts
这个文件可能包含了在你本地网络中其他机器的IP地址和名称。它也会包含将要运行PPP的机器的记录。假设你的机器叫做foo.bar.com,IP地址是10.0.0.1,/etc/hosts应当包括:
127.0.0.1 localhost.bar.com localhost
::1 localhost.bar.com localhost
10.0.0.1 foo.bar.com foo
上面的两行定义了别名localhost作为当前的机器。不管你是否拥有自己的IP地址,这些行的IP地址将总是127.0.0.1 和 ::1。最后一行把域名foo.bar.com映射成IP地址10.0.0.1。
注意:127.0.0.1和 localhost就是指本地机器。
如果你的ISP分配给你一个静态的IP地址和域名,你不需要使用它来作为主机名,也不需要把它添加到/etc/hosts中。
编辑/etc/resolv.conf
/etc/resolv.conf文件告诉你如何做。通常,你需要键入下面几行:
domain bar.com
nameserver x.x.x.x
nameserver y.y.y.y
x.x.x.x 和 y.y.y.y地址是由你的ISP提供的。nameserver行作为你的ISP提供商。Domain行被设置成你的主机域名。参考resolv.conf的联机手册了解更多细节。
如果你正在运行一个本地的域名服务器,替换掉nameserver行:
nameserver 0.0.0.0
enable dns命令(在/etc/ppp/ppp.conf文件键入——看下面)将告诉PPP请求你的ISP确认nameserver的值。如果你的ISP提供了不同的地址(或如果在/etc/resolv.conf文件中没有nameserver行),PPP将用ISP提供的值来改写文件。
PPP 配置
PPP和Pppd都使用/etc/ppp目录中的配置文件。用户级PPP的例子可以在/usr/share/examples/ppp/中找到。
配置PPP要求根据你的需要编辑几个文件。你是否需要把它们放进去取决于你的ISP是否静态或动态地分配给你IP地址。
PPP 和静态IP地址
你将需要编辑/etc/ppp/ppp.conf配置文件。它看起来象下面这个例子:
1 default:
2 set log Phase Chat LCP IPCP CCP tun command
3 ident user-PPP VERSION (built COMPILATIONDATE)
4 set device /dev/cuaa0
5 set speed 115200
6 set dial “ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
7 \”\” AT OK-AT-OK ATE1Q0 OK \\dATDT\\TTIMEOUT 40 CONNECT”
8 set timeout 180
9 enable dns
10
11 provider:
12 set phone “(123) 456 7890”
13 set authname foo
14 set authkey bar
15 set login “TIMEOUT 10 \”\” \”\” gin:--gin: \\U word: \\P col: PPP”
16 set timeout 300
17 set ifaddr x.x.x.x y.y.y.y 255.255.255.255 0.0.0.0
18 add default HISADDR
行1:
指定默认的记录。当PPP运行时,这个记录中的命令将自动执行。
行2:
启用登陆参数。当配置完成时,为了避免产生过多的日志文件,这行将简化为:
set log phase tun
行3:
告诉PPP如何确定自己的同类。如果在分配和设置连接时出现问题,提供一些同类管理员的信息是很有用的。
行4:
指定modem将连接哪个端口。COM1是/dev/cuaa0,COM2是/dev/cuaa1。
行5:
设置你连接的速度。如果115200不行,试试38400。
行6 & 7:
拨号命令。用户级PPP使用一个与chat程序相似的语法。请参考联机手册了解这个语法的相关信息。
注意这个命令为了可读性的需要会在下一行继续。如果这行的最后一个字符是“\”,在ppp.conf中的任何命令都可以这样做。
行8:
设置连接的时间间隔。180秒是默认的。
行9:
告诉PPP要求同类确认本地的设置。如果你运行本地的域名服务器,这将被删除。
行10:
为了可读性的需要设置一个空行。空行可以被PPP略过。
行11:
为一个叫做provider的供应商指定一个记录。
行12:
设置你提供商的电话号码。多个电话号码可以使用冒号(:)或管道符号(|)作为间隔。两个字符之间的区别在ppp的联机手册中有描述。总的来讲,如果你要循环使用这些号码,可以使用冒号。如果你想使用第一个号码,当第一个号码失败了再用第二个号码,就使用管道字符。总是引用电话号码的记录设置。
行13 & 14:
指定用户名和口令。当使用一个UNIX风格的登陆命令时,这些值可以通过set login命令来参考使用\U和\P变量。当使用PAP或CHAP进行连接时,这些值在认证时会被使用。
行15:
如果你正在使用PAP或CHAP,在这点上将没有登陆,这行将被注释掉或删掉。登陆命令是chat类型的命令,在这个例子中,是这样的:
J. Random Provider
login: foo
password: bar
protocol: PPP
你将需要改变这个脚本以适合你自己的需要。当你第一次写这个脚本时,应当确保在你登陆时已经启用了chat。
行16:
设置默认的连接时间。这儿,连接在300秒内无响应将被断开。如果你不想设置成超时,将这个值设置成0,或在命令行使用-ddial。
行17:
设置接口地址。字符x.x.x.x将被你的ISP提供给你的IP地址所替换。字符y.y.y.y将被你ISP指定的IP地址替换作为他们的网关。如果你的ISP没有给你一个网关地址,可以使用10.0.0.2/0。如果你需要使用一个“guessed”地址,确信你在/etc/ppp/ppp.linkup中创建了一个记录。如果这行被省略,ppp就不能运行在-auto模式。
行18:
从你的ISP网关添加一个默认的路由。HISADDR这个特殊字被第9行的网关地址所替换。这行出现在第9行是很重要的,否则HISADDR将不会被初始化。
如果你不希望用-auto运行PPP,这行将被移到ppp.linkup文件。
当你有一个静态IP地址并且用-auto模式运行ppp的时候,不需要添加一个记录到ppp.linkup。你可以在连接以后创建一个记录来调用程序。这在以后的sendmail的例子中会解释。配置文件的例子可以在/usr/share/examples/ppp/目录中找到。
PPP和动态IP地址
如果你的ISP不给你指定静态的IP地址,PPP可以自动分配本地和远程的地址。这可以在连接之后通过“guessing”一个IP地址然后允许PPP使用IP配置协议(IPCP)来正确设置。ppp.conf配置是与静态配置IP地址一样的,看下面:
17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255
另外,不包括行数字,它只是一个参考。至少缩排一个空格是必要的。
行17:
/字符后的号码是PPP要求的地址位号码。你可以根据需要使用IP号码,但上面 的例子也可以工作。
最后的参数(0.0.0.0)告诉PPP使用0.0.0.0地址而不是使用10.0.0.1地址,是一些ISP必需的。不要使用0.0.0.0作为set ifaddr的首选,同样的它可以阻止PPP在-auto模式设置一个最初的路由。
如果你不运行-auto模式,需要在/etc/ppp/ppp.linkup中创建一个记录。连接建立之后,ppp.linkup被启用。基于这点,PPP将指派接口地址,它现在可以添加路由表记录:
1 provider:
2 add default HISADDR
行1:
在建立一个连接时,PPP将在ppp.linkup中根据下面的值寻找一个记录:第一,正如我们在ppp.conf中使用的设法建立一个相配的标签。如果它失败了,寻找一个作为我们网关的IP地址。这个记录是一个四个八字节的IP风格的标签。如果我们仍没有找到记录,可以寻找MYADDR记录。
行2:
这行告诉PPP添加一个默认的指给HISADDR的路由。HISADDR将用网关的IP号码来替换。
接收呼入指令
当你配置来接收连接在局域网上的一台机器的输入调用时,你必须决定你是否要把数据包转给LAN。如果你这样做,你必须为你的LAN子网每一个分配一个IP号码,在你的/etc/ppp/ppp.conf文件中使用命令启用proxy。你必须检查在/etc/rc.conf文件中包含有下面这行:
gateway_enable=“YES”
哪个getty?
配置FreeBSD的拨号服务一节提供了一个有关使用getty来启用拨号服务的描述。
另外,还有一个叫mgetty的,它是getty的一个智能版本。使用的优势是它可以与modem进行talks,意思是如果在/etc/ttys中的端口被关闭,那你的modem将不能回电话。
Mgetty的最新版本已经支持自动检测PPP数据流,允许你的客户端不需要写任何脚本就可以访问服务器。参考Mgetty和AutoPPP的联机手册了解更多信息。
PPP权限
ppp命令通常必须使用root来运行。就像下面描述的一样,通过执行ppp,如果你愿意让一个普通用户,将ppp运行在服务器模式,那必须在/etc/group中把它们添加进network组,从而获得运行PPP的权限。
你也必须让他们能使用allow命令访问配置文件的一个或多个部分:
allow users fred mary
如果这个命令被使用在默认的部分中,它可以让指定的用户访问任何东西。
动态IP用户的PPP Shell
创建一个包含下面各行的叫做/etc/ppp/ppp-shell的文件:
#!/bin/sh
IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'`
CALLEDAS=“$IDENT”
TTY=`tty`
if [ x$IDENT = xdialup ]; then
IDENT=`basename $TTY`
fi
echo “PPP for $CALLEDAS on $TTY”
echo “Starting PPP for $IDENT”
exec /usr/sbin/ppp -direct $IDENT
这个脚本将被执行。现在使用下面的命令创建一个连接到这个脚本的叫做PPP-dialup的标记:
# ln -s PPP-shell /etc/ppp/ppp-dialup
你将可以为你的所有拨号用户使用这个脚本作为shell。这儿是一个来自/etc/password的使用pchilds用户名的拨号PPP用户的例子。
pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup
创建一个包含下面0 byte文件的叫/home/ppp的目录,这可以阻止/etc/motd被显示出来:
-r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin
-r--r--r-- 1 root wheel 0 May 27 02:22 .rhosts
静态IP用户的PPP Shells
像上面一样创建PPP-shell文件,为每个拥有静态IP地址的帐户创建一个连接到PPP-shell的标记。
例如,如果有三个拨号用户:fred,sam和mary,你可以路由C类网络,你需要键入下面这些行:
# ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred
# ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam
# ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-mary
这些用户的每个拨号帐户将把他们的shell连接到上面创建的连接标记上。(例如,mary的shell将是/etc/ppp/ppp-mary)
为动态IP用户设置ppp.conf
/etc/ppp/ppp.conf文件包含下面这些行:
default:
set debug phase lcp chat
set timeout 0
ttyd0:
set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255
enable proxy
ttyd1:
set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255
enable proxy
注意:必要的缩进是重要的。
为静态IP用户设置ppp.conf
根据上面/usr/share/examples/ppp/ppp.conf文件的内容,你必须为每个静态拨号用户添加一部分。我们继续以fred,sam和mary为例。
fred:
set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255
sam:
set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255
mary:
set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255
如果必要的话,/etc/ppp/ppp.linkup文件将包含每个静态IP用户的路由信息。下面的行将通过客户端的PPP连接为203.14.101.0这样的C类地址添加一个路由。
fred:
add 203.14.101.0 netmask 255.255.255.0 HISADDR
sam:
add 203.14.102.0 netmask 255.255.255.0 HISADDR
mary:
add 203.14.103.0 netmask 255.255.255.0 HISADDR
更多有关mgetty,AutoPPP和MS Extensions的知识
mgetty 和AutoPPP
通过启用AUTO_PPP选项来配置和编译mgetty可以允许mgetty检测到PPP连接的LCP状态,然后自动产生一个PPP shell。然而,如果默认的login/password顺序没有出现,那就必须使用PAP 或CHAP来验证用户。
这节假设用户已经用AUTO_PPP选项成功地配置,编译和安装了mgetyy(v0.99beta或更高的版本)。
确信你的/usr/local/etc/mgetty+sendfax/login.config文件包含下面这行:
/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
这将告诉mgetty运行PPP-pap-dialup脚本来检测PPP连接。
创建一个叫做/etc/ppp/ppp-pap-dialup的文件包含下面这行:
#!/bin/sh
exec /usr/sbin/ppp -direct pap$IDENT
在/etc/ttys中启用每个拨号行,在/etc/ppp/ppp.conf中创建一个相应的记录。这将和上面创建的定义一起存在。
pap:
enable pap
set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
enable proxy
每个用这个方法登陆的用户将必须在/etc/ppp/ppp.secret文件中有一个username/password,或者在/etc/password文件中添加下面这行来验证用户。
enable passwdauth
如果你希望为一些用户分配一个静态IP地址,你可以在/etc/ppp/ppp.secret中指定一个号码作为第三个选择。看看/usr/share/examples/ppp/ppp.secret.sample中的例子。
MS Extensions
可以按要求来配置PPP以提供DNS和NetBIOS域名服务地址。要启用这些PPP 1.x版的扩展,需要把下面这些行添加到/etc/ppp/ppp.conf的相关行。
enable msext
set ns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5
对于PPP 第2版或以后的版本:
accept dns
set dns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5
这将告诉客户端主和副域名服务器的地址和一个NetBIOS域名服务的主机。在第2版或以后的版本中,如果set dns行被忽略,PPP将使用在/etc/resolv.conf中找到的值。
PAP和CHAP验证
一些ISP把它们的系统设置成使用PAP或CHAP验证机制。你的ISP将不会给出一个登陆:你连接时出现的命令行,但将立刻启用对话PPP。
PAP比CHAP的安全性要差一点,但安全并不仅仅指这儿的口令,PAP使用纯文本的方式来发送,而且只通过串行线传送。对于crackers来说想“偷听”没有任何机会。
参考PPP和静态IP地址或PPP和动态IP地址章节,需要做下面的修改:
7 set login
...
12 set authname MyUserName
13 set authkey MyPassword
行7:
如果你使用PAP或CHAP,你的ISP通常不要求你登陆进服务器。你必须因此禁用你的“set login”字符。
行12:
这行指定了你的PAP/CHAP用户名。你必须为MyUserName输入正确的值。
行13:
这行指定了你的PAP/CHAP口令。你将必须为MyPassword输入正确的值。你也需要添加下面一行:
15 accept PAP
或
15 accept CHAP
选择你的PPP设置
可以和ppp程序进行交谈,而它却是运行在后台,但只有在一个合适的端口被设置好后。你需要这样做,添加下面一行到配置文件:
set server /var/run/ppp-tun%d DiagnosticPassword 0177
这将告诉PPP侦听指定的UNIX域的套接字,允许访问前要求客户端给出指定的口令。在名称中的%d可以被使用中的tun设备的号码代替。
一旦一个套接字被设置完成,pppctl程序可以被用在脚本中以便可以熟练地操作运行着的程序。
最后系统设置
你现在可以用ppp配置,但在你准备开始前,有几个重要的事情需要做。它们包括编辑/etc/rc.conf文件。确信设置了hostname=行:
hostname=“foo.bar.com”
如果你的ISP给你提供了一个静态IP地址和域名,最好使用这个名称作为你的主机名。寻找可用的网络接口。如果你要配置你的系统来拨号进入ISP,确信tun0设备被添加到列表中,否则删除它。
network_interfaces=“lo0 tun0” ifconfig_tun0=
注意:ifconfig_tun0变量应当是空的,另外必须创建一个叫做/etc/start_if.tun0的文件。这个文件包含下面这行:
ppp -auto mysystem
这个脚本在配置网络的时候被执行,用自动模式来启动你的PPP守护程序。如果你有一个LAN而这个机器充当一个网关,你可能也希望使用-alias。参考相关联机手册了解更多细节。
用下面一行在你的/etc/rc.conf文件中设置路由程序为NO:
router_enable=“NO”
路由守护程序没有启动,这点很重要(默认是启动的),因为路由会删除由PPP创建的默认路由表记录。
要保证sendmail_flags行不包括-q选项,否则sendmail将每次对网络作一次查询,这样可能会让你的机器拨不上号。你可以这样试试:
sendmail_flags=“-bd”
另外,当通过键入下面这行启用PPP连接时,你必须迫使sendmail重新检查邮件的队列:
# /usr/sbin/sendmail -q
你可以在ppp.linkup中使用!bg命令来自动让它这样做:
1. provider:
2. delete ALL
3. add 0 0 HISADDR
4. !bg sendmail -bd -q30m
如果你不这样,可能要设置“dfilter”给块SMTP传输。参考相关文件了解更多细节。现在,唯一要做的是重新启动计算机。启动完计算机之后,你可以键入:
# ppp
然后,dial provider来启动PPP会话,或者,如果你要ppp自动建立服务,需要键入:
# ppp -auto provider
摘要
要点,当第一次设置PPP时,下面几步是必须的:
客户端:
1. 确保tun设备被编译进内核。
2. 确保tunX设备文件在/dev目录中可用。
3. 在/etc/ppp/ppp.conf中创建一个记录。pmdemand的例子应当满足于绝大多数ISP。
4. 如果你有一个动态的IP地址,在/etc/ppp/ppp.linkup中创建一个记录。
5. 升级你的/etc/rc.conf文件。
6. 如果你需要拨号,创建一个start_if.tun0脚本。
服务器端:
1. 确保tun设备被编译进内核。
2. 确保tunX设备文件在/dev目录中可用。
3. 在/etc/passwd中创建一个记录(使用vipw程序)。
4. 在这个用户的主目录(home)创建一个运行ppp -direct direct-server或相似的命令。
5. 在/etc/ppp/ppp.conf中创建一个记录。direct-server例子很合适。
6. 在/etc/ppp/ppp.linkup中创建一个记录。
7. 升级你的/etc/rc.conf文件。
16.3 使用内核级PPP
16.3.1 设置内核级PPP
在你开始设置PPP之前,需要确信pppd已经被定位在/usr/sbin中,而且/etc/ppp目录存在。
pppd工作在两种模式中:
1. 作为一个客户端——你要通过PPP串行连接或modem线把你的机器连接到互联网上。
2. 作为一个服务器——你的机器被定位在网络上,使用PPP来连接到其他计算机。
在两种情况下,你将必须设定一个选项文件。(/etc/ppp/options 或 ~/.ppprc)。
你也需要一些modem/serial软件,以便你可以拨号和建立与远程主机的连接。
16.3.2 使用pppd作为客户端
下面的/etc/ppp/options可以被用来连接到CISCO的终端服务器PPP线。
crtscts # enable hardware flow control
modem # modem control line
noIPdefault # remote PPP server must supply your IP address.
# if the remote host doesn't send your IP during IPCP
# negotiation , remove this option
passive # wait for LCP packets
domain ppp.foo.com # put your domain name here
:<remote_ip> # put the IP of remote PPP host here
# it will be used to route packets via PPP link
# if you didn't specified the noIPdefault option
# change this line to <local_ip>:<remote_ip>
defaultroute # put this if you want that PPP server will be your
# default router
要连接:
1. 使用kermit拨号到远程主机,键入用户名和口令。
2. 退出kermit。
3. 键入下面这行:
# /usr/src/usr.sbin/pppd.new/pppd /dev/tty01 19200
确信使用了适当的速度和设备名称。
现在你的计算机可以用PPP连接了。如果连接失败,你可以在/etc/ppp/options文件中添加debug选项,在控制台检查信息以跟踪问题。
使用下面的/etc/ppp/pppup脚本,所有的3步操作将自动完成:
#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.dial
ppp0d /dev/tty01 19200
/etc/ppp/kermit.dial是一个用来拨号和在远程主机上做必要验证的kermit脚本,使用下面的/etc/ppp/pppdown脚本来断开PPP连接线:
#!/bin/sh
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ X${pid} != “X” ] ; then
echo 'killing pppd, PID=' ${pid}
kill -TERM ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
/sbin/ifconfig ppp0 down
/sbin/ifconfig ppp 0 delete
kermit -y /etc/ppp/kermit.hup
/etc/ppp/ppptest
通过执行/usr/etc/ppp/ppptest,看看PPP是否仍在运行:
#!/bin/sh
pid=`ps ax| grep pppd |grep -v grep|awk '{print $1;}'`
if [ X${pid} != “X” ] ; then
echo 'Pppd running: PID=' ${pid-NONE}
else
echo 'No pppd running.'
fi
set -x
netstat -n -I ppp0
ifconfig ppp0
要挂起modem,执行/etc/ppp/kermit.hup:
set line /dev/tty01 ; put your modem device here
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
pau 1
out +++
inp 5 OK
out ATH0\13
echo \13
exit
这儿是一个使用chat代替kermit的交替方法。
下面两行是完成一个pppd连接:
/etc/ppp/options:
/dev/cuaa1 115200
crtscts # enable hardware flow control
modem # modem control line
connect “/usr/bin/chat -f /etc/ppp/login.chat.scrIPt”
noIPdefault # remote PPP serve must supply your IP address.
# if the remote host doesn't send your IP during
# IPCP negotiation, remove this option
passive # wait for LCP packets
domain <your.domain> # put your domain name here
: # put the IP of remote PPP host here
# it will be used to route packets via PPP link
# if you didn't specified the noIPdefault option
# change this line to <local_ip>:<remote_ip>
defaultroute # put this if you want that PPP server will be
# your default router
/etc/ppp/login.chat.script:
注意:下面将继续在一个单一的行上。
ABORT BUSY ABORT 'NO CARRIER' ““ AT OK ATDT<phone.number>
CONNECT ““ TIMEOUT 10 ogin:-\\r-ogin: <login-id>
TIMEOUT 5 sword: <password>
一旦这些被安装和修改正确,你所需要做的是运行pppd,像这样:
# pppd
16.3.3 使用pppd作为一个服务器
/etc/ppp/options应当包含下面这些:
crtscts # Hardware flow control
netmask 255.255.255.0 # netmask ( not required )
192.114.208.20:192.114.208.165 # IP's of local and remote hosts
# local IP must be different from one
# you assigned to the ethernet ( or other )
# interface on your machine.
# remote IP is IP address that will be
# assigned to the remote machine
domain ppp.foo.com # your domain
passive # wait for LCP
modem # modem line
下面的/etc/ppp/pppserv脚本将启用告诉pppd作为一个服务器:
#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
# reset ppp interface
ifconfig ppp0 down
ifconfig ppp0 delete
# enable autoanswer mode
kermit -y /etc/ppp/kermit.ans
# run ppp
pppd /dev/tty01 19200
使用这个/etc/ppp/pppservdown脚本停止服务器:
#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ “X${pid}” != “X” ] ; then
echo 'killing kermit,PID=' ${pid}
kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.noans
下面的kermit脚本(/etc/ppp/kermit.ans)将启用/禁用你modem的autoanswer模式。是这样的:
set line /dev/tty01
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
pau 1
out +++
inp 5 OK
out ATH0\13
inp 5 OK
echo \13
out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable
; autoanswer mod
inp 5 OK
echo \13
exit
一个叫做/etc/ppp/kermit.dial的脚本被用来在远程主机上拨号和验证。你必须根据你的需要来定制它。在这个脚本中输入你的登陆名和口令。你也必须根据你的modem和远程主机的回应来改变输入声明
;
; put the com line attached to the modem here:
;
set line /dev/tty01
;
; put the modem speed here:
;
set speed 19200
set file type binary ; full 8 bit file xfer
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
set modem hayes
set dial hangup off
set carrier auto ; Then SET CARRIER if necessary,
set dial display on ; Then SET DIAL if necessary,
set input echo on
set input timeout proceed
set input case ignore
def \%x 0 ; login prompt counter
goto slhup
:slcmd ; put the modem in command mode
echo Put the modem in command mode.
clear ; Clear unread characters from input buffer
pause 1
output +++ ; hayes escape sequence
input 1 OK\13\10 ; wait for OK
if success goto slhup
output \13
pause 1
output at\13
input 1 OK\13\10
if fail goto slcmd ; if modem doesn't answer OK, try again
:slhup ; hang up the phone
clear ; Clear unread characters from input buffer
pause 1
echo Hanging up the phone.
output ath0\13 ; hayes command for on hook
input 2 OK\13\10
if fail goto slcmd ; if no OK answer, put modem in command mode
:sldial ; dial the number
pause 1
echo Dialing.
output atdt9,550311\13\10 ; put phone number here
assign \%x 0 ; zero the time counter
:look
clear ; Clear unread characters from input buffer
increment \%x ; Count the seconds
input 1 {CONNECT }
if success goto sllogin
reinput 1 {NO CARRIER\13\10}
if success goto sldial
reinput 1 {NO DIALTONE\13\10}
if success goto slnodial
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 60 goto look
else goto slhup
:sllogin ; login
assign \%x 0 ; zero the time counter
pause 1
echo Looking for login prompt.
:slloop
increment \%x ; Count the seconds
clear ; Clear unread characters from input buffer
output \13
;
; put your expected login prompt here:
;
input 1 {Username: }
if success goto sluid
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 10 goto slloop ; try 10 times to get a login prompt
else goto slhup ; hang up and start again if 10 failures
:sluid
;
; put your userid here:
;
output PPP-login\13
input 1 {Password: }
;
; put your password here:
;
output PPP-password\13
input 1 {Entering SLIP mode.}
echo
quit
:slnodial
echo \7No dialtone. Check the telephone line!\7
exit 1
; local variables:
; mode: csh
; comment-start: “; “
; comment-start-skIP: “; “
; end:
16.4通过以太网来使用PPP(PPPoE)
这节将介绍如何通过以太网设置PPP(PPPoE)。
16.4.1 配置内核
如果必须的netgraph支持没有被编译进内核,那它需要被ppp动态加载。
16.4.2 设置ppp.conf
这儿是一个ppp.conf例子:
default:
set log Phase tun command # you can add more detailed logging if you wish
set ifaddr 10.0.0.1/0 10.0.0.2/0
name_of_service_provider:
set device PPPoE:xl1 # replace xl1 with your ethernet device
set authname YOURLOGINNAME
set authkey YOURPASSWORD
set dial
set login
add default HISADDR
16.4.3 运行PPP
用root来运行:
# ppp -ddial name_of_service_provider
16.4.4在启动时运行PPP
把下面这些行加到你的/etc/rc.conf文件中:
PPP_enable=“YES”
PPP_mode=“ddial”
PPP_nat=“YES” # if you want to enable nat for your local network,otherwise NO
PPP_profile=“name_of_service_provider”
16.4.5使用一个PPPoE的服务标签
有时,必须要使用一个服务标签(service tag)来建立你的连接。服务标签用来区别不同的PPPoE服务器。你可以在你ISP提供的文档中得到必要的服务标签信息。如果你找不到,向你的ISP寻求技术支持。
作为最后一种方法,你可以试试http://www.roaringpenguin.com/pppoe/所建议的方法。请记住,这可能会破坏你的modem,使它失效,所以操作之前,请认真考虑好。简单地安装你的ISP提供的modem程序。然后用这个程序访问系统菜单。你的配置名称会在那儿列出来。它通常是ISP。
配置名称将在ppp.conf中被用在PPPoE的配置记录中作为set device命令的提供者部分。是这样的:
set device PPPoE:xl1:ISP
不要忘记为你的以太网卡xl1修改成适当的设备。
不要忘记修改ISP为你上面找到的适当名称。其他的信息,请参考下面的这个网页:
Cheaper Broadband with FreeBSD on DSL(http://www.daemonnews.org/200101/pppoe.html)。
16.4.6带有一个3Com HomeConnect ADSL Modem的PPPoE双连接
这个modem不遵循RFC 2516。另外,不同的数据包类型已经被用作以太网的框架。为了让FreeBSD能使用这个设备进行通信,必须要设置sysctl。这可以通过修改/etc/sysctl.conf文件来让系统在启动时自动完成:
net.graph.nonstandard_PPPoe=1
或直接执行下面的命令:sysctl -w net.graph.nonstandard_PPPoe=1。
不幸的是,因为这是系统范围的设置,所以它不能同时与一个普通的PPPoE客户端或服务器和一个3Com HomeConnect ADSL Modem进行交谈。
16.5通过ATM来使用PPP(PPPoA)
下面描述了如何通过ATM来设置PPP,也叫作,PPPoA。现在,支持的唯一硬件是Alcatel Speedtouch USB ADSL modem。
16.5.1 安装PPPoA
PPPoA在FreeBSD中被作为一个port来提供,因为这个硬件程序在alcatel 的许可协议下是不能发布的(http://www.alcatel.com/consumer/dsl/disclaimer_lx.htm)。要安装这个port,只要使用ports collection(第4章)来安装net/pppoa port,然后根据指示操作。
16.6 使用SLIP
16.6.1设置一个SLIP客户端
下面是一个在静态主机网络上设置FreeBSD机器的方法。对于动态主机名的分配(你每次拨号,都要改变地址),你可能需要作一个比较复杂的设置。
第一,需要决定你的modem连接到哪个端口。许多人会设置一个符号连接,如/dev/modem,来指定一个真正的设备名称,/dev/cuaaN。这允许你抽象化真实的设备名称。当你需要在/etc和.kermrc文件中修复整个系统上的许多文件时,这是一件非常麻烦的事情。
注意:/dev/cuaa0是COM1,cuaa1是COM2等。
确信在内核配置文件中包含下面这行:
pseudo-device sl 1
它包含在GENERIC内核中,所以这不会是一个问题,除非你已经删除它了。
你唯一必须做的事情
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/host.conf文件中。否则,可能会出现一些很滑稽的事情。
3. 编辑/etc/rc.conf文件。
1. 通过编辑下面这行来设置你的主机名:
hostname=“yname.my.domain”
你机器的全部Internet主机名将被放在这儿。
2. 通过修改下面这行把添加sl0到网络接口的列表中:
network_interfaces=“lo0”
到:
network_interfaces=“o0 sl0”
3. 通过加入下面这行设置sl0的启动标记:
ifconfig_sl0=“inet ${hostname} SLIP-gateway netmask 0xffffff00 up”
4. 通过修改下面这行来指定默认的路由:
defaultrouter=“NO”
到:
defaultrouter=“lIP-gateway”
4. 创建一个包含下面这些行的/etc/resolv.conf文件:
domain CS.Example.EDU
nameserver 128.32.136.9
nameserver 128.32.136.12
正如你看到的,这些设置域名服务器的主机。当然,真实的域名名称和地址依赖于你的 环境。
5. 设置root和toor的口令。(或任何其他没有口令的帐户)
6. 重新启动机器,然后确信它启用了正确的主机。
创建一个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,然后以root来键入:
# slattach -h -c -s 115200 /dev/modem
如果你能ping通在其他路由器上的主机,就是连接好了!如果不行,你可以试试-a来代替-c作为slattach的参数。
如何关闭连接
执行下面的命令:
# kill -INT `cat /var/run/slattach.modem.pid`
杀掉slattach。记住你必须用root来做。然后回到kermit(如果你要暂停,可以运行fg),从那儿退出(q)。
slattach的联机手册说你必须使用ifconfig sl0 down来向后标记接口,但这似乎没有做任何变化。
有时,你的modem拒绝连接。遇到这种情况,你只要启动kermit,然后再退出。它通常在试第二次的时候就可以了。
问题解答
如果它不工作,抽空告诉我:
不要在slattach中使用-c和-a(这个不是致命的,一些用户报告这可以解决他们的问题)。
使用s10来代替sl0。(注意书写)
试试ifconfig sl0来看你的接口情况。例如,你可以这样:
# ifconfig sl0
sl0: flags=10<POINTOPOINT>
inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00
另外,netstat -r将得到路由表,万一你用ping时得到了“no route to host”信息。像下面这样:
# 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)
连接起来后一段时间,你的系统的数字会发生变化。
16.6.2设置一个SLIP服务器
这篇文章提供了在FreeBSD系统上设置SLIP服务器服务的建议。
前提条件
这节实际上是非常技术性的,所以需要有一些背景信息。假设你熟悉TCP/IP网络协议,特别是网络和接点地址,网络掩码,子网,路由,路由协议,如RIP。在一个拨号服务器上配置SLIP服务要求有这些概念的知识。如果你不熟悉他们,请读读O'Reilly & Associates, Inc出版的Craig Hunt的《TCP/IP Network Administration》一书或Douglas Comer的有关TCP/IP协议的书。
另外假设你已经设置好了你的modem,配置好了适当的系统文件来允许通过你的modem登陆系统。如果你还没有准备好你的系统,请看看配置拨号服务的指南。如果你有一个浏览器,可以看看http://www.FreeBSD.org/网站上的指南。
快速预览
在它的典型配置中,使用FreeBSD作为一个SLIP 服务器:一个SLIP用户拨号到你的FreeBSD SLIP服务器系统,然后用一个特殊的SLIP登陆ID登陆,使用/usr/sbin/sliplogin作为指定用户的shell。程序浏览/etc/sliphome/slip.hosts文件来寻找一个特定用户的匹配行,如果找到一个匹配,通过串行线连接到一个可用的SLIP接口,然后运行shell脚本/etc/sliphome/slip.login配置SLIP接口。
一个SLIP服务器登陆的例子
例如,如果一个SLIP用户ID是Shelmerg,Shelmerg在/etc/master.passwd中的记录可能是这样的:
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将为SLIP接口执行一个ifconfig来设置本地的IP地址(dc-slip),远程IP地址(sl-helmer),SLIP地址的子网掩码(0xfffffc00)和其他标记(autocomp)。如果出现错误,sliplogin通常通过syslog守护程序来记录好的信息日志。这通常记录到/var/log/messages文件(看看syslogd和syslog.conf的联机手册),也可以检查/etc/syslog.conf文件看看syslogd记录了什么和记录在哪儿。
好了。我们可以开始设置系统了。
内核配置
FreeBSD的默认内核通常使用两个定义的SLIP接口(sl0和sl1)。你可以使用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
sl0和sl1接口指出了有两个SLIP接口被编译进了内核。
然而,FreeBSD的默认内核没有配置成传输数据包(默认的,你的FreeBSD机器不能充当一个路由器)。如果你要你的机器充当一个路由器,你必须编辑文件/etc/rc.conf修改变量gateway_enable为YES。
你也必须为使修改生效而重新启动系统。你将注意到在默认的内核配置文件(/sys/i386/conf/GENERIC)末尾有这样一行:
pseudo-device sl 2
这是定义内核中可用的SLIP设备的号码的行。在这行的末尾的数字是SLIP连接的最大数字。
请参考第9章配置FreeBSD的内核来帮助你配置你的内核。
配置sliplogin
正如先前提到的,在/etc/slip主目录(home)中有三个文件,是配置/usr/sbin/sliplogin的一部分:slip.hosts,它定义了SLIP用户和他们相关的IP地址。SLIP.login,通常配置SLIP接口。slip.logout,当串行连接停止时,取消slip.login的影响。
slip.hosts 配置
/etc/sliphome/slip.hosts包含了四个项目:
SLIP用户的登陆ID。
SLIP连接的本地地址
SLIP连接的远程地址
网络掩码
本地和远程地址可能是主机名,网络掩码可能是通过查找/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数据包
为你的SLIP连接选择本地还是远程地址依赖于你是在一个TCP/IP子网中,还是你正在你的SLIP服务器上使用“proxy ARP”。如果你不能确定选用哪个方法或如何分配IP地址,请参考第16.6.2.1的介绍,或咨询你的IP网络管理员。
如果要为你的SLIP客户端使用一个分离的子网,你必须根据你指定的IP网络号码来分配子网号码,然后根据这个子网为你的SLIP客户端分派IP号码。接着,你将能够在离你最近的IP路由器上通过SLIP服务器分派一个静态路由给SLIP子网,或在你的SLIP服务器上安装gated,配置它使它能与你的其他路由器用适当的路由协议进行交谈,以便通知他们有关你的SLIP服务器路由的情况。
另外,如果你要使用“proxy ARP”方法,你必须根据你的SLIP 服务器的以太网子网来指派客户端的IP 地址,你也必须调整/etc/sliphome/slip.login和/etc/sliphome/slip.logout脚本使用arp管理proxy-ARP在SLIP 服务器ARP表中的记录。
slip.login 配置
典型的/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接口的网络掩码的适当的SLIP接口只运行ifconfig。
如果你决定使用proxy ARP方法,你的/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节点要求回应客户端的IP地址时,这个ARP记录使得SLIP服务器对SLIP服务器的以太网MAC地址产生回应。
当使用上面的例子时,确信用你系统以太网卡的MAC地址重新替换了以太网MAC地址(00:11:22:33:44:55),或你的“proxy ARP”将干脆不工作!你可以通过寻找运行netstat -i的结果来发现你的SLIP服务的以太网MAC地址。输出的第二行是这样的:
ed0 1500 <Link>0.2.c1.28.5f.4a 191923 0 129457 0 116
这儿指出这个特殊系统的以太网MAC地址是00:02:c1:28:5f:4a 。
SLIP.logout 配置
/etc/sliphome/slip.logout不是一定需要的,但如果你决定创建它,这儿是一个基本的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
如果你正在使用proxy 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
当SLIP客户端登陆时,arp -d $5删除了ARP记录。
路由考虑
如果你没有使用“proxy ARP”方法在你的SLIP客户端和你网络的其余部分之间路由数据包,你可能必须添加静态路由到你接近的默认路由器来路由你的SLIP客户端子网,或你必须安装和配置gated,以至它会告诉你的路由器有关你的SLIP子网的信息。
静态路由
添加静态路由到你最近的默认路由器可能会出问题。如果你在配置中有一个使用多种路由器的网络,如Cisco 和Proteon,不仅仅要为SLIP子网配置静态路由,还必须被告知哪个静态路由要告诉其他路由器的情况,所以一些专家的意见是执行基于静态路由的工作。
运行gated
另一个静态路由的令人头痛的问题是安装gated和使用适当的路由协议配置它来告诉其他路由器的情况。你可以去下载一个gated的软件包(http://www.gated.merit.edu/),安装,然后写一个文件来配置你的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接口的参考。这个例子文件为了调试gated的活动也设置成追踪/var/tmp/gated.output。如果gated工作得很好,你可以关闭追踪选项。你必须修改xxx.xxx.yy成你自己SLIP子网的网络地址。(确信在proto direct子句中也修改了子网掩码)。
一旦你安装和配置了gated,你需要告诉FreeBSD启动脚本运行gated代替routed。最简单的办法是在/etc/rc.conf文件中设置router和router_flags变量。请参考gated的联机手册了解更多信息。