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/cuau0COM2/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  地址已经被分配,现在可以添加路由表项。在创建这个文件时,确保 providerppp.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 中的一个或多个条目。例如,要给 fredmary 只访问 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