Nieskomplikowana zapora sieciowa (UFW) nie blokuje niczego podczas korzystania z Dockera

44

Po raz pierwszy konfiguruję serwer Ubuntu (14.04 LTS) i mam problem z konfiguracją zapory ogniowej (UFW).

Potrzebuję tylko sshi httpdlatego robię to:

sudo ufw disable

sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp

sudo ufw enable
sudo reboot

Ale nadal mogę łączyć się z bazami danych na innych portach tego komputera . Masz pojęcie o tym, co robię źle?

EDYCJA : te bazy danych znajdują się w kontenerach Docker. Czy to może być powiązane? czy to zastępuje moją konfigurację ufw?

EDIT2 : wyjście zsudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
ESala
źródło
jaka baza danych który port Czy jesteś pewien, że to ta sama maszyna? jaka jest wydajność ufw status
solsTiCe
@solsTiCe tak, jestem pewien, że to ta sama maszyna. Baza danych to InfluxDB (na kontenerze dokera) z portami 8083i 8086. Dodałem ufw status verbosewynik w pytaniu. Dzięki.
ESala

Odpowiedzi:

64

Problem polegał na użyciu -pflagi na kontenerach.

Okazuje się, że Docker dokonuje zmian bezpośrednio na twoim iptables, których nie pokazuje ufw status.

Możliwe rozwiązania to:

  1. Przestań używać -pflagi. Zamiast tego użyj łącza dokującego lub sieci dokerów .

  2. Wiąż pojemniki lokalnie, aby nie były narażone na zewnątrz urządzenia

    docker run -p 127.0.0.1:8080:8080 ...

  3. Jeśli nalegasz na użycie -pflagi, powiedz dokerowi, aby nie dotykał twojego iptables, wyłączając je /etc/docker/daemon.jsoni uruchamiając ponownie:

    { "iptables" : false }

Polecam opcję 1 lub 2. Uwaga: opcja 3 ma skutki uboczne , takie jak brak możliwości połączenia kontenerów z Internetem.

ESala
źródło
8
Jest to bardzo przydatne - oszalałem na punkcie dostępu do portów, na które nie zezwalałem w ufw. Używanie iptables = false często psuje, jak kontenery stają się dostępne na localhost, np. Do odwrotnego proxy. Lepiej upewnić się, że kontener nasłuchuje poprawnie, nie używaj -p 80:80, ale używaj -p 127.0.0.1:80:80 lub innego portu, takiego jak 127.0.0.1:3000:80, do odwrotnego proxy z nginx lub apache i bez portu starcia.
Andreas Reiff,
2
@AndreasReiff masz rację, ale ostatnio uważam, że najlepiej jest unikać -pjak najwięcej. Na przykład, w przypadku odwrotnego proxy nie mapuję żadnego portu dla kontenerów roboczych, a następnie umieszczam nginx we własnym kontenerze za pomocą -p 80:80a --linkdla innych. W ten sposób nie może dojść do żadnych kolizji portów, a jedynym punktem dostępu jest nginx.
ESala
1
Sprawdź również ten post pod kątem trzeciego środka ostrożności, który musisz podjąć! svenv.nl/unixandlinux/dockerufw
Henk
1
Ważne : /etc/default/dockerto plik konfiguracyjny używany przez konfigurację upstart. Jeśli przeszedłeś z wersji upstart do systemd, ten plik nie zostanie użyty.
orszachar
@ESala Powinieneś pomyśleć o odznaczeniu tej odpowiedzi jako poprawnej, ponieważ jest ona datowana.
ctbrown
8

16.04 przedstawia nowe wyzwania. Zrobiłem wszystkie kroki, jak pokazano Uruchomienie Dockera za zaporą ufw ALE NIE mogłem zmusić dokera i UFW do pracy 16.04. Innymi słowy, bez względu na to, co zrobiłem, wszystkie porty dokerów stały się globalnie dostępne dla Internetu. Dopóki nie znalazłem tego: Jak ustawić Docker 1.12+, aby NIE kolidował z IPTABLES / FirewallD

Musiałem utworzyć plik /etc/docker/daemon.jsoni wstawić następujące:

{
    "iptables": false
}

Potem wydał sudo service docker stopnastępnie sudo service docker startWRESZCIE doker jest po prostu po właściwych przepisów UFW.

Dodatkowe dane: Docker unieważnia UFW!

Hal Jordan
źródło
W Ubuntu 16.04 i Docker w wersji 17.09 to rozwiązanie przerywa połączenie wychodzące z kontenerów. Zobacz odpowiedź askubuntu.com/a/833363/262702 i askubuntu.com/a/954041/262702
ctbrown
5

Jeśli korzystasz z systemu init systemud (Ubuntu 15.10 i nowszych) edytuj /etc/docker/daemon.json(może być konieczne utworzenie go, jeśli nie istnieje), upewnij się, że ma iptablesskonfigurowany klucz:

{   "iptables" : false }

EDYCJA : może to spowodować utratę połączenia z Internetem z wewnętrznych kontenerów

Jeśli masz włączoną UFW, sprawdź, czy możesz uzyskać dostęp do Internetu z wewnętrznych kontenerów. jeśli nie - musisz zdefiniować DEFAULT_FORWARD_POLICYjako ACCEPTwłączony /etc/default/ufwi zastosować sztuczkę opisaną tutaj: https://stackoverflow.com/a/17498195/507564

orszachar
źródło
2

Szybkim obejściem jest uruchomienie Dockera i mapowanie portów. Zawsze możesz to zrobić

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

aby uniemożliwić dostęp do Dockera z zewnątrz.

kimy82
źródło
2

Korzystanie /etc/docker/daemon.jsonz treści

{
  "iptables": false
}

może to brzmieć jak rozwiązanie, ale działa tylko do następnego uruchomienia . Następnie możesz zauważyć, że żaden z twoich kontenerów nie ma dostępu do Internetu, więc nie możesz na przykład pingować żadnej witryny. Może to być niepożądane zachowanie.

To samo dotyczy wiązania kontenera z określonym adresem IP. Możesz tego nie chcieć. Ostateczną opcją jest utworzenie kontenera i postawienie go za UFW bez względu na to, co się stanie i sposób jego utworzenia, więc istnieje rozwiązanie:

Po utworzeniu /etc/docker/daemon.jsonpliku wywołaj:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

więc skonfiguruj domyślne zasady przekazywania w UFW do akceptowania i użyj:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Jeśli masz zamiar użyć narzędzia dokującego-komponuj, wówczas adres IP z powyższej komendy powinien zostać zastąpiony adresem IP tworzonego przez program dokujący-komponuj podczas jego uruchamiania docker-compose up.

Bardziej wyczerpująco opisałem problem i rozwiązanie w tym artykule

Mam nadzieję, że to pomoże!

mkubaczyk
źródło
1

W moim przypadku skończyłem modyfikować iptables, aby umożliwić dostęp do Dockera tylko z określonych adresów IP.

Zgodnie z odpowiedzią ESala :

Jeśli użyjesz -pflagi na kontenerach, doker dokona zmian bezpośrednio w iptables, ignorując ufw.

Przykład rekordów dodanych do iptables przez Docker

Kierowanie do łańcucha „DOCKER”:

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Przesyłanie pakietów z łańcucha „DOCKER” do kontenera:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

Możesz zmodyfikować iptables, aby umożliwić dostęp do łańcucha DOCKER tylko z określonego źródłowego adresu IP (np. 1.1.1.1):

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Możesz użyć iptables-save > /tmp/iptables.confi iptables-restore < /tmp/iptables.confzrzucić, edytować i przywracać reguły iptables.

Mechanik AI
źródło
0

Użyj --network = host podczas uruchamiania kontenera, aby doker mapował port na izolowaną sieć tylko hosta zamiast domyślnej sieci mostowej. Nie widzę legalnych sposobów blokowania zmostkowanej sieci. Alternatywnie można użyć niestandardowej sieci zdefiniowanej przez użytkownika z izolacją.

thecoder
źródło
0
  1. Zaloguj się do konsoli dokera:

    sudo docker exec -i -t nazwa_obrazu_dokera / bin / bash

  2. A następnie w konsoli dokującej:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. Dodaj swoje reguły ufw i włącz ufw

    sudo ufw enable

    • Twój obraz Dockera należy rozpocząć od --cap-add = NET_ADMIN

Aby włączyć opcję dokowania „NET_ADMIN”:

1. Zatrzymaj pojemnik:

doker zatrzymać swój kontener; 2. Pobierz identyfikator kontenera:

doker sprawdza twój kontener; 3. Zmodyfikuj hostconfig.json (domyślna ścieżka dokowania: / var / lib / docker, możesz zmienić swoją)

vim /var/lib/docker/containers/containerid/hostconfig.json

4. Wyszukaj „CapAdd” i zmień wartość null na [„NET_ADMIN”];

...., „VolumesFrom”: null, „CapAdd”: [„NET_ADMIN”], „CapDrop”: null, .... 5. Uruchom ponownie okno dokowane na komputerze-hoście;

restart dokera usługi; 6. Uruchom swójconatiner;

doker uruchom swój kontener;

Stefan
źródło
0

Kiedyś docker-composeuruchamiałem kilka kontenerów i miałem również problem z tym, że jeden port był narażony na świat, ignorując zasady ufw.

Poprawką polegającą na udostępnianiu portu tylko dla moich kontenerów dokerów była ta zmiana w moim docker-compose.ymlpliku:

ports:
- "1234:1234"

do tego:

ports:
- "1234"

Teraz inne kontenery dokujące nadal mogą korzystać z portu, ale nie mogę uzyskać do niego dostępu z zewnątrz.

TmTron
źródło