Wireguard 将流量转发到主机

Wireguard 将流量转发到主机

我在 pi 上使用 Wireguard 作为 docker 容器。我在 pi 上运行了其他几个服务,我希望这些服务只能通过 wireguard 连接访问。wireguard 服务器创建了一个接口wg0和一个子网10.8.0.0/24。从容器内部,我能够通过它连接到主机,172.17.0.1因此我搜索并能够在容器内创建以下配置:

iptables -t nat -A PREROUTING -d 10.8.0.1/32 -j DNAT --to-destination 172.17.0.1

这使我能够从 wireguard 客户端连接到 wireguard 主机 ip 10.8.0.1,并通过这种方式连接到和其他容器上运行的所有服务。

除了源 IP 显示来自 docker 容器的 IP 外,其他一切都正常。

我有 3 个问题:

  1. 有没有办法将源 IP 显示为10.8.0.2(Wireguard 客户端 IP)?
  2. 这会带来安全风险吗?
  3. 有一个更好的方法吗?

我知道我也可以使用 docker 主机模式而不是桥接模式,但这也带来了一系列挑战。我也知道我可以172.17.0.1从 vpn 客户端访问。但当同时连接到多个 vpn 时,这种方法不起作用。

提前谢谢了。

答案1

  1. 有没有办法将源 IP 显示为 10.8.0.2(Wireguard 客户端 IP)?

您可能还在容器中运行一个如下所示的 iptables 规则:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这就是改变通过 WireGuard 容器转发的连接的源 IP 的原因。使用您当前的方法,为了避免使用此规则,您必须调整每个其他容器中的路由,以使用 WireGuard 容器作为其到远程 WireGuard 客户端的网关。

  1. 这会带来安全风险吗?

远程 WireGuard 客户端可以访问 WireGuard 容器本身可以访问的任何网络服务。

  1. 有一个更好的方法吗?

最简单的替代方法是将其他容器启动到 WireGuard 容器自己的网络命名空间中,如下所示:

首先,启动一个带有名称的 WireGuard 容器,例如my-wg-container

sudo docker run \
    --cap-add NET_ADMIN \
    --name my-wg-container \
    --publish 51820:51820/udp \
    --rm \
    --volume /srv/my-wg-container/conf:/etc/wireguard \
    procustodibus/wireguard

然后,将其他容器启动到 WireGuard 容器的网络命名空间中,并选择--network container:my-wg-container

sudo docker run \
    --name my-web-server \
    --network container:my-wg-container \
    --rm \
    nginx

如果 WireGuard 容器使用10.8.0.1为其 WireGuard 接口的地址(如您的示例所示),您可以从远程 WireGuard 客户端访问my-web-server容器中运行的 Web 服务器。请参阅http://10.8.0.1/用于容器网络本节WireGuard 容器指南以获得完整的例子。

通过这种方法,您不必对其他容器执行任何特殊操作(除了将它们附加到 WireGuard 容器),并且远程 WireGuard 客户端只能访问附加容器中的服务(而不是 WireGuard 容器可访问的任何其他网络服务)。

相关内容