重定向网关
示例:将默认网关重定向到 VPN 上的主机
可以让一个节点将其所有网络流量转发到 VPN 上的主机,从而有效地使用此 VPN 主机作为默认网关。在 OpenVPN 中,有一个 --redirect-gateway为客户端执行此操作的选项。使用 tinc,没有这样的选项,但可以使用 host-up 和 host-down 脚本复制此行为。首先解释重定向默认网关背后的理论,然后是示例脚本。
示例:将默认网关重定向到 VPN 上的主机
理论
脚本
进一步配置
路由器与交换机模式
理论
通常,路由表中有两个条目。一个是本地网络的路由,它告诉内核哪些 IP 地址可直接访问。第二个是“默认网关”,它告诉内核,为了到达互联网的其余部分,流量应发送到本地网络的网关。通常网关是路由器或防火墙设备,其 IPv4 地址通常以 结尾.1。Linux 上的示例输出route -n:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
这里,LAN 的 IPv4 地址范围为 192.168.1.0/24,网关为 192.168.1.1。假设我们有一个地址范围为 172.16.0.0/16 的 VPN,其中存在一个地址为 172.16.1.1 的服务器。如果我们有一个 VPN 连接,并且客户端想要用指向 172.16.1.1 的默认路由替换标准默认路由,那么就会出现问题:内核不再知道如何将封装的 VPN 数据包发送到服务器。因此,我们需要为 VPN 服务器的真实 IP 地址的流量添加例外。假设其真实地址为 192.0.32.10,则路由表应变为:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 vpn
192.0.32.10 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0 vpn
这将确保本地 LAN 可达、VPN 服务器的真实 IP 地址可通过原始网关可达、VPN 服务器的 VPN IP 地址可通过 VPN 接口可达,并且所有其他流量都通过 VPN 上的服务器进行。
最好不要删除原始默认网关路由,因为有人可能会终止该tincd进程,这样它就没有机会恢复原始路由。相反,我们使用一个技巧,即添加两个 /1 路由而不是一个 /0 路由:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 vpn
192.0.32.10 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
128.0.0.0 172.16.1.1 128.0.0.0 UG 0 0 0 vpn
0.0.0.0 172.16.1.1 128.0.0.0 UG 0 0 0 vpn
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
由于两个 /1 覆盖所有可能的地址,因此当存在两个 /1 路由时,永远不会使用真正的默认路由。
脚本
假设我们有两个节点,分别称为client和 server,网络名称为myvpn。此外,我们假设服务器已正确配置为在 VPN 和 Internet 之间为将其用作默认网关的客户端执行路由或伪装。然后,客户端上只需要两个脚本。以下脚本是 Linux 专用的:
/etc/tinc/myvpn/hosts/server-up:
#!/bin/sh
VPN_GATEWAY=172.16.1.1
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
ip route add $REMOTEADDRESS $ORIGINAL_GATEWAY
ip route add $VPN_GATEWAY dev $INTERFACE
ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
/etc/tinc/myvpn/hosts/server-down:
#!/bin/sh
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
ip route del $REMOTEADDRESS $ORIGINAL_GATEWAY
ip route del $VPN_GATEWAY dev $INTERFACE
ip route del 0.0.0.0/1 dev $INTERFACE
ip route del 128.0.0.0/1 dev $INTERFACE
这些脚本使用 iproute2 命令,因为它们更易于使用。VPN_GATEWAY必须手动填写变量。ORIGINAL_GATEWAY变量从原始默认路由复制相关信息,以创建到 VPN 服务器的例外路由。
进一步配置
还必须确保 tinc 守护进程知道将所有数据包发送到哪个节点。确保以下行位于 /etc/tinc/myvpn/hosts/server:
Subnet = 0.0.0.0/0
确保服务器上设置了伪装或其他形式的路由。不要忘记允许转发数据包;检查防火墙设置,并确保内核中启用了转发:
echo 1 >/proc/sys/net/ipv4/ip_forward
您还可以设置端口转发或代理,以便能够从 Internet 的其余部分连接到客户端上运行的服务。
路由器与交换机模式
上述示例适用于路由器和交换机模式。然而,在路由器模式下,实际上没有网关路由。在该模式下,tinc-up 脚本中的以下四行:
VPN_GATEWAY=...
ip route add $VPN_GATEWAY dev $INTERFACE
ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
可以用下面两行替换,没有任何问题:
ip route add 0.0.0.0/1 dev $INTERFACE
ip route add 128.0.0.0/1 dev $INTERFACE
上一篇: 简单桥接与 DHCP 客户端
下一篇: 代理 ARP 作为桥接的替代方案