从 Docker 容器访问主机的 wireguard

从 Docker 容器访问主机的 wireguard

我有一台 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) 的流量。更新 AllowedIPsWireGuard 客户端和服务器端,然后确保重新启动 WireGuard。

相关内容