Незаконченный брандмауэр (UFW) не блокирует что-либо при использовании Docker

20

Это моя первая настройка сервера Ubuntu (14.04 LTS), и у меня возникают проблемы с настройкой брандмауэра (UFW).

Мне нужны только ssh и http , поэтому я делаю это:

sudo ufw disable

sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp

sudo ufw enable
sudo reboot

Но я все еще могу подключиться к базам данных на других портах этой машины . Любая идея о том, что я делаю неправильно?

EDIT : эти базы данных находятся в контейнерах Docker. Может ли это быть связано? это переопределение моей конфигурации ufw?

EDIT2 : выход sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
    
задан ESala 25.07.2015 в 12:00
источник

6 ответов

26

Проблема заключалась в использовании флажка -p в контейнерах.

Оказывается, Docker делает изменения непосредственно на iptables , которые не отображаются с ufw status .

Возможные решения:

  1. Прекратите использовать флаг -p . Вместо этого используйте привязку докеров или сети докеров .

  2. Ломать контейнеры локально, чтобы они не экспонировались вне вашей машины:

    docker run -p 127.0.0.1:8080:8080 ...

  3. Если вы настаиваете на использовании флага -p , сообщите docker, чтобы он не касался вашего iptables , отключив их в /etc/docker/daemon.json и перезапустив:

    { "iptables" : false }

Я рекомендую вариант 1 или 2. Остерегайтесь того, что опция 3 имеет побочные эффекты , так как контейнеры становятся недоступными для подключения к Интернету.

    
ответ дан ESala 25.07.2015 в 12:50
источник
8

16.04 представляет новые проблемы. Я сделал все шаги, как показано Запуск Docker за брандмауэром ufw НО Я не мог получить докер плюс UFW работать 16.04. Другими словами, независимо от того, что я сделал, все порты докеров стали глобально доступными в Интернете. Пока я не нашел это: Как установить Docker 1.12+, чтобы НЕ вмешиваться в IPTABLES / FirewallD

Мне пришлось создать файл /etc/docker/daemon.json и поместить следующее:

{
    "iptables": false
}

Затем я выпустил sudo service docker stop , а затем sudo service docker start FINALLY docker просто выполнил соответствующие правила в UFW.

Дополнительные данные: Докер перекрывает UFW!

    
ответ дан Hal Jordan 06.12.2016 в 22:50
5

Если вы используете систему initd systemd (Ubuntu 15.10 и новее), отредактируйте файл /etc/docker/daemon.json (возможно, потребуется создать его, если он не существует), убедитесь, что он имеет iptables key:

{   "iptables" : false }

EDIT : это может привести к потере соединения с Интернетом изнутри контейнеров.

Если у вас включен UFW, убедитесь, что вы можете получить доступ к Интернету изнутри контейнеров. если нет - вы должны определить DEFAULT_FORWARD_POLICY как ACCEPT на /etc/default/ufw и применить трюк, описанный здесь: Ссылка     

ответ дан Or Shachar 05.10.2016 в 14:11
3

Использование /etc/docker/daemon.json с содержимым

{
  "iptables": false
}

может звучать как решение , но оно работает только до следующей перезагрузки . После этого вы можете заметить, что ни один из ваших контейнеров не имеет доступа к Интернету, поэтому вы не можете, например, пинговать любой сайт. Это может быть нежелательное поведение.

То же самое относится к привязке контейнера к определенному IP. Возможно, вы не захотите этого делать. Конечная опция заключается в создании контейнера и использовании его за UFW, неважно, что происходит , и о том, как вы создаете этот контейнер, поэтому есть решение:

После создания файла /etc/docker/daemon.json вызовите:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

, поэтому вы настраиваете политику пересылки по умолчанию в UFW для принятия и используете:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Если вы собираетесь использовать docker-compose, тогда IP-адрес из вышеприведенной команды должен быть заменен IP-адресом сетевого docker-compose, созданным при запуске с docker-compose up .

Я описал проблему и решение более подробно в этой статье

Надеюсь, что это поможет!

    
ответ дан mkubaczyk 08.09.2017 в 21:47
1

Быстрое обходное решение при запуске Docker и выполнении сопоставления портов. Вы всегда можете делать

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

, чтобы предотвратить доступ к докере извне.

    
ответ дан kimy82 16.08.2017 в 16:01
0

Используйте --network = host при запуске контейнера, поэтому докер будет отображать порт в изолированную сеть только для хоста вместо сети моста по умолчанию. Я не вижу законных способов блокировки мостовой сети. В качестве альтернативы вы можете использовать собственную пользовательскую сеть с изоляцией.     

ответ дан thecoder 11.03.2017 в 22:10