我有两个 Docker 网络:
public
bridge
这是一个可以访问主机上游网络的正常网络private
这是一个bridge
,internal: 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 。public
private
private
另外,我还sh
为private
容器开发了一个小脚本来修改路由表(需要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
:。
网络private
CIDR 固定为172.22.0.0/24
在 wireguard 容器中使用终端,我可以看到有 3 个接口 - eth0
、eth1
和wg0
。目前尚不清楚 Docker 如何决定private
/public
网络中的哪个变为eth0
或eth1
,但看起来public
网络始终变为eth0
和private
网络eth1
(同样,算法对我来说不清楚,如果您知道请告诉我)。
我需要做哪些额外的配置(特别是wg0.conf
)来为网络中的容器添加互联网连接private
?
我使用 Docker Desktop for Mac v4.16.2 和 Docker Compose。