具有两个接口的 Wireguard 客户端 - 使用一个接口来管理 Wireguard

具有两个接口的 Wireguard 客户端 - 使用一个接口来管理 Wireguard

我正在尝试配置一个 Wireguard 客户端,该客户端当前设置为通过 Wireguard 路由所有流量,以便仅通过 Wireguard 路由一个网络接口。

例如:客户端同时具有 wlan0 和 eth0 接口,我想将流量从 eth0 路由到 wireguard,让 wlan0(及其所有流量)可访问互联网但不进行路由。

我不想使用 IP 地址来调整流量,因为客户端(SFF PC)会改变位置和网络,并且需要根据新分配的 IP 地址重新配置。

我在客户端上使用 docker 容器,这些容器配置为使用不同的网络接口执行不同的任务,并希望接口的流量在 eth0 和 wlan0 接口之间分配。

例如:我有一个带有容器控制面板的 Web 服务器,可以通过 eth0 接口(192.168.0.**:3100)公开的 IP 地址/端口组合访问。

我在远程控制和更新 Web 服务器时将它与 Wireguard 结合使用以进行维护(通过客户端通过 Wireguard 分配的 ip 地址(10.68.9.*:3100))。

同一台服务器使用 wlan0 接口为实际站点提供互联网服务——考虑到通过 Wireguard 的 eth0 接口的延迟会对往返站点的流量造成不利影响。

服务器和控制面板都通过计算机的本地网络进行通信。

每次为客户端启用 Wireguard 时,wlan0 都会被淘汰。

我尝试编写 PostUp/Down 规则,明确将流量从 eth0 路由到 Wireguard 并且不影响 wlan0,这样我就可以访问应用程序的控制面板,同时仍然可以通过 wlan0 访问它,但它们似乎不起作用。

以下是我对 postUp 的规则 - 除了 -I / -D 之外,与 postDown 相同

iptables -t nat -I POSTROUTING 1 -s <ip4-address> -o eth0 -j MASQUERADE;
ip6tables -t nat -I POSTROUTING 1 -s <ip6-address> -o eth0 -j MASQUERADE;
iptables -I INPUT 1 -i wg0 -j ACCEPT;
iptables -I FORWARD 1 -i eth0 -o wg0 -j ACCEPT;
iptables -I FORWARD 1 -i wg0 -o eth0 -j ACCEPT;
iptables -I INPUT 1 -i eth0 -p udp --dport 51820 -j ACCEPT

以下是我当前网络上的 ip route 的输出

default via 192.168.0.1 dev eth0 proto dhcp metric 100 
default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
169.254.0.0/16 dev eth0 scope link metric 1000 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.192 metric 100 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.105 metric 600

基本上:所有 eth0 流量都通过 Wireguard,所有 wlan0 流量则不通过。

答案1

我认为这个问题分为三个部分:

  1. 允许通过 WireGuard 远程访问主机服务
  2. 一个网络接口的默认路由首选项
  3. 通过其他网络接口路由某些流量

要达到 3,您必须修复 1 和 2。

1.允许通过 WireGuard 远程访问主机服务

您的问题中没有包含 WireGuard 配置,但听起来所讨论的机器的 WireGuard 配置(我将其称为本地的 Host L)看起来像这样:

# wg0 on Host L
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.68.9.2/32
ListenPort = 51820

[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 0.0.0.0/0

如果您将对等点的配置设置为AllowedIPs = 0.0.0.0/0,当 wg-quick 启动 wg0 接口时,它将在主机上设置一些路由规则,以通过 wg0 路由所有流量(除了您在主路由表中明确指定的任何非默认路由)。这似乎会“淘汰”除通过 WireGuard 之外的远程入站访问。

在您的场景中,听起来您希望通过主机 L 上的 wg0 的唯一流量是来自特定远程主机(或多个类似的远程主机)的流量,这些远程主机直接连接到 WireGuard 隧道的另一端;我将其称为主机 R(代表远程)。将AllowedIPs主机 L 上的设置更改为主机 R 仅使用该远程主机的 WireGuard IP 地址。

例如,如果主机 R 的 WireGuard 配置如下:

# wg0 on Host R
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
Address = 10.68.9.1/32

# connection to Host L
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
AllowedIPs = 10.68.9.2/32
Endpoint = 203.0.113.2:51820

更改AllowedIPs主机 L 上的设置,以用于10.68.9.1/32代表主机 R 的对等端:

# wg0 on Host L
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.68.9.2/32
ListenPort = 51820

# connection to Host R
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.68.9.1/32

然后删除您在问题中提到的有关主机 L 的所有 iptables 规则,除了这两条:

iptables -I INPUT 1 -i wg0 -j ACCEPT
iptables -I INPUT 1 -i eth0 -p udp --dport 51820 -j ACCEPT

更改配置后重新启动 WireGuard,现在您应该能够使用主机 L 的 WireGuard IP 地址从主机 R 访问主机 L 上运行的任何服务。例如,如果您在主机 L 的端口 3100 上运行了一个 Web 服务器,您应该能够以 的身份从主机 R 访问它http://10.68.9.2:3100

2. 一个网络接口的默认路由首选项

假设Endpoint主机 R 的 WireGuard 配置中的 IP 地址(203.0.113.2上文)是将 UDP 端口 51820 转发到的路由器的 IP 地址192.168.0.192,即主机 L 的 eth0 接口的 IP 地址,则您无需执行任何其他操作即可确保入站使用 WireGuard 的连接通过主机 L 的 eth0 接口(或入站使用主机 L 上的 wlan0 的 IP 地址连接到主机 L,192.168.0.105使用 wlan0 接口)。

但是,由于接口 eth0 上的度量为100,而 wlan0 上的度量为600,因此对于主机 L 发起的任何连接出站,主机 L 将尝试使用 eth0 而不是 wlan0。如果您想反转这一点,并使 wlan0 成为出站连接的首选,则需要重新配置一个或两个接口,以使 wlan0 的度量低于 eth0 的度量。这些答案涵盖了执行此操作的几个不同选项:

3. 通过其他网络接口路由某些流量

如果您将主机 L 上的 eth0 和/或 wlan0 的度量值更改为默认使用 wlan0 进行出站连接,那么如果您想确保主机 L 将通过 eth0 路由出站 WireGuard 连接,则需要进行一些路由更改。

如果主机 R 具有静态 IP 地址,则只需在主机 L 的主路由表中添加一条简单路由即可。假设主机 R 具有静态 IP 地址198.51.100.1。然后,您只需在主机 L 上添加此路由即可:

ip route add 198.51.100.1/32 via 192.168.0.1 dev eth0

但是,如果主机 R 没有固定 IP 地址(或固定地址池或地址范围),则必须为其设置一些策略路由。首先在主机 L 上添加自定义路由表(编号123,或其他未使用的表编号),并为 eth0 设置默认路由:

ip route add default via 192.168.0.1 dev eth0 table 123

然后添加一个策略规则,以便将此新表用于任何标记的数据包0x7b(或您想要使用的其他标记值):

ip rule add fwmark 0x7b table 123

最后,在主机 L 上配置 WireGuard,以使用以下标记来标记 WireGuard 发出的数据包0x7b(或上述策略规则使用的任何标记值):

# wg0 on Host L
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.68.9.2/32
ListenPort = 51820
FwMark = 0x7b

[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.68.9.1/32

重新启动 WireGuard。主机 L 现在将始终通过其 eth0 接口发送 WireGuard 流量。

相关内容