Docker контейнер доступен только через Cloudflare CDN (выбранные диапазоны ip) - PullRequest
1 голос
/ 09 июля 2020

У меня есть веб-сервер в контейнере docker, но я не могу настроить iptables на своем хосте (Debian). Я хочу разрешить только указанный IP-адрес для подключения на портах 80 и 443 к моей машине (хосту). Порт 22 должен быть доступен с любого ip. В моем случае разрешенными должны быть IP-адреса Cloudflare. IP-адреса Cloudflare доступны по адресу https://www.cloudflare.com/ips-v4.

Как правильно блокировать IP-соединения, отличные от Cloudflare, на портах 80 и 443?

1 Ответ

1 голос
/ 11 июля 2020

РЕШЕНИЕ:

iptables -F DOCKER-USER
iptables -I DOCKER-USER -j RETURN
iptables -I DOCKER-USER -p tcp -m multiport --dports http,https -j DROP
for i in `curl -s https://www.cloudflare.com/ips-v4`;\
        do iptables -I DOCKER-USER -p tcp -i eth0 -m multiport --dports http,https -s $i -j RETURN;\
done
iptables -I DOCKER-USER -o eth0 -d 0.0.0.0/0 -j ACCEPT

Результат iptables -L для DOCKER -ПОЛЬЗОВАТЕЛЬ:

ACCEPT     all  --  anywhere             anywhere
RETURN     tcp  --  <ACCEPTED IPs>       anywhere             multiport dports http,https
DROP       tcp  --  anywhere             anywhere             multiport dports http,https
RETURN     all  --  anywhere             anywhere

Пояснение:
Первая часть (ACCEPT) ПРИНИМАЕТ исходящий трафик c от веб-сервера (docker контейнер).
Вторая часть (RETURN) описывает разрешенные IP-адреса для подключения к порту 80 или 443.
Третья часть (DROP) отбрасывает пакеты соединений на порт 80/443, которые НЕ указаны в части RETURN.
Четвертая часть (RETURN) является правилом по умолчанию в цепочке DOCKER -USER . Это позволяет обрабатывать соединения на других портах по следующим правилам вместо того, чтобы отбрасывать все соединения на порте, отличном от 80/443 (например, порт 22 - s sh).

...