Docker - изменение IPTABLES для хоста из контейнера

Я хочу запустить контейнер докеров с центральным журналом и fail2ban службой, чтобы предотвратить атаки dos / ddos.

У меня проблема с запуском контейнера с такими возможностями, что он также может изменять хосты iptables.

Есть проект ianblenke / docker-fail2ban, но он не работает ...

Предоставление привилегии флагу контейнера позволяет мне управлять только iptables в этом контейнере. Есть ли способ управлять хостами iptables через контейнер?

С Уважением.


person Maciej Krajewski    schedule 11.05.2015    source источник
comment
Зачем вам запускать fail2ban внутри контейнера?   -  person Blusky    schedule 11.05.2015
comment
Я запускаю несколько сервисов в разных контейнерах, и я хотел бы иметь центральный контейнер, который будет отвечать за предотвращение атак dos / ddos ​​...   -  person Maciej Krajewski    schedule 11.05.2015
comment
Я изучаю учебное мероприятие, в котором iptables используется для разделения контейнерных наборов реплик mongodb, и аналогичным образом необходимо вытащить host vm iptables из контейнера. Как мне это сделать (т.е. какие команды в контейнере позволяют контейнеру управлять хостом vm iptables?)   -  person psychemedia    schedule 09.06.2015


Ответы (2)


Контейнеры Docker по умолчанию запускаются в изолированном сетевом пространстве имен, где у них нет доступа к конфигурации сети хоста (включая iptables).

Если вы хотите, чтобы ваш контейнер мог изменять сетевую конфигурацию хоста, вам необходимо передать параметр --net=host в docker run. На странице руководства docker-run(1):

--net="bridge"
   Set the Network mode for the container
       'bridge': creates a new network stack for the container on the docker bridge
       'none': no networking for this container
       'container:': reuses another container network stack
       'host':  use  the host network stack inside the container.
       Note: the host mode gives the container full access to
       local system services such as D-bus and is therefore
       considered insecure.

Вам нужно будет запустить как --privileged, так и --net=host.

person larsks    schedule 11.05.2015
comment
это сработало, я думал, что тестирую это, но я использовал net = bridge - это сработало - спасибо. - person Maciej Krajewski; 11.05.2015
comment
Мацей, расскажите, пожалуйста, как вы попали в iptables хоста из контейнера? - person jeesty; 13.01.2016
comment
Но есть ли в этом смысл? dockerd сам курирует свои собственные правила в iptables хоста. Если вы запустите что-либо, что манипулирует правилами брандмауэра, вы рискуете нарушить правила, установленные dockerd. Во всяком случае, вы должны быть абсолютно уверены в том, что этот инструмент делает с вашими iptables, прежде чем позволить ему проиграть с --privileged --net=host. - person JulioHM; 06.05.2019

--privileged флаг больше не требуется. Начиная с Docker 1.2, вы можете запускать свой образ с параметрами --cap-add=NET_ADMIN и --cap-add=NET_RAW, которые разрешают внутренние iptables.

Также стоит отметить, что в официальных образах Ubuntu из Docker Hub пакет iptables не установлен. Итак, общие инструкции должны быть

  • apt-get install iptables
  • запустите контейнер докеров с параметрами --net=host и --cap-add=NET_ADMIN --cap-add=NET_RAW.

Кроме того, если у вас есть образ докера, в котором отсутствует пакет iptables, и вы не хотите создавать из него собственный образ, вы можете запустить контейнер с iptables в том же сетевом пространстве. Например. если у вас запущен контейнер container-without-iptables и вы хотите запустить container-with-iptables в том же сетевом пространстве имен, вы можете сделать:

docker run -it --pid=container:container-without-iptables --net=container:container-without-iptables --cap-add sys_admin container-with-iptables
person Dmitriusan    schedule 13.06.2017