我在 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 个问题:
- 有没有办法将源 IP 显示为
10.8.0.2
(Wireguard 客户端 IP)? - 这会带来安全风险吗?
- 有一个更好的方法吗?
我知道我也可以使用 docker 主机模式而不是桥接模式,但这也带来了一系列挑战。我也知道我可以172.17.0.1
从 vpn 客户端访问。但当同时连接到多个 vpn 时,这种方法不起作用。
提前谢谢了。
答案1
- 有没有办法将源 IP 显示为 10.8.0.2(Wireguard 客户端 IP)?
您可能还在容器中运行一个如下所示的 iptables 规则:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
这就是改变通过 WireGuard 容器转发的连接的源 IP 的原因。使用您当前的方法,为了避免使用此规则,您必须调整每个其他容器中的路由,以使用 WireGuard 容器作为其到远程 WireGuard 客户端的网关。
- 这会带来安全风险吗?
远程 WireGuard 客户端可以访问 WireGuard 容器本身可以访问的任何网络服务。
- 有一个更好的方法吗?
最简单的替代方法是将其他容器启动到 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 容器可访问的任何其他网络服务)。