6. 路由

穿透防火墙并非全部。 您还必须将数据包从防火墙的客户端路由到服务器端。 本节介绍关于跨隧道路由的基本设置。 有关路由的更详细说明,请参阅有关网络、路由和伪装的相关 HOWTO 和手册页。

6.1. 注意事项

需要注意的是,尽管您的网络管理员可能会告诉您在客户端设置某个路由器作为默认路由(如果您希望有到防火墙客户端上网络的特定路由,这可能是相关的),您应该将 PPP 链接设置为到服务器端网络的路由。

换句话说,您的默认路由应该指向隧道两侧的任何一个,可以为您提供 Internet 访问的路由器。

最重要的是,作为运行隧道的一部分发送到服务器主机的数据包应该通过您的常用网络(例如,您的默认以太网路由器)进行路由; 否则,您的内核会出现问题,因为它会尝试通过隧道内部路由应该构成隧道外部的数据包。

因此,您需要在网络启动配置中设置正确的路由。 您的路由配置数据的确切位置取决于您的发行版,但通常位于/etc/init.d/network/etc/network/; 类似地,您的 PPP 配置通常位于/etc/ppp/,而配置其路由的正确位置通常是ip-upip-up.d/。(提示:要确定您的发行版特定的文件位置,您必须阅读发行版的文档,或者 RTFM; 或者使用 grep 递归地在您的/etc中查找; 最坏的情况下,跟踪启动时发生的事情,如您的/etc/inittab.)

中所配置的。

一旦你可以将数据包路由到隧道的服务器端,你可能想把你的机器设置为防火墙客户端上所有朋友的路由器,实现一个完整的共享 VPN。 这不是防火墙穿透特有的,所以你只需要阅读相关的关于网络、路由和伪装的 HOWTO。 此外,出于安全原因,请务必在您的机器上设置适当的防火墙,特别是如果您要成为其他人的路由器。

最后,请记住,如果您在隧道的服务器端使用 pppd(而不是用户模式 slirp),您也必须在隧道的服务器端配置正确的路由和防火墙规则。

6.2. 路由示例

在此示例中,您的客户端机器通过以太网设备连接到防火墙 LANeth0。 它的 IP 地址是12.34.56.78; 它的网络是12.34.56.0/24; 它的路由器是12.34.56.1.

您的网络管理员可能已经告诉您使用12.34.56.1作为默认路由器,但您不应该这样做。 您应该只将其用作到防火墙客户端的路由。

假设您的防火墙客户端由网络组成12.34.0.0/1612.13.0.0/16,以及主机11.22.33.44。 要使它们可以通过您的客户端路由器访问,请将以下路由添加到您的全局网络启动脚本
route add -net 12.34.0.0 netmask 255.255.0.0 gw 12.34.56.1
route add -net 12.13.0.0 netmask 255.255.0.0 gw 12.34.56.1
route add -host 11.22.33.44 gw 12.34.56.1
您还必须保留到客户端本地网络的路由,这对于 linux 内核 2.0 及更早版本是必需的,但对于 linux 内核 2.2 及更高版本是不必要的(它在 ifconfig 期间隐式添加它)
route add -net 12.34.56.0 netmask 255.255.255.0 dev eth0
另一方面,您必须从您的脚本中删除任何默认路由。 删除或注释掉如下行
route add default gw 12.34.56.1
请注意,也可以通过以下命令从运行中的内核配置中删除路由,而无需重新启动
route del default gw 12.34.56.1
然后,您可以让 pppd 在启动时通过使用其 defaultroute 选项自动设置默认路由。 或者,您可以稍后添加它
route add default gw 10.0.2.2
如果您不想要 pppd 作为默认路由,因为 Internet 访问在您的防火墙一侧可用,并且如果您希望网络98.76.48.0/20通过隧道路由,除了主机98.76.54.32作为隧道的另一端,然后将以下行添加到您的/etc/ppp/ip-up:
route add -host 98.76.54.32 gw 12.34.56.1
route add -net 98.76.48.0 netmask 255.255.240.0 gw 10.0.2.2
如果您是笔记本电脑并且您当前的 LAN 移动,但您仍然希望保持到98.76.54.32的当前路由,无论它是什么,请使用 getroute.pl 如下所示自动在 route add -host 命令中找到正确的网关
$(getroute.pl 98.76.54.32)
请注意,如果您的/etc/hosts中有它们,您可以使用符号名称而不是数字 IP 地址(如果相信 DNS 永远不会失败,您甚至可以使用 FQDN)。