16 PPPSLIP

16.1 概要

FreeBSD有很多方法可以将计算机与计算机连接起来。通过一个拨号modem来建立一个网络或Internet连接,或允许其他人与你连接,要求使用PPPSLIP。这章描述了设置这些基于modem的通信服务的细节情况。

读完这章,你将了解这些:

             如何设置用户级PPP

             如何设置内核级PPP

             如何设置PPPoEPPP over Ethernet)。

             如何设置PPPoAPPP 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的网关地址。网关是你要连接和被设置成默认路由的机器。如果你没有这个信息,那在我们连接时你的ISPPPP服务器会自动告诉你正确的值。

这个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用你系统中适合的号码来替换。

对于没有启用DEVFSFreeBSD,应当先检查一下是否存在tun0设备。

最简单的方法是重新编译设备。要重新编译设备,可以这样做:

    # cd /dev

    # sh MAKEDEV tun0

如果你需要在内核中有16tunnel设备,你必须创建它们。这可以通过执行下面的命令来完成:

    # cd /dev

    # sh MAKEDEV tun15

命名最终的配置

检查系统中IP地址与主机名的匹配情况,反之亦然。它可以被配置成寻找描述IP分布的主机地图。第一个是一个叫做/etc/hosts的文件。看看host的联机手册了解更多信息。第二个是Internet域名服务(DNS)。有关DNSDNS服务的信息,请参考第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: filesdns

这个要求你先看文件/etc/hosts,如果名字找不到,可以参考DNS

编辑/etc/hosts

这个文件可能包含了在你本地网络中其他机器的IP地址和名称。它也会包含将要运行PPP的机器的记录。假设你的机器叫做foo.bar.comIP地址是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 配置

PPPPppd都使用/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/cuaa0COM2/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变量。当使用PAPCHAP进行连接时,这些值在认证时会被使用。

15:

如果你正在使用PAPCHAP,在这点上将没有登陆,这行将被注释掉或删掉。登陆命令是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数据流,允许你的客户端不需要写任何脚本就可以访问服务器。参考MgettyAutoPPP的联机手册了解更多信息。

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的标记。

例如,如果有三个拨号用户:fredsammary,你可以路由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连接到上面创建的连接标记上。(例如,maryshell将是/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文件的内容,你必须为每个静态拨号用户添加一部分。我们继续以fredsammary为例。

    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

更多有关mgettyAutoPPPMS Extensions的知识

mgetty AutoPPP

通过启用AUTO_PPP选项来配置和编译mgetty可以允许mgetty检测到PPP连接的LCP状态,然后自动产生一个PPP shell。然而,如果默认的login/password顺序没有出现,那就必须使用PAP CHAP来验证用户。

这节假设用户已经用AUTO_PPP选项成功地配置,编译和安装了mgetyyv0.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以提供DNSNetBIOS域名服务地址。要启用这些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中找到的值。

PAPCHAP验证

一些ISP把它们的系统设置成使用PAPCHAP验证机制。你的ISP将不会给出一个登陆:你连接时出现的命令行,但将立刻启用对话PPP

PAPCHAP的安全性要差一点,但安全并不仅仅指这儿的口令,PAP使用纯文本的方式来发送,而且只通过串行线传送。对于crackers来说想偷听没有任何机会。

参考PPP和静态IP地址或PPP和动态IP地址章节,需要做下面的修改:

    7       set login

    ...

    12      set authname MyUserName

    13      set authkey MyPassword

7:

如果你使用PAPCHAP,你的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 kermitPID=' ${pid}

            kill -9 ${pid}

    fi

    ifconfig ppp0 down

    ifconfig ppp0 delete

    kermit -y /etc/ppp/kermit.noans

下面的kermit脚本(/etc/ppp/kermit.ans)将启用/禁用你modemautoanswer模式。是这样的:

    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 atdt9550311\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 networkotherwise 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 DSLhttp://www.daemonnews.org/200101/pppoe.html)。

 

16.4.6带有一个3Com HomeConnect ADSL ModemPPPoE双连接

这个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

PPPoAFreeBSD中被作为一个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/cuaa0COM1cuaa1COM2等。

确信在内核配置文件中包含下面这行:

    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.    设置roottoor的口令。(或任何其他没有口令的帐户)

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\x0dinput 10 Username:if failure stop -

output silvia\x0dinput 10 Password:if failure stop -

output ***\x0decho \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用户IDShelmergShelmerg/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文件(看看syslogdsyslog.conf的联机手册),也可以检查/etc/syslog.conf文件看看syslogd记录了什么和记录在哪儿。

好了。我们可以开始设置系统了。

 

内核配置

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

sl0sl1接口指出了有两个SLIP接口被编译进了内核。

然而,FreeBSD的默认内核没有配置成传输数据包(默认的,你的FreeBSD机器不能充当一个路由器)。如果你要你的机器充当一个路由器,你必须编辑文件/etc/rc.conf修改变量gateway_enableYES

你也必须为使修改生效而重新启动系统。你将注意到在默认的内核配置文件(/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

    #                                               (normalcompressnoicmp)

    #

    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-ARPSLIP 服务器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文件中设置routerrouter_flags变量。请参考gated的联机手册了解更多信息。