Ограничить доступ к докерным контейнерам - PullRequest
0 голосов
/ 09 января 2019

TLDR; - Добавлены некоторые допустимые правила в контейнер докеров для ограничения доступа в Интернет. Работает нормально, за исключением того, что теперь я не могу получить доступ к приложению контейнера с хост-компьютера, но могу сделать это из самого контейнера

У меня есть контейнер с веб-приложением. Этот контейнер использует mysql, redis и т. Д. Каждая зависимость является удаленной, доступной по IP-адресу на конкретном порту.

Так, например, mysql доступен по ip 13.255.255.255

Я хочу, чтобы контейнер мог использовать только IP-адрес mysql, а не какой-либо другой. В коде есть несколько curl запросов, которые я не хочу выходить за пределы сети моего хост-компьютера.

Я добавил сценарий точки входа в Docker, который добавляет некоторое правило iptables в контейнер.

ALLOWED_CIDR1=172.0.0.0/16
ALLOWED_CIDR2=13.255.255.255 #For mysql access

#iptables -P FORWARD DROP # we aren't a router
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -P INPUT DROP # Drop everything we don't accept

iptables -A INPUT -s 0.0.0.0 -j ACCEPT
iptables -A INPUT -s ::1 -j ACCEPT
iptables -A OUTPUT -d ::1 -j ACCEPT
iptables -A INPUT -s $ALLOWED_CIDR1 -j ACCEPT
iptables -A INPUT -s $ALLOWED_CIDR1 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR2 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR2 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

Когда я запускаю контейнер и выполняю

docker-compose exec <container-name> curl http://google.com

В ответ получаю:

curl: (6) Не удалось разрешить хост: google.com

что ожидается. Теперь, когда я делаю

docker-compose exec <container-name> curl http://0.0.0.0

Я получаю следующий ответ:

«Привет, мир!»

Что снова ожидается. Тем не менее, когда я выполняю curl http://0.0.0.0 со своего хост-компьютера, следующий вывод

* Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 0.0.0.0
> User-Agent: curl/7.62.0
> Accept: */*
> // Hangs here

Итак, я не могу подключиться к http://0.0.0.0 с хост-компьютера, но могу подключиться изнутри док-станции.

1 Ответ

0 голосов
/ 09 января 2019

Я совершенно глуп, чтобы игнорировать правила iptables, которые я отправил сам.

Неправильный набор правил

ALLOWED_CIDR1=172.0.0.0/16
ALLOWED_CIDR2=13.255.255.255 #For mysql access

#iptables -P FORWARD DROP # we aren't a router
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -P INPUT DROP # Drop everything we don't accept

iptables -A INPUT -s 0.0.0.0 -j ACCEPT
iptables -A INPUT -s ::1 -j ACCEPT
iptables -A OUTPUT -d ::1 -j ACCEPT
iptables -A INPUT -s $ALLOWED_CIDR1 -j ACCEPT
iptables -A INPUT -s $ALLOWED_CIDR1 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR2 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR2 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

В приведенном выше разделе вы можете увидеть:

  1. Нет ПРИНЯТЬ ВЫВОД для ip 0.0.0.0
  2. Для * ip 192.168.x.x не существует OUTPUT ACCEPT правила, которое является ip-адресом моего docker-0 сетевого интерфейса

Как докер, так и хост-компьютер обмениваются данными с использованием сетевого интерфейса docker0, если при запуске контейнера используется сетевой режим bridged (что и произошло в моем случае).

Еще одна вещь, которую я заметил, я вообще не требовал правил 0.0.0.0 или 127.0.0.1. Поскольку скрипт точки входа будет добавлять правила iptable в контейнере Docker, мы можем никогда не захотеть получить доступ к webapp изнутри самого контейнера. Следовательно, зачем возиться с 127.0.0.1?

В общем, вот что я сделал:

  1. Получите мой IP-адрес для docker0 сети. ip addr show docker0. Выведено 192.168.144.1/20
  2. Я добавил 192.168.0.0/16 к ПРИНЯТЬ правила в моей точке входа iptable rules, которые охватывали мой ipaddress в точке 1
  3. Теперь я могу получить доступ к своему контейнеру снаружи

Мои правила iptable теперь выглядят так:

ALLOWED_CIDR1=172.0.0.0/16
ALLOWED_CIDR2=13.255.255.255
ALLOWED_CIDR3=192.168.0.0/16

iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP # Drop everything we don't accept
iptables -P OUTPUT DROP

iptables -A INPUT -s $ALLOWED_CIDR1 -j ACCEPT
iptables -A INPUT -s $ALLOWED_CIDR2 -j ACCEPT
iptables -A INPUT -s $ALLOWED_CIDR3 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR1 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR2 -j ACCEPT
iptables -A OUTPUT -d $ALLOWED_CIDR3 -j ACCEPT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...