【问题标题】:Disallow egress from Docker containers on Docker for Mac禁止来自 Docker for Mac 上的 Docker 容器的出口
【发布时间】:2018-03-22 01:28:09
【问题描述】:

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

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

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

编辑 2:Docker for Mac 发生了变化,因此接受的解决方案发生了一些变化

【问题讨论】:

    标签: macos docker docker-for-windows docker-for-mac ipfw


    【解决方案1】:

    码头工人

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

    这和规则可以变成Dockerfile 并使用-- restart 选项运行。我认为on-failure 可能会在 Docker for 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
    

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

    使用 ctrl-a 然后 d 退出屏幕会话,否则您会破坏终端。

    OSX

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

    【讨论】:

    • 谢谢!这似乎是一种 hacky 方式,但我还没有遇到任何其他解决方案。会试一试。 Little Snitch 是一个不错的选择,但不适用于大规模部署。
    • iptables 规则似乎不起作用。在我的搜索中,我发现重新启动 docker 会修复它。但是,如果我重新启动 docker,我会丢失我的 iptables 设置:/
    • 我只有在没有crtl-a d 的情况下结束会话后才知道。在下一次连接时,终端已损坏,到目前为止,我发现只有重新启动 vm 才能修复它:/
    • 没有 iptables 会删除 NAT 规则,因此出站连接的源地址将位于 172.17.0.0/16 之类的位置。数据包确实会出去,但回来时它们不会通过您的 docker 主机路由。
    • @nouveau 我已经整合了您的编辑。我还有docker-ce 18.06.1-ce-mac73
    【解决方案2】:

    试试 Mac 的 pfctl 命令,它有点相当于 iptables。

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

    【讨论】:

    • 但是我该怎么处理pfctl? VM 使用我的 Mac 的 en0 接口,我无法区分来自 VM 的连接与 Mac 上的其他进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多