Я впервые настраиваю сервер 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
Но я все еще могу подключаться к базам данных на других портах этой машины . Есть идеи о том, что я делаю неправильно?
РЕДАКТИРОВАТЬ : эти базы данных находятся в контейнерах 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)
Проблема использовала эти -p
флаг на контейнерах.
оказывается, что Докер вносит изменения непосредственно на Вашем iptables
, которые не показывают с ufw status
.
Возможные решения:
Остановка с помощью эти -p
флаг. Используйте докера, связывающегося или сети докера вместо этого.
Связывают контейнеры локально, таким образом, они не выставляются вне Вашей машины:
docker run -p 127.0.0.1:8080:8080 ...
, Если Вы настаиваете на том, чтобы использовать эти -p
флаг, скажите докеру не касаться Вашего iptables
путем отключения их в /etc/docker/daemon.json
и перезапуск:
{ "iptables" : false }
я рекомендую опцию 1 или 2. Остерегайтесь та опция 3 имеет побочные эффекты , как контейнеры, становящиеся не могущей соединиться с Интернетом.
Если Вы используете init систему systemd (Ubuntu 15.10, и позже) редактируют /etc/docker/daemon.json
(возможно, должен был бы создать его, если это не существует), удостоверьтесь, что это имеет iptables
настроенный ключ:
{ "iptables" : false }
<час> РЕДАКТИРОВАНИЕ : это могло бы заставить Вас терять соединение с Интернетом из контейнеров
, Если Вы имеете включенный UFW, проверьте, что можно получить доступ к Интернету из контейнеров. если не - необходимо определить DEFAULT_FORWARD_POLICY
как ACCEPT
на /etc/default/ufw
и применить прием, описанный здесь: https://stackoverflow.com/a/17498195/507564
16.04 представляет собой новые проблемы. Я сделал все шаги как показано Рабочий Докер позади ufw брандмауэра , НО я НЕ мог заставить докера плюс UFW работать над 16,04. Другими словами, то независимо от того, что я сделал все порты докера, стало глобально выставленным Интернету. Пока я не нашел это: , Как установить Докера 1.12 + для НЕ вмешательства в IPTABLES/FirewallD
, я должен был создать файл /etc/docker/daemon.json
и вставить следующее:
{
"iptables": false
}
я затем вышел sudo service docker stop
затем sudo service docker start
НАКОНЕЦ, докер просто следует соответствующим правилам в UFW.
Дополнительные данные: Докер отвергает UFW!
Используйте - network=host при запуске контейнера, таким образом, докер отобразит порт на изолированную сеть только для хоста вместо мостовой схема по умолчанию. Я не вижу легальных способов заблокировать запараллеленную сеть. Кроме того, можно использовать пользовательскую пользовательскую сеть с изоляцией.
nvidia-370
(370.28) Текущий долговечный выпуск ответвления: nvidia-367
(367.57) Для GeForce 8 и 9 использования серии GPU nvidia-340
(340.98) Shouldn' t я устанавливаю 340.96?
– Jim
19 October 2016 в 17:00
Быстрое обходное решение при выполнении Докера и выполнении отображения порта. Можно всегда делать
docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...
, чтобы препятствовать тому, чтобы Докер был получен доступ снаружи.
Использование /etc/docker/daemon.json
с содержанием
{
"iptables": false
}
могло бы походить на решение , но оно только работает до следующей перезагрузки . После этого можно заметить, что ни один из контейнеров не имеет доступ к Интернету, таким образом, Вы не можете, например, проверить с помощью ping-запросов веб-сайт. Это может быть нежелательное поведение.
То же относится к привязке контейнера определенному 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
, Если Вы собираетесь использовать докера - сочиняют, затем IP от команды выше должен быть заменен IP сетевого докера - сочиняют, создает при выполнении его с docker-compose up
.
я описал проблему и решение более всесторонне в этой статье
Hope, которой это помогает!
В моем случае я закончил тем, что изменил iptables, чтобы предоставить доступ Докеру только от определенного дюйм/с
Согласно ответ ESALA :
, Если Вы используете
-p
, флаг на Докере контейнеров вносит изменения непосредственно в iptables, игнорируя ufw.
Пример записей, добавленных к iptables Докером
Маршрутизация к цепочке 'ДОКЕРА':
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
пакеты Передачи от цепочки 'ДОКЕРА' до контейнера:
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379
можно изменить iptables для предоставления доступа к цепочке ДОКЕРА только от указанного исходного IP (например, 1.1.1.1
):
-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
можно хотеть использовать iptables-save > /tmp/iptables.conf
и iptables-restore < /tmp/iptables.conf
, чтобы вывести, отредактировать, и восстановить правила iptables.
Я использовал docker-compose
для запуска нескольких контейнеров и также имел проблему, что один порт был выставлен миру, игнорирующему ufw правила.
фиксация, чтобы только сделать порт доступным для моих контейнеров докера была этим изменением в моем docker-compose.yml
файл:
ports:
- "1234:1234"
к этому:
ports:
- "1234"
Теперь другие контейнеры докера все еще могут использовать порт, но я не могу получить доступ к нему снаружи.
Войдите в свою консоль докера:
должностное лицо докера sudo-i-t docker_image_name/bin/bash
И затем в Вашей консоли докера:
sudo apt-get update sudo apt-get install ufw sudo ufw allow 22
Добавьте свои правила ufw и включите ufw
sudo ufw включают
Включить опцию Docker "NET_ADMIN":
1. Контейнер остановки:
остановка докера yourcontainer; 2. Получите контейнерный идентификатор:
докер осматривает yourcontainer; 3. Измените hostconfig.json (докер по умолчанию path:/var/lib/docker, можно изменить Ваш),
vim /var/lib/docker/containers/containerid/hostconfig.json
4. Ищите "CapAdd" и измените пустой указатель к ["NET_ADMIN"];
...., "VolumesFrom": пустой указатель, "CapAdd": ["NET_ADMIN"], "CapDrop": пустой указатель.... 5. Перезапустите докера в хост-машине;
сервисный перезапуск докера; 6. Запустите yourconatiner;
докер запускает yourcontainer;