禁止从 Docker 上的 Docker 个容器出口 Mac

Disallow egress from Docker containers on Docker for Mac

我想禁用所有由 docker 容器发起的与外界的传出连接。我可以在 linux 中通过向 linux 中的 FORWARD 链添加规则来完成此操作。我如何在 Docker 中为 Mac 执行此操作?

我发现 Docker for Mac 使用 xhyve 虚拟机,这就是 docker0 接口所在的位置。这连接到主机中的哪个接口?我在 Mac 上使用 nettop,我看到 Docker 使用我的 en0 无线接口。但是,我不确定 Docker 和 xhyve 是否使用相同的界面。

编辑:添加了 docker-for-windows 标签,因为他们可能有类似的解决方案(希望)

编辑 2:Mac 的 Docker 已更改,因此接受的解决方案略有更改

试试Mac的pfctl命令,它有点等同于iptables。

这是手册页:https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man8/pfctl.8.html

Docker

$ docker run --net=host --privileged -ti alpine sh
# apk update && apk add iptables
# iptables -vnL

这个和规则可以变成 Dockerfile 和 运行 带有 -- restart 选项。我认为 on-failure 可能会在 Docker for Mac 启动时重新应用规则。

虚拟 Mac网络

要访问 linux 虚拟机:

mac$ brew install screen
mac$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

自从搬到 linuxkit,这不是一般的 linux 主机,一切都是容器:

linuxkit:~# ctr -n services.linuxkit tasks ls
TASK                    PID     STATUS    
acpid                   925     RUNNING
diagnose                967     RUNNING
host-timesync-daemon    1116    RUNNING
ntpd                    1248    RUNNING
vpnkit-forwarder        1350    RUNNING
docker-ce               1011    RUNNING
kubelet                 1198    RUNNING
trim-after-delete       1303    RUNNING
vsudd                   1398    RUNNING

使用runc移动到docker-ce(或docker)命名空间

linuxkit:~# runc --root /run/containerd/runc/default exec -t docker-ce /bin/sh
docker-ce # iptables -vnL

请注意,Mac 的 Docker 重启后规则将消失。我还没有找到持久系统更改的秘密武器。

使用ctrl-a然后d退出屏幕会话否则你会很无聊终点站。

OSX

对于 easy but € 选项,使用 Little Snitch 并阻止来自 com.docker.supervisor via vpnkit 的 OSX 上的出站连接。