Po raz pierwszy konfiguruję serwer Ubuntu (14.04 LTS) i mam problem z konfiguracją zapory ogniowej (UFW).
Potrzebuję tylko ssh
i http
dlatego 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)
ufw status
8083
i8086
. Dodałemufw status verbose
wynik w pytaniu. Dzięki.Odpowiedzi:
Problem polegał na użyciu
-p
flagi na kontenerach.Okazuje się, że Docker dokonuje zmian bezpośrednio na twoim
iptables
, których nie pokazujeufw status
.Możliwe rozwiązania to:
Przestań używać
-p
flagi. Zamiast tego użyj łącza dokującego lub sieci dokerów .Wiąż pojemniki lokalnie, aby nie były narażone na zewnątrz urządzenia
docker run -p 127.0.0.1:8080:8080 ...
Jeśli nalegasz na użycie
-p
flagi, powiedz dokerowi, aby nie dotykał twojegoiptables
, wyłączając je/etc/docker/daemon.json
i 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.
źródło
-p
jak 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:80
a--link
dla innych. W ten sposób nie może dojść do żadnych kolizji portów, a jedynym punktem dostępu jest nginx./etc/default/docker
to plik konfiguracyjny używany przez konfigurację upstart. Jeśli przeszedłeś z wersji upstart do systemd, ten plik nie zostanie użyty.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.json
i wstawić następujące:Potem wydał
sudo service docker stop
następniesudo service docker start
WRESZCIE doker jest po prostu po właściwych przepisów UFW.Dodatkowe dane: Docker unieważnia UFW!
źródło
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 maiptables
skonfigurowany klucz: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_POLICY
jakoACCEPT
włączony/etc/default/ufw
i zastosować sztuczkę opisaną tutaj: https://stackoverflow.com/a/17498195/507564źródło
Szybkim obejściem jest uruchomienie Dockera i mapowanie portów. Zawsze możesz to zrobić
aby uniemożliwić dostęp do Dockera z zewnątrz.
źródło
Korzystanie
/etc/docker/daemon.json
z treścimoż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.json
pliku wywołaj:więc skonfiguruj domyślne zasady przekazywania w UFW do akceptowania i użyj:
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!
źródło
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 :
Przykład rekordów dodanych do iptables przez Docker
Kierowanie do łańcucha „DOCKER”:
Przesyłanie pakietów z łańcucha „DOCKER” do kontenera:
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
):Możesz użyć
iptables-save > /tmp/iptables.conf
iiptables-restore < /tmp/iptables.conf
zrzucić, edytować i przywracać reguły iptables.źródło
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ą.
źródło
Zaloguj się do konsoli dokera:
A następnie w konsoli dokującej:
Dodaj swoje reguły ufw i włącz ufw
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ą)
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;
źródło
Kiedyś
docker-compose
uruchamiał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.yml
pliku:do tego:
Teraz inne kontenery dokujące nadal mogą korzystać z portu, ale nie mogę uzyskać do niego dostępu z zewnątrz.
źródło