想要将 GRE 设置为默认网络

想要将 GRE 设置为默认网络

我配置了 2 台服务器,服务器 A 和服务器 B。(我已遵循本教程:https://community.hetzner.com/tutorials/linux-setup-gre-tunnel

我已使用服务器 A 建立到服务器 B 的 GRE 隧道(这意味着发送到服务器 A 的所有流量都应路由到服务器 B 并仅从那里提供服务)。我现在想做的是,当我在服务器 A 的终端上使用“curl ip.me”时,它会显示服务器 B 的 IP,我希望它仅使用服务器 A 的公共 IPv4 地址,以便它仅将所有流量路由到服务器 B,(就像我执行“curl ip.me --interface 10.0.0.2”时发生的情况一样)。

所以我的问题是如何使接口 10.0.0.2 成为我的服务器所有传出流量的默认接口,而无需在命令中指定它?

谢谢您的任何意见!

答案1

让我们建立以下具体的寻址方案(因为您没有提供任何方案):

  • 服务器A
    • eno1:地址198.51.100.2/24,网关198.51.100.1
    • gre1:远程192.0.2.2,本地198.51.100.2,地址10.0.0.1/30
  • 服务器B
    • eno1: 192.0.2.2/24,网关192.0.2.1
    • gre1:远程198.51.100.2,本地192.0.2.2,地址10.0.0.2/30

请注意,GRE 接口的本地和远程属性互为镜像,并且它们的地址属于同一个 /30 子网。在这种情况下(如果其他一切都设置正确,例如防火墙、IPsec 等),服务器将能够使用10.0.0.x地址通过隧道相互 ping 通。在物理网络上,您将观察到它们的公共 IP 地址之间的 GRE流量198.51.100.2192.0.2.2

服务器上的路线B目前如下:

default via 192.0.2.1
192.0.2.0/24 dev eno1 src 192.0.2.2
10.0.0.0/30 dev gre1 src 192.0.2.2

您只需要192.0.2.1(直接)用于支持 GRE,其他一切都将通过 GRE 隧道进行路由。这可以通过添加一条A 198.51.100.2通过前一个网关通向 的路由,并将A的 GRE 地址设置为新网关来实现。 上的路由表B变为:

default via 10.0.0.1
198.51.100.2 via 192.0.2.1
192.0.2.0/24 dev eno1 src 192.0.2.2
10.0.0.0/30 dev gre1 src 192.0.2.2

为了使服务器B能够访问互联网,您需要在主机上对其进行源 NAT A,例如:

iptables -t nat -A POSTROUTING -s 10.0.0.2 -o eno1 -j MASQUERADE

并且,如果您想在 上发布服务B,则需要在 上对它们进行目标 NAT A,例如:

iptables -t nat -A PREROUTING -i eno1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.0.0.2

主机将只能从其“本地”网络(在本例中为 )中的B主机和主机直接访问。所有其他主机将看到其流量来自和 地址,如果它们希望使用任何已发布的服务,则需要与 进行通信。A192.0.2.0/24A198.51.100.2A

也可以使 B 直接访问,强制其本地网络中的主机也通过 A 并以其他方式增强系统,但这需要更复杂的设置,包括策略路由和更精细的防火墙设置。

此外,我必须建议您不要使用普通的 GRE(并且根本不要使用 GRE)。它本身完全不受保护,因此至少您必须使用 IPsec(在A和之间的传输模式下B)。它仍然很难在 NAT 后面工作。更好、更简单的方法是用 WireGuard 替换它,无论您使用哪种隧道技术,路由设置都将保持不变。OpenVPN 最简单,因为它甚至可以构建此精确配置自动地一旦建立了隧道,您需要A作为服务器和B客户端 — 如果启用,在建立连接期间,它将确定“前”网关并向 VPN 服务器添加直接路由,然后用隧道端点替换默认路由,实现所述的路由设置。OpenVPN 与 WireGuard 相比的一个缺点是性能要低得多。

答案2

简单来说 - 你不能,因为隧道接口从属于物理接口:它需要来自其父级的隧道源。

相关内容