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

Tho*_* F. 3 networking vpn routing iptables 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
Run Code Online (Sandbox Code Playgroud)

这是我当前网络上 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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

我看到这个问题分为三个部分:

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

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

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

您没有在问题中包含 WireGuard 配置,但听起来有问题的机器的 WireGuard 配置(我将其称为本地主机 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
Run Code Online (Sandbox Code Playgroud)

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

在您的场景中,听起来您想要通过主机 L 上的 wg0 的唯一流量是来自直接连接到 WireGuard 隧道另一端的特定远程主机(或多个类似远程主机)的流量;我将此称为主机 R(用于远程)。将主机 L 上的设置更改AllowedIPs为主机 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
Run Code Online (Sandbox Code Playgroud)

更改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
Run Code Online (Sandbox Code Playgroud)

然后删除您在 Host L 问题中提到的所有 iptables 规则,除了这两个规则:

iptables -I INPUT 1 -i wg0 -j ACCEPT
iptables -I INPUT 1 -i eth0 -p udp --dport 51820 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

更改其配置后重新启动 WireGuard,现在您应该能够使用主机 L 的 WireGuard IP 地址从主机 R 访问主机 L 上运行的任何服务。例如,如果您有一个 Web 服务器在主机 L 上的端口 3100 上运行,您应该能够从主机 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 上的度量为,而 wlan0100的度量为600,因此对于主机 L 发起的出站连接,主机 L 将尝试通过 wlan0 使用 eth0。如果您想扭转这种情况,并使 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
Run Code Online (Sandbox Code Playgroud)

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

ip route add default via 192.168.0.1 dev eth0 table 123
Run Code Online (Sandbox Code Playgroud)

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

ip rule add fwmark 0x7b table 123
Run Code Online (Sandbox Code Playgroud)

最后,在主机 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
Run Code Online (Sandbox Code Playgroud)

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