如果这是一个微不足道的问题,我很抱歉。我花了 3 天时间试图解决这个问题,所以我确实尝试自己寻找解决方案。
我有一个主机,它有两个网络接口,通过两个不同的网关/IP。一个直接连接到主机(浮动 IP),另一个通过路由器(网关)。(OpenStack 基础设施)
我无法通过网关进行端口转发,因此要连接到 VPN,我必须使用浮动 IP。但是,由于 IP 白名单,我必须通过网关从对等端访问互联网。
ubuntu server 22.04实例上的两个网络接口设置正确。
ens3 是浮动 IP。它也是默认的。执行curl ifconfig.me --interface ens3
或时,curl ifconfig.me
它会产生浮动 IP。
ens7 是网关。执行curl ifconfig.me --interface ens7
此操作时会生成网关 IP。
即使 wireguard 连接在 ens3 上,我该如何强制 wireguard 通过 ens7 发送出站流量(即连接到 wireguard 的对等方的请求)?
- 到目前为止,我已尝试通过将 ens7 设为默认路由来重新路由流量,但它似乎断开了与实例的连接。
- 我进一步尝试使用 ens7 而不是 ens3 来运行 POSTUP 设置,但也没有用。我不认为这样做会有效,但还是尝试了。
答案1
如果您实际上需要通过与接收流量不同的物理网络接口发送隧道 WireGuard 流量,则可能需要两个单独的 WireGuard 接口(每个物理接口一个)。
但是,你可能想太多了。你可能不需要使用这两个接口——你可能只需要通过其中一个物理网络接口设置 WireGuard 隧道,并使用 WireGuard 的持久保持功能保持隧道畅通以进行双向通信。
我们将具有两个接口的主机称为“主机 A”,将您尝试通过 WireGuard 进行通信的主机称为“主机 B”。以下是执行此操作的三种常用方法:
1. 主机 A 建立到主机 B 的隧道
如果主机 A 可以发起与主机 B 的公共 IP 地址和 WireGuard 监听端口的连接(例如通过主机 A 的 ens7 接口),则使用主机 B 的公共 IP 地址和 WireGuard 监听端口配置主机 A(通过设置Endpoint
),并向其中添加一个PersistentKeepalive
设置:
# /etc/wireguard/wg0.conf on Host A
[Interface]
...
# connection to Host B
[Peer]
...
Endpoint = <Host B public IP>:<Host B listen port>
PersistentKeepalive = 25
当您在主机 A 上启动 WireGuard 接口时,它将尝试与主机 B 建立 WireGuard 连接,并每 25 秒向主机 B 发送一个保持活动数据包。这些保持活动数据包应通过主机 A 和主机 B 之间的任何防火墙保持连接畅通,从而允许两个主机根据需要相互发送和接收流量(PersistentKeepalive
根据需要调整秒数以确保触发这些防火墙保持连接状态处于活动状态)。
在这种情况下,不在主机 B 的 WireGuard 配置中包含Endpoint
或设置。PersistentKeepalive
2. 主机 B 建立到主机 A 的隧道
如果主机 B 可以发起与主机 A 的公共 IP 地址和 WireGuard 监听端口的连接(例如通过主机 A 的 ens3 接口),则改为使用主机 A 的公共 IP 地址和 WireGuard 监听端口配置主机 B(通过设置),并向主机 BEndpoint
添加一个设置:PersistentKeepalive
# /etc/wireguard/wg0.conf on Host B
[Interface]
...
# connection to Host A
[Peer]
...
Endpoint = <Host A public IP>:<Host A listen port>
PersistentKeepalive = 25
在这种情况下,当你在主机 B 上启动 WireGuard 接口时,它将尝试与主机 A 建立 WireGuard 连接,并每 25 秒向主机 A 发送一个 keepalive 数据包。不在这种情况下,在主机 A 的 WireGuard 配置中包含Endpoint
或设置。PersistentKeepalive
3. 主机 A 和主机 B 都建立了到第三台主机的隧道
如果主机 A不能发起与主机 B 的公共 IP 地址和 WireGuard 监听端口的连接,并且主机 B不能启动与主机 A 的公共 IP 地址和 WireGuard 监听端口的连接,在其他位置设置第三个主机“主机 C”,该主机具有公共 IP 地址和 WireGuard 监听端口,主机 A 和主机 B 都可以连接到该主机。
使用主机 C 的公共 IP 地址和 WireGuard 监听端口配置主机 A 和主机 B,并PersistentKeepalive
在两者中添加设置:
# /etc/wireguard/wg0.conf on Host A
[Interface]
...
# connection to Host C
[Peer]
...
Endpoint = <Host C public IP>:<Host C listen port>
PersistentKeepalive = 25
(主机 B 也一样):
# /etc/wireguard/wg0.conf on Host B
[Interface]
...
# connection to Host C
[Peer]
...
Endpoint = <Host C public IP>:<Host C listen port>
PersistentKeepalive = 25
然后将主机 C 配置为WireGuard 集线器,通过主机 A 和主机 B 之间的 WireGuard 连接来回转发流量。