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. provider:
  11. set phone "(123) 456 7890"
  12. set authname foo
  13. set authkey bar
  14. set timeout 300
  15. set ifaddr x.x.x.x/0 y.y.y.y/0 255.255.255.255 0.0.0.0
  16. add default HISADDR

行 1:

指定默认的项。当PPP运行时这个项中的命令(第 2 行到第 9 行)将自动执行。

行 2:

启用登录参数。工作正常后,为避免产生过多的日志文件,这行应该简化为:

  1. set log phase tun

行 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

行 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

当静态 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

要让指定的用户访问所有目录,就把这一行放在默认部分。

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

而对于 PPP 2 及以上版本:

  1. accept dns
  2. set dns 203.14.100.1 203.14.100.2
  3. set nbns 203.14.100.5

这将告诉客户主要和次要的 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

行 13:

这一行指定了 PAP/CHAP 用户名。插入 MyUserName 的正确值。

行 14:

这一行指定了 PAP/CHAP 密码。插入 MyPassword 的正确值。你可能想增加额外的选项,例如:

  1. accept PAP

  1. accept CHAP

以明确你的意图,不过,默认情况下 PAP 和 CHAP 都会接受。

行 15:

如果你使用的是 PAP 或 CHAP,一般来说 ISP 就不会要求你登录服务器了。这时,就必须禁用set login设置。

28.2.2.2.使用 PPP 网络地址翻译

PPP 可以使用内建的 NAT,而无需内核支持。你可以在 /etc/ppp/ppp.conf 中加入如下配置来启用它:

  1. nat enable yes

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

或者完全不信任外来的请求:

  1. nat deny_incoming yes

28.2.3.最后的系统配置

现在你已配置了 ppp,但在真正工作之前还有一些事情要做。即修改 /etc/rc.conf

从上依次往下看,确认已经正确地配置了 hostname= ,例如:

  1. hostname="foo.example.com"

如果你的 ISP 提供给你一个静态的 IP 和名字,将这个名字设为 hostname 是最合适的。

寻找 network_interfaces 变量。如果要配置系统通过拨号连入 ISP,一定要将 tun0 设备加入这个列表,否则就删除它。

  1. network_interfaces="lo0 tun0"
  2. ifconfig_tun0=

注意

ifconfig_tun0 变量应该是空的,且要创建一个名为 /etc/start_if.tun0 的文件。这个文件应该包含这一行:

  1. ppp -auto mysystem

此脚本在网络配置时被执行,开启 PPP 守护进程进入自动模式。如果这台机子充当一个 LAN 的网关,你可能希望使用 -alias 。参考相关手册了解更多细节。

务必在 /etc/rc.conf 中,把路由程序设置为 NO :

  1. router_enable="NO"

不启动 routed 服务程序非常重要,因为 routed 总会删掉由 ppp 所建立的默认路由。

此外,我们建议你确认一下 sendmail_flags 这一行中没有指定 -q 参数,否则 sendmail 将会不断地尝试查找网络,而这样做将会导致机器不断地进行拨号。可以考虑:

  1. 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 流量。更多细节请参考样本文件。

28.2.4.使用 PPP

剩下的就是重新启动机器。重新启动后,键入:

  1. # ppp

然后是 dial provider 以开启 PPP 会话。或者如果你想让 ppp 自动建立会话,因为你有一条广域网连接 (且没有创建 start_if.tun0 脚本),键入:

  1. # ppp -auto provider

与后台运行的 ppp 程序进行对话是可能的,前提是设置了一个合适的诊断端口。做到这一点,需要把下面的行加入到你的配置中:

  1. set server /var/run/ppp-tun%d DiagnosticPassword 0177

这行告诉 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

这告诉 mgetty 对检测到的 PPP 连接运行 ppp-pap-dialup

创建一个名为 /etc/ppp/ppp-pap-dialup 的可执行文件,包含以下内容:

  1. #!/bin/sh
  2. exec /usr/sbin/ppp -direct pap$IDENT

对于在 /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

每个用这种方法登录的用户都需要在 /etc/ppp/ppp.secret 中拥有一个用户名/密码,或者添加以下选项,从 /etc/passwd 中通过 PAP 认证用户。

  1. enable passwdauth

要给某些用户分配一个静态 IP 地址,在 /etc/ppp/ppp.secret 中指定该地址作为第三个参数。例子见 /usr/share/examples/ppp/ppp.secret.sample