Ostatnio stanąłem przed problemem zablokowania dostępu do sieci dla kontenerów Dockera do jednego z moich projektów. Zadanie wydawało mi się trywialne, ale jakoś tak się złożyło, że strasznie je sobie zagmatwałem. Koniec końców rozwiązanie sprowadza się do jednej linijki:
iptables -A DOCKER-USER -j DROP
Jednak zanim do tego dotarłem to musiałem całkiem sporo dowiedzieć się jak działa sieć Dockerowa.
Wracając do początku, celem jest zablokowanie ruchu do Internetu, sieci lokalnej i pomiędzy kontenerami z wewnątrz systemu gościa. Gospodarz ma posiadać dostęp do usług, które serwuje kontener dockerowy. Pierwszym pomysłem jaki mi wpadł to ustawienie osobno firewalla na każdym z obrazów (przebudowa Dockerfile). Jest to karkołomne rozwiązanie. Poza czasochłonnością tego podejścia, zatrzyma nas w tym wszystkim komunikat:
iptables can't initialize iptables table `filter': Permission denied
tak, nawet jako root! Pewnym rozwiązaniem jest doinstalowanie sudo i utworzenie użytkownika po czym przelogowanie się na niego. Trzeba jeszcze pamiętać o uruchomieniu dockera z wywołaniem --cap-add=ALL...lecz, nigdzie w oficjalnej dokumentacji nie znalazłem wzmianek, że taka droga jest zalecana.
Wydaje się więc, że najlepiej sterować zachowaniem zapory sieciowej z poziomu systemu gospodarza, przy użyciu dostarczonych łańcuchów (docker, docker-user etc.).
Więcej na ten temat w
https://sowhatisthesolution.wordpress.com/2018/09/11/protect-docker-from-internet-while-allowing-lan-with-iptables/
i https://docs.docker.com/network/iptables/
ahh i jeszcze, jeśli to rozwiązanie Ci nie pomogło, zobacz swoje aktualne reguły (iptables -nL), być może posiadasz jakieś reguły zezwalające (można je nadpisać, zamiast parametru -A użyj -I).