Запретить выход из контейнеров Docker в Docker для Mac

Я хочу отключить все исходящие соединения, которые инициируются контейнерами докеров во внешний мир. Я могу сделать это в Linux, добавив правило в цепочку FORWARD в Linux. Как мне это сделать в Docker для Mac?

Я узнал, что Docker для Mac использует виртуальную машину xhyve, и именно здесь находится интерфейс docker0. К какому интерфейсу на хосте это подключается? Я использовал неттоп на Mac и вижу, что Docker использует мой беспроводной интерфейс en0. Но я не уверен, что Docker и xhyve используют один и тот же интерфейс.

Изменить: добавлен тег docker-for-windows, потому что у них могут быть похожие решения (надеюсь)

Изменить 2: Docker для Mac изменился, поэтому принятое решение немного изменилось


person captain    schedule 22.03.2018    source источник


Ответы (2)


Докер

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

Это и правила можно превратить в Dockerfile и запустить с параметром -- restart. Я думаю, on-failure может сработать, чтобы повторно применить правила при запуске Docker для 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 для Mac. Я еще не нашел секрета для сохранения системных изменений.

Используйте ctrl - a, затем d для выхода из сеанса экрана, иначе вы закроете терминал.

OSX

Для простого, но недорогого варианта используйте Little Snitch и заблокируйте исходящие соединения на OSX. с com.docker.supervisor via vpnkit.

person Matt    schedule 22.03.2018
comment
Спасибо! Это кажется хакерским способом сделать это, но я не встречал другого решения. Попробую. Little Snitch - хороший вариант, но не подходит для крупномасштабного развертывания. - person captain; 22.03.2018
comment
правила iptables не работают. В своем поиске я обнаружил, что перезапуск докера исправит это. Но если я перезапущу докер, я потеряю настройки iptables: / - person captain; 23.03.2018
comment
Кроме того, что случилось с терминалом xhyve, отображающим странные символы? reset, tset и echo -e "\033c" не работают - person captain; 23.03.2018
comment
Я получаю это только после завершения сеанса без crtl-a d. При следующем подключении терминал сломан, и пока что перезапуск виртуальной машины - единственное, что я нашел, что это исправляет: / - person Matt; 23.03.2018
comment
Ах ты прав. Я всегда забываю ctrl-a d. Если я сделаю это с docker run, мне придется сохранить контейнер живым, верно? - person captain; 23.03.2018
comment
Контейнер должен существовать только во время выполнения команды iptables и применения config. После этого конфиг сохраняется в ядре. - person Matt; 23.03.2018
comment
Это элегантное решение. Я должен это проверить. Кроме того, я только что обнаружил, что отключение iptables в демоне докеров блокирует подключения к внешнему миру. Я не знаю, ошибка это или особенность. - person captain; 23.03.2018
comment
Никакие iptables не удалят правила NAT, поэтому исходный адрес исходящих соединений будет примерно 172.17.0.0/16. Пакеты отправляются, но возвращаясь, они не будут маршрутизироваться через ваш докер-хост. - person Matt; 23.03.2018
comment
Вот дерьмо! Я вижу это только на Mac. Вроде нормально работает на Linux - person captain; 23.03.2018
comment
Тем, кто ищет обновленное решение, просмотрите это редактирование stackoverflow.com/review/suggested-edits/23317518 - person captain; 22.06.2019
comment
@nouveau Я интегрировал ваши правки. У меня все еще есть docker-ce, хотя на 18.06.1-ce-mac73 - person Matt; 27.06.2019
comment
Спасибо @Matt, я думаю, что версии docker stable 2019 были обновлены, чтобы иметь docker вместо docker-ce - person captain; 28.06.2019
comment
Будет ли iptables работать на MacOS? У меня есть комментарии к моему связанному вопросу stackoverflow.com/questions/63709052, которых не будет. - person schrödingercöder; 02.09.2020
comment
@ schrödingercöder Не в MacOS, iptables работает в Docker-for-Mac на виртуальных машинах. - person Matt; 03.09.2020

Попробуйте команду Mac pfctl, она эквивалентна iptables.

Вот справочная страница: https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man8/pfctl.8.html.

person Yuankun    schedule 22.03.2018
comment
Но что мне делать с pfctl? Виртуальная машина использует en0 интерфейс моего Mac, и я не могу отличить подключения, поступающие от виртуальной машины, от других процессов на Mac. - person captain; 22.03.2018