Управление трафиком (брандмауэр) в docker / docker-compose network

#networking #docker #docker-compose

#сеть #docker #docker-compose

Вопрос:

Я запускаю docker на компьютере, который обслуживает различные службы. Я хочу управлять этими службами с помощью iptables или, предпочтительно, с помощью ufw (поскольку я не настолько разбираюсь в самих iptables).

В моей предыдущей настройке я использовал «ванильный» docker, который использует виртуальный интерфейс под названием «docker0» для маршрутизации сетевого трафика через контейнеры. Я успешно «погуглил» решение для обеспечения работы брандмауэра, описанное в этой статье:https://svenv.nl/unixandlinux/dockerufw (примечание: несмотря на то, что я написал статью, это всего лишь сумма знаний об Интернете, объединенных воедино).

Одной из вещей, которые я нашел, была эта часть:

 *nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
  

Который (я полагаю) гарантирует, что все правильно передается в docker0.

Теперь я изменил свои настройки и начал использовать «docker-compose», который автоматически запускает контейнеры docker в изолированной сети. И снова, docker использует для этого виртуальное устройство, которое названо в честь идентификатора сети:

 $ docker network ls
NETWORK ID          NAME                            DRIVER              SCOPE
(...)             
207a57fc0080        dockeropenvpndata_network-vpn   bridge              local               
(...)
  

и…

 $ ifconfig | grep 207a57fc0080
br-207a57fc0080 Link encap:Ethernet  HWaddr 02:42:ce:c5:81:04 
  

Я предполагаю, что изменение конфигурации iptables, опубликованной выше, на новое сетевое устройство, может решить проблему:

 *nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o br-207a57fc0080 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
  

Однако я понятия не имею, как это проверить.

  • Имя интерфейса (идентификатор сети) кажется (псевдо) случайным
  • Имя интерфейса (идентификатор сети) известно только после docker-compose up
  • Насколько я знаю, правило применяется во время загрузки, когда идентификатор все еще неизвестен.

Короче говоря, я ищу способ снова отключить брандмауэр на моем компьютере docker. Кто-нибудь знает, как этого добиться?

Комментарии:

1. Нет, указанное выше правило маршрутизации post не контролирует трафик, который поступает в docker. Он просто маскирует трафик, который выходит в хост-сеть (или Интернет), что означает, что ваши контейнеры могут получать доступ к Интернету / хост-сети.

2. Ваш вопрос недостаточно ясен! Вы сказали, что что-то сделали, но я не понял, что именно вы собираетесь делать.

3. Спасибо за информацию, в принципе, я просто хочу иметь возможность использовать брандмауэр. Docker не прослушивает мой брандмауэр и обходит его: (

4. Если я могу что-нибудь еще прояснить, пожалуйста, дайте мне знать.

Ответ №1:

Оказывается, что конфигурация в /etc/default/docker не учитывается при использовании systemd, в результате чего --iptables=false не задается.

Параметры docker для systemd указаны в файле службы в /lib/systemd/system/docker.service . Записи в этом файле могут быть переопределены путем добавления / настройки выпадающего файла в cat /etc/systemd/system/docker.service.d/docker.conf

Я добавляю выпадающий файл с этим содержимым:

 [Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/dockerd --iptables=false -H fd://
  

(На самом деле требуется первый пустой ExecStart=)

Это запускает docker без настройки iptables и снова выполняет исходные шаги (см. Ссылку в исходном вопросе).