Перед прочтением настоящей статьи рекомендуется ознакомиться со статьей Инструкция для работы с редактором nano.

Данная статья применима к:

  • Astra Linux Special Edition


Описание

При использовании docker совместно с включенной службе межсетевого экрана firewalld после переключения службы docker в изолированный режим нарушается работа службы docker с сетью. Признаки: служба docker не запускается, в журнале /var/log/syslog фиксируется ошибка вида "Error initializing network controller".

Такое поведение службы docker, работающей в изолированном режиме, следует из выполнения требования безопасности: изолированная служба не может вмешиваться в работу высокоцелостных служб, одной из которых является служба firewalld. Для преодоления этого ограничения необходимо выполнить действия от имени администратора (при включенном МКЦ — от имени администратора с высоким уровнем целостности), определив для изолированной службы разрешенные действия.

Рекомендации

Если требуется одновременно использовать межсетевой экран firewall и службу docker, работающую в изолированном режиме, то необходимо выполнить следующие действия:

  1. Запретить службе docker пытаться изменить настройки межсетевого экрана, для чего к опциям запуска службы добавить опцию --iptables=false. Порядок действий:
    1. Выполнить команду:
      sudo systemctl edit docker
    2. Ввести в пустые строки после второй строки следующий текст:
      [Service]
      ExecStart=
      ExecStart=/usr/sbin/dockerd -H fd:// \
          --iptables=false \
          --containerd=/var/run/containerd/containerd.sock \
          --pidfile /var/run/docker/docker.pid \
          $DOCKER_OPTS --exec-opt native.cgroupdriver=cgroupfs
      Важно: строка ExecStart= (присваивающая пустое значение) необходима.
      При этом пример текста без дополнительной опции будет доступен в комментариях.
    3. Сохранить изменения. См. Инструкция для работы с редактором nano.
    4. Запустить (перезапустить) службу docker:
      sudo systemctl restart docker
  2. Если контейнерам требуются сетевые подключения, то добавить настройку этих подключений:
    1. Определить адреса используемых службой docker сетей. По умолчанию docker использует Например, с помощью команды:
      ip addr show docker0

      3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
          link/ether 02:42:36:0a:e2:62 brd ff:ff:ff:ff:ff:ff
          inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
             valid_lft forever preferred_lft forever
      В выводе команды выше показано, что docker использует сеть 172.17.0.1/16. Это сеть docker, использующаяся по умолчанию, и эта сеть далее используется в примере настройки.
    2. Выполнить команду:
      sudo systemctl edit docker
    3. Дополнить ранее введенные строки следующими строками:
      ExecStartPost=sysctl -w net.ipv4.ip_forward=1
      ExecStartPost=iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
      ExecStartPost=iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
      ExecStartPost=iptables -A FORWARD -i eth0 -o docker0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      ExecStartPost=iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
      При этом первые 4 строки неизменны, последняя строка определяет перенаправление пакетов на адрес конкретного контейнера (в примере — 172.17.0.2:80). Такие строки по мере надобности необходимо будет добавить для всех сетевых интерфейсов всех контейнеров, которым требуются сетевые подключения..
      В итоге текст должен выглядеть так (для краткости приведены первые строки):
      ### Editing /etc/systemd/system/docker.service.d/override.conf
      ### Anything between here and the comment below will become the new contents of the file
      
      [Service]
      ExecStart=
      ExecStart=/usr/sbin/dockerd -H fd:// \
          --containerd=/var/run/containerd/containerd.sock \
          --iptables=false \
          --pidfile /var/run/docker/docker.pid \
          $DOCKER_OPTS --exec-opt native.cgroupdriver=cgroupfs
      ExecStartPost=sysctl -w net.ipv4.ip_forward=1
      ExecStartPost=iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
      ExecStartPost=iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
      ExecStartPost=iptables -A FORWARD -i eth0 -o docker0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      ExecStartPost=iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
      
      ### Lines below this comment will be discarded....
    4. Сохранить изменения.
    5. Запустить (перезапустить) службу docker:
      sudo systemctl restart docker
  • Нет меток