Docker, iptables i cloudflare. Jak to połączyć?

Tagi: #<Tag:0x00007f8a32c86a90> #<Tag:0x00007f8a32c86978>

Witam serdecznie.

Mam taki problem: posiadam serwer, na nim dockera, w dockerze jest kontener, który nasłuchuje na 3 portach (dla tego wątku załóżmy, że 123, 456 oraz 789). Chciałbym z pomocą iptables zablokować ruch spoza adresów CloudFlare. Udało mi się wykombinować coś takiego:

#!/bin/bash

# Create new chain
sudo iptables -N DOCKER-FW

# Accept CloudFlare addresses
for i in $(curl https://www.cloudflare.com/ips-v4); do
	sudo iptables -A DOCKER-FW -s $i -j RETURN
done

# Drop everything else
sudo iptables -A DOCKER-FW -j DROP

# Handler
sudo iptables -I FORWARD -p tcp -m multiport --dports 123,456,789 -j DOCKER-FW

Jednak nadal mogę uzyskać dostęp do mojej aplikacji nie wchodząc przez CloudFlare.
Co zrobiłem nie tak?

Miałem kiedyś podobny problem i ogólnie są dwie możliwości. Albo w ogóle wyłączyć dockerowi zarządzanie iptables i przekierowywać wszystko ręcznie, co nie jest rekomendowane gdyż przy każdym nowym kontenerze będziesz musiał kombinować, albo dopisać te reguły bezpośrednio do istniejącego dockerowego chaina.

Znalazłem pewien post i to chyba były te komendy:

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

Ta ostatnia linia aby inne połączenia z dockera normalnie były przepuszczane.

Zwróć uwagę na to aby odpowiednio podmienić eth0.

1 polubienie

Niestety po zastosowaniu przedstawionego przez Ciebie skryptu mój kontener w dalszym ciągu akceptuje połączenia spoza serwerów CloudFlare. Przystosowałem skrypt oczywiście pod moje wymagania.
Wygląda on teraz tak:

#!/bin/bash

sudo iptables -F DOCKER-USER
sudo iptables -I DOCKER-USER -j RETURN
sudo iptables -I DOCKER-USER -p tcp -m multiport --dports 123,456,789 -j DROP

for i in $(curl https://www.cloudflare.com/ips-v4); do
	sudo iptables -I DOCKER-USER -p tcp -i eth0 -m multiport --dports 123,456,789 -s $i -j RETURN
done

sudo iptables -I DOCKER-USER -o eth0 -d 0.0.0.0/0 -j ACCEPT