IPCP 用于在链路配置时协商多个 IP 参数。通常,每个对等方发送一个 IPCP 配置请求数据包,指示它希望更改哪些默认值以及新值。收到后,远程端依次检查每个选项,并确认或拒绝它。
pppd 允许您对它将尝试协商哪些 IPCP 选项进行大量控制。您可以通过各种命令行选项对其进行调整,我们将在本节中讨论这些选项。
所有 IP 接口都需要分配 IP 地址;PPP 设备始终具有 IP 地址。PPP 协议套件提供了一种机制,允许自动为 PPP 接口分配 IP 地址。点对点链路一端的 PPP 程序可以为远程端分配要使用的 IP 地址,或者两端都可以使用自己的 IP 地址。
一些处理大量客户端站点的 PPP 服务器动态分配地址;地址仅在呼叫时分配给系统,并在注销后回收。这允许将所需的 IP 地址数量限制为拨号线路的数量。虽然限制对于 PPP 拨号服务器的管理员来说很方便,但对于拨号用户来说通常不太方便。我们在第 6 章中讨论了通过使用数据库将主机名映射到 IP 地址的方式。为了让人连接到您的主机,他们必须知道您的 IP 地址或与之关联的主机名。如果您是动态分配 IP 地址的 PPP 服务的用户,那么在不提供某种允许在分配 IP 地址后更新 DNS 数据库的方法的情况下,这种知识是难以获得的。这种系统确实存在,但我们不会在此处详细介绍它们;相反,我们将关注更可取的方法,即您每次建立网络连接时都能够使用相同的 IP 地址。[1]
在前面的示例中,我们让 pppd 拨号连接 c3po 并建立 IP 链路。没有采取任何措施来选择链路两端的特定 IP 地址。相反,我们让 pppd 采取其默认操作。它尝试将本地主机名 vlager(在我们的示例中)解析为 IP 地址,并将其用于本地端,同时让远程计算机 c3po 提供自己的 IP 地址。PPP 支持此安排的几种替代方案。
要请求特定地址,您通常需要为 pppd 提供以下选项
local_addr:remote_addr |
local_addr和remote_addr可以以点分十进制表示法或主机名形式指定。[2] 此选项使 pppd 尝试使用提供的第一个地址作为其自己的 IP 地址,第二个地址作为对等方的 IP 地址。如果在 IPCP 协商期间对等方拒绝了任何一个地址,则不会建立 IP 链路。[3]
如果您拨号连接到服务器并期望它为您分配 IP 地址,则应确保 pppd 不会尝试为自己协商一个。为此,请使用noipdefault选项并留空local_addr。该noipdefault选项将阻止 pppd 尝试使用与主机名关联的 IP 地址作为本地地址。
如果您只想设置本地地址,但接受对等方使用的任何地址,只需省略remote_addr部分。要使 vlager 使用 IP 地址 130.83.4.27 而不是自己的地址,请在命令行中给出130.83.4.27:。同样,要仅设置远程地址,请将local_addr字段留空。默认情况下,pppd 将使用与您的主机名关联的地址。
设置网络接口后,pppd 通常会仅为其对等方设置主机路由。如果远程主机位于 LAN 上,您当然也希望能够连接到“位于”对等方后面的主机;在这种情况下,必须设置网络路由。
我们已经看到可以使用 pppd 要求设置默认路由,使用defaultroute选项。如果您拨号连接的 PPP 服务器充当您的互联网网关,则此选项非常有用。
反向情况,即您的系统充当单个主机的网关,也相对容易实现。例如,假设虚拟啤酒厂的某位员工的家用机器名为 oneshot。我们还假设我们将 vlager 配置为拨入 PPP 服务器。如果我们已将 vlager 配置为动态分配属于啤酒厂子网的 IP 地址,那么我们可以将proxyarp选项与 pppd 一起使用,这将为 oneshot 安装代理 ARP 条目。这会自动使 oneshot 可以从啤酒厂和葡萄酒厂的所有主机访问。
但是,事情并不总是那么简单。连接两个局域网通常需要添加特定的网络路由,因为这些网络可能具有自己的默认路由。此外,让两个对等方都使用 PPP 链路作为默认路由将生成一个环路,未知目的地的包将在对等方之间来回弹跳,直到它们的生存时间到期。
假设虚拟啤酒厂在另一个城市开设了一个分公司。该子公司运行自己的以太网,使用 IP 网络号 172.16.3.0,这是啤酒厂 B 类网络的子网 3。该子公司希望通过 PPP 连接到啤酒厂的网络以更新客户数据库。同样,vlager 充当啤酒厂网络的网关,并将支持 PPP 链路;其在新分公司的对等方名为 vbourbon,IP 地址为 172.16.3.1。此网络在附录 A 中的图 A-2中进行了说明。
当 vbourbon 连接到 vlager 时,它使默认路由像往常一样指向 vlager。但是,在 vlager 上,我们将只有到 vbourbon 的点对点路由,并且必须专门配置子网 3 的网络路由,该路由使用 vbourbon 作为其网关。我们可以在建立 PPP 链路后手动使用 route 命令来手动执行此操作,但这不是很实用的解决方案。幸运的是,我们可以使用 pppd 的一个我们尚未讨论的功能(ip-up 命令)自动配置路由。此命令是位于/etc/ppp中的 shell 脚本或程序,在配置 PPP 接口后由 pppd 执行。如果存在,则使用以下参数调用它
ip-up iface device speed local_addr remote_addr |
下表总结了每个参数的含义(在第一列中,我们显示了 shell 脚本用来引用每个参数的编号)
参数 | 名称 | 目的 |
---|---|---|
$1 | iface | 使用的网络接口,例如,ppp0 |
$2 | device | 使用的串行设备文件的路径名( /dev/tty,如果使用 stdin/stdout) |
$3 | speed | 串行设备的速度,单位为比特每秒 |
$4 | local_addr | 链路远程端的 IP 地址,以点分十进制表示法表示 |
$5 | remote_addr | 链路远程端的 IP 地址,以点分十进制表示法表示 |
在我们的例子中,ip-up 脚本可能包含以下代码片段:[4]
#!/bin/sh case $5 in 172.16.3.1) # this is vbourbon route add -net 172.16.3.0 gw 172.16.3.1;; ... esac exit 0 |
类似地,/etc/ppp/ip-down 可用于撤消 ip-up 的任何操作,在 PPP 链路再次断开后。因此,在我们的 /etc/ppp/ip-down 脚本中,我们将有一个 route 命令,用于删除我们在 /etc/ppp/ip-up 脚本中创建的路由。
但是,路由方案尚未完成。我们已经在两个 PPP 主机上设置了路由表条目,但到目前为止,任何一个网络上的主机都不知道 PPP 链路。如果子公司中的所有主机都将其默认路由指向 vbourbon,并且所有啤酒厂主机都默认路由到 vlager,则这不是一个大问题。如果不是这种情况,您唯一的选择通常是使用像 gated 这样的路由守护程序。在 vlager 上创建网络路由后,路由守护程序会将新路由广播到连接的子网上的所有主机。
[1] | 有关两种动态主机分配机制的更多信息,请访问 http://www.dynip.com/ 和 http://www.justlinux.com/dynamic_dns.html。 |
[2] | 在此选项中使用主机名会对 CHAP 身份验证产生影响。请参阅本章后面的第 8.8 节。 |
[3] | 选项ipcp-accept-local和ipcp-accept-remote指示您的 pppd 接受远程 PPP 提供的本地和远程 IP 地址,即使您在配置中提供了一些地址。如果未配置这些选项,您的 pppd 将拒绝任何协商所用 IP 地址的尝试。 |
[4] | 如果我们希望在其他站点拨入时为其创建路由,我们将在示例中添加适当的 case 语句来涵盖这些情况,其中...出现在示例中。 |