第21章 其他文件系统
附录 D. OpenPGP 密钥
28.2.配置 PPP
FreeBSD 为使用 ppp(8) 管理拨号 PPP 连接提供了内置支持。默认的 FreeBSD 内核支持用于与调制解调器 (modem) 硬件交互的 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/ 中找到。
注意
在这节中,所有作为例子展示的配置文件中都有行号。这些行号只是为了解释和讨论更方便,在实际文件中并不存在。
编辑配置文件时,适当的缩进很重要。首行使用 : 结尾,其余行使用空格或 Tab 缩进。

28.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
Copied!
行 1:
指定默认的项。当PPP运行时这个项中的命令(第 2 行到第 9 行)将自动执行。
行 2:
启用登录参数。工作正常后,为避免产生过多的日志文件,这行应该简化为:
1
set log phase tun
Copied!
行 3:
显示连接另一端运行的 PPP 软件的 ppp(8) 版本。
行 4:
标明 modem (调制解调器) 要连接的端口号。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:
设置提供商的电话号码。多个电话号码可以使用冒号 (:) 或管道符号 (|) 隔开。总的来讲,如果你要循环使用这些号码,可以使用冒号。如果你想使用第一个号码,当第一个号码失败了再用第二个号码,就使用管道符号。如所示的那样,要给整个电话号码加上引号(")。
行 13 & 14:
ISP 的账号和密码
行 15:
设置默认的超时时间。这里,连接若在 300 秒内无响应将被断开。如果你不想设置成超时,将这个值设置成 0 。
行 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 地址:
1
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 0.0.0.0
Copied!
行 17:
添加一个到 ISP 网关的默认路由。HISADDR 这个关键字会被第 16 行所指定的网关地址替换。这行必须出现在第 16 行之后,以免在 HISADDR 初始化之前使用它的值。
根据 ppp(8) 是手动还是自动启动,可能还需要创建一个 /etc/ppp/ppp.linkup ,其中包含以下几行。在 -auto 模式下运行 ppp 时,需要这个文件。这个文件在连接建立后使用。在这一点上,IP 地址已经被分配,现在可以添加路由表项。根据 ppp(8) 是手动还是自动启动,可能还需要创建一个 /etc/ppp/ppp.linkup ,其中包含以下几行。在 -auto 模式下运行 ppp 时需要这个文件。这个文件在连接建立后使用。在这一点上,IP 地址已经被分配,现在可以添加路由表项。在创建这个文件时,确保 providerppp.conf 第 11 行中显示的值一致:
1
provider:
2
add default HISADDR
Copied!
当静态 IP 地址配置中默认网关地址是“猜到”的,也需要这个文件。在这种情况下,从 ppp.conf 中删除第 17 行,用上述两行创建 /etc/ppp/ppp.linkup 。这个文件的更多例子可以在 /usr/share/examples/ppp/ 中找到。
默认情况下,ppp 必须以 root 身份运行。要改变这个默认值,将运行 ppp 的用户的账户添加到 /etc/group 中的 network 组。
然后,让用户访问 /etc/ppp/ppp.conf 中的一个或多个条目,并使用 allow 。例如,要让 fredmary 只访问 provider: 项,在 provider: 部分添加这一行。
1
allow users fred mary
Copied!
要让指定的用户访问所有目录,就把这一行放在默认部分。

28.2.2.高级配置

可以配置 PPP 以按需提供 DNS 和 NetBIOS 名称服务器地址。
要在 PPP 1.x 版本中启用这些扩展,可以在 /etc/ppp/ppp.conf 的相关部分添加以下行:
1
enable msext
2
set ns 203.14.100.1 203.14.100.2
3
set nbns 203.14.100.5
Copied!
而对于 PPP 2 及以上版本:
1
accept dns
2
set dns 203.14.100.1 203.14.100.2
3
set nbns 203.14.100.5
Copied!
这将告诉客户主要和次要的 DNS 服务器地址,以及一个 NetBIOS 名称服务器主机。
在版本 2 及以上,如果省略 set dns 一行,PPP 将使用 /etc/resolv.conf 中的值。

28.2.2.1.PAP 和 CHAP 验证

有些 ISP 将他们的系统设置成使用 PAP 或 CHAP 认证机制来完成连接的认证部分。如果是这种情况,ISP 不会在连接时给出 login: 提示,而是会立即开始使用 PPP 。
PAP 不如 CHAP 安全,但安全在这里通常不是问题,因为密码虽然在 PAP 中以纯文本形式发送,但只在串行线路上传输。破解者没有太多的空间来“偷听”。
必须做以下改动:
1
set authname MyUserName
2
set authkey MyPassword
3
set login
Copied!
行 13:
这一行指定了 PAP/CHAP 用户名。插入 MyUserName 的正确值。
行 14:
这一行指定了 PAP/CHAP 密码。插入 MyPassword 的正确值。你可能想增加额外的选项,例如:
1
accept PAP
Copied!
1
accept CHAP
Copied!
以明确你的意图,不过,默认情况下 PAP 和 CHAP 都会接受。
行 15:
如果你使用的是 PAP 或 CHAP,一般来说 ISP 就不会要求你登录服务器了。这时,就必须禁用set login设置。

28.2.2.2.使用 PPP 网络地址翻译

PPP 可以使用内建的 NAT,而无需内核支持。你可以在 /etc/ppp/ppp.conf 中加入如下配置来启用它:
1
nat enable yes
Copied!
PPP NAT 也可以使用命令行选项 -nat 启动。在 /etc/rc.conf 文件中也有 ppp_nat 项,并默认启用。
当使用这个特性时,可以使用下面的 /etc/ppp/ppp.conf 选项来启用传入连接转发:
1
nat port tcp 10.0.0.2:ftp ftp
2
nat port tcp 10.0.0.2:http http
Copied!
或者完全不信任外来的请求:
1
nat deny_incoming yes
Copied!

28.2.3.最后的系统配置

现在你已配置了 ppp,但在真正工作之前还有一些事情要做。即修改 /etc/rc.conf
从上依次往下看,确认已经正确地配置了 hostname= ,例如:
1
hostname="foo.example.com"
Copied!
如果你的 ISP 提供给你一个静态的 IP 和名字,将这个名字设为 hostname 是最合适的。
寻找 network_interfaces 变量。如果要配置系统通过拨号连入 ISP,一定要将 tun0 设备加入这个列表,否则就删除它。
1
network_interfaces="lo0 tun0"
2
ifconfig_tun0=
Copied!
注意
ifconfig_tun0 变量应该是空的,且要创建一个名为 /etc/start_if.tun0 的文件。这个文件应该包含这一行:
1
ppp -auto mysystem
Copied!
此脚本在网络配置时被执行,开启 PPP 守护进程进入自动模式。如果这台机子充当一个 LAN 的网关,你可能希望使用 -alias 。参考相关手册了解更多细节。
务必在 /etc/rc.conf 中,把路由程序设置为 NO :
1
router_enable="NO"
Copied!
不启动 routed 服务程序非常重要,因为 routed 总会删掉由 ppp 所建立的默认路由。
此外,我们建议你确认一下 sendmail_flags 这一行中没有指定 -q 参数,否则 sendmail 将会不断地尝试查找网络,而这样做将会导致机器不断地进行拨号。可以考虑:
1
sendmail_flags="-bd"
Copied!
缺点是,每当 ppp 链接时,sendmail 就不得不重新检查邮件队列。要实现自动化,可以在 ppp.linkup 中加入 !bg
1
provider:
2
delete ALL
3
add 0 0 HISADDR
4
!bg sendmail -bd -q30m
Copied!
另一种方法是设置一个dfilter来阻止 SMTP 流量。更多细节请参考样本文件。

28.2.4.使用 PPP

剩下的就是重新启动机器。重新启动后,键入:
1
# ppp
Copied!
然后是 dial provider 以开启 PPP 会话。或者如果你想让 ppp 自动建立会话,因为你有一条广域网连接 (且没有创建 start_if.tun0 脚本),键入:
1
# ppp -auto provider
Copied!
与后台运行的 ppp 程序进行对话是可能的,前提是设置了一个合适的诊断端口。做到这一点,需要把下面的行加入到你的配置中:
1
set server /var/run/ppp-tun%d DiagnosticPassword 0177
Copied!
这行告诉 PPP 在指定的 UNIX® 域 socket 中侦听,当用户连接时需要给出指定的密码。%dtun 设备号替换。
一旦启用了 socket,就可以在脚本中调用程序 pppctl(8) 来处理正在运行的 PPP 。

28.2.5.配置拨号服务

“拨号服务” 提供了关于使用 getty(8) 启用拨号服务的详细描述。
getty 的另一个选择是 comms/mgetty+sendfax (port),这是 getty 的一个更智能的版本,是为拨号线路设计的。
使用 mgetty 的好处是它能主动与 modems (调制解调器) talks ,这意味着如果在 /etc/ttys 中关闭 port,那么调制解调器就不会建立对话。
mgetty 的后期版本(从 0.99 beta 开始)还支持 PPP 流的自动检测,允许客户端无脚本地访问服务器。
有关 mgetty 的更多信息,请参阅 http://mgetty.greenie.net/doc/mgetty_toc.html
默认情况下,comms/mgetty+sendfax port 带有 AUTO_PPP 选项,允许 mgetty 检测 PPP 连接的 LCP 阶段并自动生成一个 ppp shell 。然而,由于默认的登录/密码序列没有发生,因此有必要使用 PAP 或 CHAP 来验证用户。
本节假设用户已经成功地编译,并在其系统上用 port 安装了 comms/mgetty+sendfax
确保 /usr/local/etc/mgetty+sendfax/login.config 有以下内容:
1
/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
Copied!
这告诉 mgetty 对检测到的 PPP 连接运行 ppp-pap-dialup
创建一个名为 /etc/ppp/ppp-pap-dialup 的可执行文件,包含以下内容:
1
#!/bin/sh
2
exec /usr/sbin/ppp -direct pap$IDENT
Copied!
对于在 /etc/ttys 中启用的每一条拨号线路,在 /etc/ppp/ppp.conf 中创建一个相应的目录。这将与我们上面创建的定义友好地共存。
1
pap:
2
enable pap
3
set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
4
enable proxy
Copied!
每个用这种方法登录的用户都需要在 /etc/ppp/ppp.secret 中拥有一个用户名/密码,或者添加以下选项,从 /etc/passwd 中通过 PAP 认证用户。
1
enable passwdauth
Copied!
要给某些用户分配一个静态 IP 地址,在 /etc/ppp/ppp.secret 中指定该地址作为第三个参数。例子见 /usr/share/examples/ppp/ppp.secret.sample