#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 и снова выполняет исходные шаги (см. Ссылку в исходном вопросе).