Моя цель - ограничить доступ к док-контейнерам всего несколькими публичными IP-адресами. Есть ли простой, повторяемый процесс для достижения моей цели? Понимать только основы iptables при использовании параметров Docker по умолчанию я нахожу очень сложным.
Я хотел бы запустить контейнер, сделать его видимым для общедоступного Интернета, но разрешить соединения только с выбранных хостов. Я ожидал бы установить политику INPUT по умолчанию REJECT, а затем разрешить только подключения от моих хостов. Но мешают правила и цепочки докеров NAT, а мои правила INPUT игнорируются.
Может ли кто-нибудь привести пример того, как достичь моей цели, учитывая следующие предположения?
- Хост публичный IP 80.80.80.80 на eth0
- Хост частный IP 192.168.1.10 на eth1
docker run -d -p 3306:3306 mysql
- Заблокируйте все соединения с хостом / контейнером 3306, кроме хостов 4.4.4.4 и 8.8.8.8
Я рад привязать контейнер только к локальному IP-адресу, но мне нужны инструкции о том, как правильно настроить правила пересылки iptables, которые выживают в процессе докера и перезапускают хост.
Благодарность!
--ctdir
? Я использую-m conntrack --ctstate NEW --ctorigdstport 3306 --ctdir ORIGINAL
DOCKER-USER
таблице по умолчанию есть запись:-A DOCKER-USER -j RETURN
которая будет работать перед тем, как указано выше, если вы используете-A
. Решение состоит в том, чтобы вставить правила в начале в обратном порядке с-I
.FILTERS
цепочку и-I
вставьте новые правила (как вы сказали), чтобы перейти к ней:-I INPUT -j FILTERS
и-I DOCKER-USER -i eth0 -j FILTERS
-I
хотя, просто чтобы быть в безопасности.В Docker v.17.06 появилась новая цепочка iptables под названием DOCKER-USER. Это для ваших пользовательских правил: https://docs.docker.com/network/iptables/
В отличие от цепочки DOCKER она не сбрасывается при сборке / запуске контейнеров. Таким образом, вы можете добавить эти строки в конфигурационный / сценарий iptables для подготовки сервера еще до установки docker и запуска контейнеров:
Теперь порт для MySQL заблокирован от внешнего доступа (eth0), даже если докер открывает порт для всего мира. (Эти правила предполагают, что ваш внешний интерфейс - eth0.)
В конце концов, вам придется очистить iptables, сначала перезапустить службу докера, если вы слишком много испортили, пытаясь заблокировать порт, как я.
источник
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
поэтому пользовательские инструкции выполняются до цепочки DOCKER.--dport
внутри DOCKER-USER, это должно совпадать с внутренним IP-адресом службы контейнера, а не с открытым портом. Они часто совпадают, но не всегда, и это может легко вступить в конфликт с другими сервисами, поэтому я до сих пор утверждаю, что это решение DOCKER-USER наполовину испечено.ОБНОВЛЕНИЕ : Действуя в 2015 году, это решение больше не является правильным способом сделать это.
Ответ, кажется, находится в документации Докера по адресу https://docs.docker.com/articles/networking/#the-world.
То, что я закончил, было:
Я не трогал
--iptables
или--icc
варианты.источник
iptables -vnL DOCKER
, все порты назначения являются портами в контейнере. Если я правильно понял, это означает, что вышеприведенные правила будут влиять только на порт3306
внутри контейнера - то есть, если бы вы были в-p 12345:3306
вашем контейнере, ваше правило все равно было бы тем, которое требуется для блокировки доступа (т.е.--dport 12345
не будет работать) потому что правила ACCEPT цепочки DOCKER являются пост-NAT.--iptables=false
, потому что это, кажется, худший выбор из всех.ОБНОВЛЕНИЕ: Хотя этот ответ остается в силе, ответ @SystemParadox лучше использовать
DOCKER-USER
в сочетании с--ctorigdstport
.Вот решение, которое хорошо сохраняется между перезапусками и позволяет воздействовать на открытый порт, а не на внутренний порт.
iptables -t mangle -N DOCKER-mysql iptables -t mangle -A DOCKER-mysql -s 22.33.44.144/32 -j RETURN iptables -t mangle -A DOCKER-mysql -s 22.33.44.233/32 -j RETURN iptables -t mangle -A DOCKER-mysql -j DROP iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 3306 -j DOCKER-mysql
Я создал образ Docker, который использует этот метод для автоматического управления iptables для вас, используя либо переменные окружения, либо динамически с etcd (или обоими):
https://hub.docker.com/r/colinmollenhour/confd-firewall/
источник