30.2.配置 PPP¶
FreeBSD 提供了对使用 ppp(8) 管理拨号 PPP 连接的内置支持。默认的 FreeBSD 内核提供了对 tun 的支持,它被用来与调制解调器硬件交互。配置是通过编辑至少一个配置文件来完成的,并且提供了包含实例的配置文件。最后,ppp
被用来启动和管理连接。
为了使用 PPP 连接,需要以下物品:
一个互联网服务提供商(ISP)的拨号账户。
一个拨号调制解调器。
ISP 的拨号号码。
由 ISP 分配的登录名和密码。
一个或多个 DNS 服务器的 IP 地址。通常情况下,ISP 会提供这些地址。如果没有,FreeBSD 可以被配置为使用 DNS 协商。
如果缺少任何所需的信息,请联系 ISP。
以下信息可能由 ISP 提供,但不是必须的:
默认网关的 IP 地址。如果这个信息未知,ISP 会在连接设置时自动提供正确的值。在 FreeBSD 上配置 PPP 时,这个地址被称为
HISADDR
。子网掩码。如果 ISP 没有提供,则在 ppp(8) 配置文件中会使用
255.255.255.255
。如果 ISP 已经分配了一个静态 IP 地址和主机名,它应该被输入到配置文件中。否则,这些信息将在连接设置时自动提供。
本节的其余部分将演示如何为常见的 PPP 连接情况配置 FreeBSD。所需的配置文件是 /etc/ppp/ppp.conf,其他文件和例子可以在 /usr/share/examples/ppp/ 中找到。
注意
在本节中,许多文件的例子都显示行号。这些行号是为了更容易跟上讨论而添加的,并不意味着要放在实际文件中。
当编辑一个配置文件时,正确的缩进是很重要的。以“:”结尾的行从第一列开始(行的开头),而所有其他行应使用空格或制表符缩进,如图所示。
30.2.1.基本配置¶
为了配置 PPP 连接,首先用 ISP 的拨入信息编辑 /etc/ppp/ppp.conf。该文件说明如下。
1 default:
2 set log Phase Chat LCP IPCP CCP tun command
3 ident user-ppp VERSION
4 set device /dev/cuau0
5 set speed 115200
6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 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 timeout 300
16 set ifaddr x.x.x.x/0 y.y.y.y/0 255.255.255.255 0.0.0.0
17 add default HISADDR
第 1 行
标明 default
条目。该条目中的命令(第 2 行到第 9 行)在 ppp
运行时自动执行。
第 2 行
启用用于测试连接的粗略日志参数。若配置工作令人满意,这一行应该被减少为:
set log phase tun
第 3 行
向连接的另一端运行的 PPP 软件显示 ppp(8) 的版本。
第 4 行
确定调制解调器所连接的设备,其中 COM1 是 /dev/cuau0,COM2 是 /dev/cuau1。
第 5 行
设置连接速度。如果 115200
在老式调制解调器上不起作用,可以尝试用 38400
代替。
第 6、 7 行
写为期望——发送语法的拨号字符串。更多信息请参考 chat(8)。
注意,为了便于阅读,这个命令会延续到下一行。ppp.conf 中的任何命令都可以这样做,如果该行的最后一个字符是 \
。
第 8 行
设置链接的空闲超时,单位是秒。
第 9 行
指示对等体确认 DNS 设置。如果本地网络正在运行自己的 DNS 服务器,这一行应该被注释掉,在该行的开头加上 #,或者删除。
第 10 行
为了便于阅读,这是一个空行。空白行会被 ppp(8) 忽略。
第 11 行
识别了一个名为 provider
的条目。这可以改成 ISP 的名字,这样就可以用 load
ISP 来启动连接。
第 12 行
使用 ISP 的电话号码。可以使用冒号(:)或管道字符(|)作为分隔符来指定多个电话号码。要轮流拨打这些号码,请使用冒号。要总是尝试先拨第一个号码,只有在第一个号码失败时才使用其他号码,使用管道字符。始终用引号(“)括住整组电话号码,以防止拨号失败。
第 13、14 行
使用 ISP 的用户名和密码。
第 15 行
设置连接的默认空闲超时,单位为秒。在这个例子中,连接将在 300 秒的不活动后自动关闭。要防止超时,将此值设为零。
第 16 行
设置接口地址。使用的值取决于是否从 ISP 那里获得了静态 IP 地址,或者在连接过程中是否协商了一个动态 IP 地址。
如果 ISP 已经分配了一个静态 IP 地址和默认网关,用静态 IP 地址替换 x.x.x.x,用默认网关的 IP 地址替换 y.y.y.y。如果 ISP 只提供了一个静态 IP 地址而没有网关地址,则用 10.0.0.2/0
替换 y.y.y.y.y。
如果每次连接时 IP 地址都会改变,请将这一行改为以下值。这告诉 ppp(8) 使用 IP 配置协议(IPCP)来协商一个动态 IP 地址:
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 0.0.0.0
第 17 行
保持这一行不变,因为它为网关添加了一个默认路由。HISADDR
将自动被替换成第 16 行指定的网关地址。重要的是这一行出现在第 16 行之后。
根据是手动还是自动启动 ppp(8),可能还需要创建一个 /etc/ppp/ppp.linkup,其中包含以下几行。在 -auto
模式下运行 ppp
时,需要这个文件。这个文件在连接建立后使用。在这一点上,IP 地址已经被分配,现在可以添加路由表项。在创建这个文件时,确保 provider 与 ppp.conf 第 11 行中显示的值一致。
provider:
add default HISADDR
在静态 IP 地址配置中,如果默认网关地址是“猜测”的,也需要这个文件。在这种情况下,从 ppp.conf 中删除第 17 行,用上述两行创建 /etc/ppp/ppp.linkup。这个文件的更多例子可以在 /usr/share/examples/ppp/ 中找到。
默认情况下,ppp
必须以 root
身份运行。要改变这个默认值,将运行 ppp
的用户的账户添加到 /etc/group 中的 network
组。
然后,使用 allow
让该用户可访问 /etc/ppp/ppp.conf 中的一个或多个条目。例如,要给 fred
和 mary
只访问 provider:
条目的权限,在 provider:
部分添加这一行:
allow users fred mary
要让指定的用户访问所有条目,就把这一行放在 default
部分。
30.2.2.高级配置¶
可以将 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 中找到的值。
30.2.2.1.PAP 和 CHAP 认证¶
一些 ISP 将他们的系统设置为使用 PAP 或 CHAP 认证机制完成连接的认证部分。如果是这种情况,ISP 不会在连接时给出 login:
提示,而是立即开始 PPP 对话。
PAP 不如 CHAP 安全,但安全在这里通常不是问题,因为密码虽然在 PAP 中以纯文本形式发送,但只在串行线路上传输。破解者没有太多的空间来“窃听”。
必须做以下改动:
13 set authname MyUserName
14 set authkey MyPassword
15 set login
第 13 行
这一行指定了 PAP/CHAP 用户名。输入 MyUserName
的正确值。
第 14 行
这一行指定了 PAP/CHAP 密码。输入 MyPassword
的正确值。你可能想增加一行,例如:
16 accept PAP
或
16 accept CHAP
来表明这是你的意图,但 PAP 和 CHAP 都是默认接受的。
第 15 行
在使用 PAP 或 CHAP 时,ISP 通常不会要求登录到服务器。因此,禁用“set login”字符串。
30.2.2.2.使用 PPP 网络地址转换能力¶
PPP 具有使用内部 NAT 的能力,没有内核转移功能。这一功能可以通过 /etc/ppp/ppp.conf 中的以下一行启用:
nat enable yes
或者,可以通过命令行选项 -nat
启用 NAT。还有 /etc/rc.conf 中名为 ppp_nat
的选项,默认是启用的。
当使用这个特性时,可以使用下面的 /etc/ppp/ppp.conf 选项来启用传入连接转发:
nat port tcp 10.0.0.2:ftp ftp
nat port tcp 10.0.0.2:http http
或者完全不信任外部的连接
nat deny_incoming yes
30.2.3.最终的系统配置¶
虽然 ppp
现在已经配置好了,但仍然需要对 /etc/rc.conf 进行一些编辑。
在这个文件中,从上往下工作,确保 hostname=
一行被设置:
hostname="foo.example.com"
如果 ISP 提供了一个静态的 IP 地址和名称,请使用这个名称作为主机名。
找出 network_interfaces
变量。要配置系统按需拨号给 ISP,确保 tun0 设备被添加到列表中,否则将其删除。
network_interfaces="lo0 tun0"
ifconfig_tun0=
注意
变量
ifconfig_tun0
应该为空,并且应该创建一个名为 /etc/start_if.tun0 的文件。这个文件应该包含这一行:ppp -auto mysystem
这个脚本在网络配置时被执行,在自动模式下启动 ppp 守护进程。如果这台机器作为一个网关,可以考虑包括
-alias
。更多细节请参考手册页面。
确保路由器程序被设置为 NO
,在 /etc/rc.conf 中加入以下一行:
router_enable="NO"
重要的是,不要启动 routed
守护进程,因为 routed
倾向于删除 ppp 创建的默认路由表项。
确保 sendmail_flags
一行不包括 -q
选项可能是个好主意,否则 sendmail
会不时地尝试进行网络查询,可能会导致你的机器拨出。你可以试试:
sendmail_flags="-bd"
缺点是,每当 ppp 链接时,sendmail
都被迫重新检查邮件队列。为了自动处理这个问题,可以在 ppp.linkup 中加入 !bg
:
1 provider:
2 delete ALL
3 add 0 0 HISADDR
4 !bg sendmail -bd -q30m
另一种方法是设置一个“dfilter”来阻止 SMTP 流量。更多细节请参考 sample 文件。
30.2.4.使用 ppp¶
剩下的就是重启机器了。重启后,可以输入:
# ppp
然后 dial provider
来启动 PPP 会话,或者,要配置 ppp
在有出站流量且 start_if.tun0 不存在时自动建立会话,请输入:
# ppp -auto provider
当 ppp
程序在后台运行时,有可能与它通信,但前提是已经设置了一个合适的诊断端口。要做到这一点,在配置中添加以下一行:
set server /var/run/ppp-tun%d DiagnosticPassword 0177
这将告诉 PPP 监听指定的 UNIX® 域套接字,在允许访问之前要求客户提供指定的密码。名称中的 %d
被替换为正在使用的 tun 设备号。
设置了一个套接字之后,就可以在希望操纵运行中的程序的脚本中使用 pppctl(8) 程序。
30.2.5.配置拨入服务¶
“拨号服务”提供了关于使用 getty(8) 启用拨号服务的良好说明。
getty
的另一个选择是 comms/mgetty+sendfax port,这是 getty
的一个更智能的版本,是为拨号线路设计的。
使用 mgetty
的好处是它能主动与调制解调器对话,这意味着如果在 /etc/ttys 中关闭端口,那么调制解调器就不会接电话。
mgetty
的后期版本(从 0.99beta 开始)还支持 PPP 流的自动检测,允许客户端无脚本地访问服务器。
关于 mgetty
的更多信息,请参考 http://mgetty.greenie.net/doc/mgetty_toc.html。
默认情况下,comms/mgetty+sendfax 端口启用了 AUTO_PPP
选项,允许 mgetty
检测 PPP 连接的 LCP 阶段并自动生成 ppp shell。然而,由于默认的登录/密码序列没有发生,所以有必要使用 PAP 或 CHAP 来验证用户。
本节假设用户已经成功编译,并在其系统上安装了 port comms/mgetty+sendfax。
确保 /usr/local/etc/mgetty+sendfax/login.config 有以下内容:
/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
这告诉 mgetty
对检测到的 PPP 连接运行 ppp-pap-dialup。
创建一个名为 /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 里有一个用户名/密码,或者添加以下选项,从 /etc/passwd 里通过 PAP 认证用户。
enable passwdauth
要给某些用户分配一个静态 IP 号码,在 /etc/ppp/ppp.secret 中指定号码作为第三个参数。例子见 /usr/share/examples/ppp/ppp.secret.sample。