我有一台 Debian 服务器,它与位于 NAT 后面的盒子建立了 Wireguard 连接。盒子的 Wireguard IP 为 192.168.60.2,而服务器的 Wireguard IP 为 192.168.60.1。服务器上正在运行一些 Docker 容器。我希望能够为一些容器分配 192.168.60.0/24 子网上的 IP,这样当来自容器的请求进入时,我就可以通过盒子上的 IP 区分容器。
当我启动没有特殊网络配置的容器时,即使用标准桥接驱动程序,我可以通过其 IP 192.168.60.2 访问该盒子,但是,原始 IP 是服务器的(192.168.60.1)。
我尝试使用 Docker 的 IPVLAN 网络驱动程序,但这需要实际的以太网接口而不是隧道。
我怎样才能实现这个目标?
编辑:在使用创建Docker 网络docker network create --driver=bridge --subnet=192.168.60.0/24 my-net
并使用启动虚拟容器后docker run -it --rm --network=my-net --ip=192.168.60.10 alpine
,我仍然无法让它工作。
服务器上的 Wireguard 设置如下:
[Interface]
PrivateKey = *** REDACTED ***
ListenPort = 51821
Address = 192.168.60.1/24
[Peer]
PublicKey = *** REDACTED ***
AllowedIPs = 192.168.60.2/32 # I also tried setting this to /24
在盒子的Wireguard设置中Address
设置为192.168.60.2/32,并AllowedIPs
设置为192.168.60.0/24。
我检查了防火墙计数器,我不认为这是阻止数据包的原因。但是,查看路由表时,这似乎很可疑:
192.168.60.0/24 dev wg1 proto kernel scope link src 192.168.60.1
192.168.60.0/24 dev br-df2fc584e6b0 proto kernel scope link src 192.168.60.1
wg1
是Wireguard接口,br-df2fc584e6b0
与Docker bridge相对应my-net
。更多详细信息:
$ ip a show dev br-df2fc584e6b0
184: br-df2fc584e6b0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:98:27:08:23 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.1/24 brd 192.168.60.255 scope global br-df2fc584e6b0
valid_lft forever preferred_lft forever
inet6 fe80::42:98ff:fe27:823/64 scope link
valid_lft forever preferred_lft forever
$ ip a show dev wg1
177: wg1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.60.1/24 scope global wg1
valid_lft forever preferred_lft forever
edit2:我可以通过使 IP 子网不重叠来解决这个问题,即 Wireguard 接口的地址为 192.168.60.1/28,而桥接网络分配了子网 192.168.60.16/28。此外,我创建了桥接网络以com.docker.network.bridge.enable_ip_masquerade=false
保留原始 IP。
答案1
您可以在 Docker 中创建自定义桥接网络,然后将容器连接到该网络。
1.
docker network create --driver=bridge --subnet=192.168.60.0/24 mynetwork
docker run --network=mynetwork --ip=192.168.60.x -d your_container_image
确保您的 WireGuard 设置允许来自 Docker 桥接网络的流量。更新您的 WireGuard 配置以允许来自 Docker 桥接子网 (192.168.60.0/24) 的流量。更新
AllowedIPs
WireGuard 客户端和服务器端,然后确保重新启动 WireGuard。