Я впервые настраиваю Ubuntu Server (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
Но я все еще могу подключаться к базам данных на других портах этой машины . Есть идеи о том, что я делаю не так?
РЕДАКТИРОВАТЬ : эти базы данных находятся в контейнерах 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)
ufw status
8083
и8086
. Я добавилufw status verbose
вывод в вопрос. Спасибо.Ответы:
Проблема заключалась в использовании
-p
флага на контейнерах.Оказывается, Docker вносит изменения прямо на вас
iptables
, которые не отображаются сufw status
.Возможные решения:
Прекратите использовать
-p
флаг. Вместо этого используйте Docker Linking или Docker Networks .Свяжите контейнеры локально, чтобы они не были видны снаружи вашей машины:
docker run -p 127.0.0.1:8080:8080 ...
Если вы настаиваете на использовании
-p
флага, скажите докеру не трогать васiptables
, отключив их/etc/docker/daemon.json
и перезапустив:{ "iptables" : false }
Я рекомендую вариант 1 или 2. Остерегайтесь того, что вариант 3 имеет побочные эффекты , такие как контейнеры не могут подключиться к Интернету.
источник
-p
как можно больше. Например, в случае обратного прокси-сервера я не сопоставляю порты для рабочих контейнеров, а затем помещаю nginx в свой собственный контейнер с-p 80:80
и a--link
на другие. Таким образом, не может быть никаких конфликтов портов, и единственная точка доступа - через nginx./etc/default/docker
это файл конфигурации, используемый конфигурацией upstart. Если вы перешли с upstart на systemd, этот файл не будет использоваться.16.04 представляет новые проблемы. Я сделал все шаги, как показано Запуск Docker за брандмауэром UFW, НО я НЕ смог заставить работать Docker плюс UFW 16.04. Другими словами, что бы я ни делал, все порты докеров стали глобально доступными для Интернета. Пока я не нашел это: Как настроить Docker 1.12+, чтобы НЕ мешать IPTABLES / FirewallD
Я должен был создать файл
/etc/docker/daemon.json
и поместить следующее:Затем я выпустил
sudo service docker stop
тогда, наконец,sudo service docker start
докер просто следует соответствующим правилам в UFW.Дополнительные данные: Docker отменяет UFW!
источник
Если вы используете систему инициализации systemd (Ubuntu 15.10 и более поздние версии), отредактируйте
/etc/docker/daemon.json
(возможно, потребуется создать его, если он не существует), убедитесь, что у негоiptables
настроен ключ:РЕДАКТИРОВАТЬ : это может привести к потере подключения к Интернету изнутри контейнеров
Если у вас включен UFW, убедитесь, что вы можете получить доступ к Интернету изнутри контейнеров. если нет - вы должны определить ,
DEFAULT_FORWARD_POLICY
какACCEPT
на/etc/default/ufw
и применить трюк , описанный здесь: https://stackoverflow.com/a/17498195/507564источник
Быстрый обходной путь - при запуске Docker и сопоставлении портов. Вы всегда можете сделать
чтобы предотвратить доступ вашего Docker извне.
источник
Использование
/etc/docker/daemon.json
с контентомможет звучать как решение, но оно работает только до следующей перезагрузки . После этого вы можете заметить, что ни один из ваших контейнеров не имеет доступа к Интернету, поэтому вы не можете, например, пропинговать любой веб-сайт. Это может быть нежелательное поведение.
То же самое относится и к привязке контейнера к конкретному IP. Вы можете не хотеть этого делать. Окончательный вариант - создать контейнер и оставить его позади UFW, независимо от того, что происходит и как вы создаете этот контейнер, поэтому есть решение:
После того, как вы создадите
/etc/docker/daemon.json
файл, вызовите:поэтому вы устанавливаете политику пересылки по умолчанию в UFW для принятия и используете:
Если вы собираетесь использовать docker-compose, то IP-адрес из приведенной выше команды должен быть заменен IP-адресом сети, создаваемой docker-compose при запуске с
docker-compose up
.Я описал проблему и решение более подробно в этой статье
Надеюсь, это поможет!
источник
В моем случае я изменил iptables, чтобы разрешить доступ к Docker только с определенных IP-адресов.
Согласно ответу ESala :
Пример записей, добавленных в iptables Docker
Маршрут к сети «ДОКЕР»:
Пересылка пакетов из цепочки «DOCKER» в контейнер:
Вы можете изменить iptables, чтобы разрешить доступ к цепочке DOCKER только с указанного исходного IP-адреса (например
1.1.1.1
):Возможно, вы захотите использовать
iptables-save > /tmp/iptables.conf
иiptables-restore < /tmp/iptables.conf
выводить, редактировать и восстанавливать правила iptables.источник
Используйте --network = host при запуске контейнера, чтобы docker отображал порт в изолированную сеть только для хоста вместо мостовой сети по умолчанию. Я не вижу законных способов заблокировать мостовую сеть. В качестве альтернативы вы можете использовать пользовательскую сеть с изоляцией.
источник
Войдите в вашу консоль докера:
И затем в вашей консоли докера:
Добавьте свои правила UFW и включите UFW
Чтобы включить опцию Docker «NET_ADMIN»:
Контейнер 1.Stop:
Докер останови свой контейнер; 2. Получить идентификатор контейнера:
Докер проверяет ваш контейнер; 3. Модифицировать hostconfig.json (путь к докеру по умолчанию: / var / lib / docker, вы можете изменить свой)
4. Найдите «CapAdd» и измените null на [«NET_ADMIN»];
...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Перезапустите докер на хост-компьютере;
перезапуск сервисного докера; 6. Запустите свой контейнер;
Докер запустить свой контейнер;
источник
Раньше я
docker-compose
запускал несколько контейнеров, а также имел проблему с тем, что один порт был открыт миру, игнорируя правила UFW.Исправление для того, чтобы сделать порт доступным только для моих докер-контейнеров, было следующим изменением в моем
docker-compose.yml
файле:к этому:
Теперь другие docker-контейнеры все еще могут использовать порт, но я не могу получить к нему доступ извне.
источник