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