我配置了 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.2
。192.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
主机和主机直接访问。所有其他主机将看到其流量来自和 地址,如果它们希望使用任何已发布的服务,则需要与 进行通信。A
192.0.2.0/24
A
198.51.100.2
A
也可以使 B 直接访问,强制其本地网络中的主机也通过 A 并以其他方式增强系统,但这需要更复杂的设置,包括策略路由和更精细的防火墙设置。
此外,我必须建议您不要使用普通的 GRE(并且根本不要使用 GRE)。它本身完全不受保护,因此至少您必须使用 IPsec(在A
和之间的传输模式下B
)。它仍然很难在 NAT 后面工作。更好、更简单的方法是用 WireGuard 替换它,无论您使用哪种隧道技术,路由设置都将保持不变。OpenVPN 最简单,因为它甚至可以构建此精确配置自动地一旦建立了隧道,您需要A
作为服务器和B
客户端 — 如果启用,在建立连接期间,它将确定“前”网关并向 VPN 服务器添加直接路由,然后用隧道端点替换默认路由,实现所述的路由设置。OpenVPN 与 WireGuard 相比的一个缺点是性能要低得多。
答案2
简单来说 - 你不能,因为隧道接口从属于物理接口:它需要来自其父级的隧道源。