第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