如何将 WireGuard 容器添加到内部 Docker 网络以添加互联网连接?

如何将 WireGuard 容器添加到内部 Docker 网络以添加互联网连接?

我有两个 Docker 网络:

  • publicbridge这是一个可以访问主机上游网络的正常网络
  • private这是一个bridgeinternal: true并托管着一批集装箱
networks:
  public:
    driver: bridge
  private:
    driver: bridge
    internal: true
    ipam:
      config:
        - subnet: 172.22.0.0/24
          gateway: 172.22.0.1

我想将我的容器队列与主机上游网络隔离,所以我将它们放入内部网络中。但是,这些主机仍然需要互联网访问,我希望通过 WireGuard 将其提供给公共 VPN 服务。因此,我将容器部署到和网络lscr.io/linuxserver/wireguard:latest中,并在网络中使用静态 IP 。publicprivateprivate

另外,我还shprivate容器开发了一个小脚本来修改路由表(需要NET_ADMIN功能):

#!/bin/sh

# Get IP address of `wireguard` container
wireguard_ip=$(getent hosts wireguard | awk '{ print $1 }')

# Update route table
ip route del default
ip route add default via $wireguard_ip

所以现在我的private容器将所有流量都发送到wireguard容器。但是,容器仍然无法访问互联网。这是我的wg0.conf

[Interface]
PrivateKey = herpderp
Address = 10.x.x.x/32
DNS = 10.x.x.x
PostUp = iptables -t nat -A POSTROUTING -o wg+ -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o wg+ -j MASQUERADE

[Peer]
PublicKey = herpderp
AllowedIPs = 0.0.0.0/0
Endpoint = ip:port

PostUp我认为剩下要做的是在和中进行额外的网络配置PreDown,但目前我对此还不够熟悉。

public网络由 Docker Compose 自动生成,当前具有以下随机 CIDR 172.29.0.0/16:。

网络privateCIDR 固定为172.22.0.0/24

在 wireguard 容器中使用终端,我可以看到有 3 个接口 - eth0eth1wg0。目前尚不清楚 Docker 如何决定private/public网络中的哪个变为eth0eth1,但看起来public网络始终变为eth0private网络eth1(同样,算法对我来说不清楚,如果您知道请告诉我)。

我需要做哪些额外的配置(特别是wg0.conf)来为网络中的容器添加互联网连接private

我使用 Docker Desktop for Mac v4.16.2 和 Docker Compose。

相关内容