我们在前面已经看到,可以要求 pppd 使用 defaultroute 选项来设置默认路由。如果您拨号连接的 PPP 服务器将充当您的互联网网关,则此选项非常有用。
反过来的情况,即您的系统充当单个主机的网关,也相对容易实现。例如,以 Virtual Brewery 的一位员工为例,他的家用机器名为 loner。当通过 PPP 连接到 vlager 时,他使用 Brewery 子网上的地址。在 vlager 上,我们现在可以为 pppd 提供 proxyarp 选项,这将为 loner 安装一个代理 ARP 条目。这将自动使 Brewery 和 Winery 的所有主机都可以访问 loner。
但是,情况并非总是那么容易,例如当连接两个局域网时。这通常需要添加特定的网络路由,因为这些网络可能具有自己的默认路由。此外,让两个对等方都使用 PPP 链路作为默认路由会产生一个环路,其中发往未知目的地的数据包将在对等方之间来回弹跳,直到其生存时间到期。
举例来说,假设 Virtual Brewery 在另一个城市开设了一个分公司。该子公司运行自己的以太网,使用 IP 网络号 191.72.3.0,这是 Brewery 的 B 类网络的子网 3。他们希望通过 PPP 连接到 Brewery 的主以太网,以更新客户数据库等。同样,vlager 充当网关;它的对等方称为 sub-etha,IP 地址为 191.72.3.1。
当 sub-etha 连接到 vlager 时,它将像往常一样使默认路由指向 vlager。但是,在 vlager 上,我们将必须为子网 3 安装一个通过 sub-etha 的网络路由。为此,我们使用 pppd 的一个尚未讨论过的功能——ip-up 命令。这是一个位于 /etc/ppp 中的 shell 脚本或程序,在 PPP 接口配置完成后执行。如果存在,则使用以下参数调用它
ip-up iface device speed local addr remote addr其中 iface 命名了使用的网络接口,device 是使用的串行设备文件的路径名(如果使用 stdin/stdout,则为 /dev/tty),speed 是设备的速度。local_addr 和 remote_addr 以点分十进制表示法给出链路两端使用的 IP 地址。在我们的例子中,ip-up 脚本可能包含以下代码片段
#!/bin/sh case $5 in 191.72.3.1) # this is sub-etha route add -net 191.72.3.0 gw 191.72.3.1;; esac exit 0以类似的方式,/etc/ppp/ip-down 用于在 PPP 链路再次断开后撤消 ip-up 的所有操作。
但是,路由方案尚未完成。我们已经在两个 PPP 主机上设置了路由表条目,但到目前为止,两个网络上的所有其他主机都不知道 PPP 链路的任何信息。如果子公司中的所有主机都将其默认路由指向 sub-etha,并且所有 Brewery 主机都默认路由到 vlager,则这不是一个大问题。如果不是这种情况,您通常唯一的选择是使用像 gated 这样的路由守护进程。在 vlager 上创建网络路由后,路由守护进程会将新路由广播到连接的子网上的所有主机。