Źródłowe adresy IP na białej liście w CentOS 7


23

Chcę skonfigurować zaporę sieciową CentOS 7 w taki sposób, aby wszystkie przychodzące żądania były blokowane, z wyjątkiem pochodzących z adresów IP, które umieszczam na białej liście. A dla adresów IP z białej listy wszystkie porty powinny być dostępne.

Jestem w stanie znaleźć kilka rozwiązań (nie jestem pewien, czy będą działać), iptablesale używa CentOS 7 firewalld. Nie mogę znaleźć czegoś podobnego do osiągnięcia za pomocą firewall-cmdpolecenia.

Interfejsy znajdują się w strefie publicznej. Przeniosłem już wszystkie usługi do strefy publicznej.

Odpowiedzi:


44

Osiągnęłbym to, dodając źródła do strefy. Najpierw sprawdź, jakie źródła istnieją dla Twojej strefy:

firewall-cmd --permanent --zone=public --list-sources

Jeśli ich nie ma, możesz zacząć je dodawać, to jest Twoja „biała lista”

firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32

(Dodaje to cały /24i pojedynczy adres IP, dzięki czemu masz odniesienie zarówno do podsieci, jak i jednego adresu IP)

Ustaw zakres portów, które chcesz otworzyć:

firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

Robi to tylko porty od 1 do 22. Możesz to poszerzyć, jeśli chcesz.

Teraz ponownie załaduj to, co zrobiłeś.

firewall-cmd --reload

I sprawdź swoją pracę:

 firewall-cmd --zone=public --list-all

Notatka / artykuł redakcyjny: To nie ma znaczenia, ale podoba mi się strefa „zaufana” dla białej listy adresów IP w zaporze ogniowej. Możesz dokonać dalszej oceny, czytając sugestie redhat dotyczące wyboru strefy .

Zobacz też:


Jeśli chcesz spakować DROPpakiety spoza tego źródła, oto przykład upuszczania tych spoza tego, /24którego użyłem jako przykładu wcześniej, możesz użyć do tego bogatych reguł . Jest to koncepcyjne, nie przetestowałem go (poza tym, że centos 7 akceptuje polecenie), ale powinno być dość łatwe do wykonania pcap i sprawdzenia, czy zachowuje się tak, jak można się spodziewać

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'

Wielkie dzięki za odpowiedź. Nie można głosować z powodu braku reputacji. Ale jak usunąć wszystkie inne adresy IP oprócz tego, który dodałem za pomocą źródeł?
Krishnandu Sarkar

Dzięki @KrishnanduSarkar - masz rację, domyślnie powinno to być odrzucenie ICMP. Ale myślę, że możesz dodać bogatą regułę, aby upuścić pakiety. Do mojej odpowiedzi dodałem przykład, który moim zdaniem zadziała. Dzięki za głosowanie, rozumiem, jeśli odpowiedź zadziała, rozważ jej przyjęcie.
dougBTV,

Świetna odpowiedź, do tej pory używałem iptables.
Tensigh,

(!) Ta odpowiedź nie będzie działać zgodnie z oczekiwaniami dla bieżącej domyślnej konfiguracji FirewallD (interfejsy są domyślnie przypisane do strefy publicznej).
dess

25

Nawet jeśli odpowiedź została zaakceptowana i przegłosowana, nie sądzę, aby była poprawna. Nie mogę znaleźć jasnego wyjaśnienia w dokumentacji, ale z zaimplementowanego zachowania wygląda to tak:

  1. interfejs i źródło są używane jako selektory - które strefy należy aktywować
  2. oba są ignorowane dla strefy domyślnej (zawsze aktywne)

Tak więc odpowiedź brzmiałaby:

  1. zablokuj strefę domyślną, powiedz „public” - brak otwartych portów lub dostępnych usług
  2. w innej strefie powiedz „praca” - zdefiniuj źródła i otwarte porty

Na przykład zakładając, że strefa domyślna jest publiczna i nie ma otwartych portów, dodaj źródło i zakres portów do strefy „roboczej”:

$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp

teraz sprawdź strefy aktywne (strefa domyślna jest zawsze aktywna):

$ sudo firewall-cmd --get-active-zones

dostaniesz:

work
  sources: 192.168.0.0/24

tak więc reguły strefy „roboczej” będą miały zastosowanie do konkretnej podsieci. Będziesz miał szereg otwartych portów dla podsieci „białej listy” = zgodnie z żądaniem. I oczywiście użyj --permanentopcji w --add-xxxinstrukcjach, aby zachować zachowanie.

Z kolei wszelkie porty lub usługi znajdujące się w strefie „publicznej” (domyślnej) będą miały zastosowanie do wszystkich interfejsów i adresów źródłowych.

$ sudo firewall-cmd --list-all-zones

public (default)
interfaces:
sources:
services:
ports: 
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

work (active)
interfaces: 
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Ten sam system działa dla interfejsów. Powiedz, dodając interfejs „ens3” do strefy „pracy”:

$ sudo firewall-cmd --zone=work --add-interface=ens3

będziesz używać reguł strefy „roboczej” do wszelkich żądań z konkretnego interfejsu - bardziej zgrubny selektor niż „źródło”.


4
To najlepsza odpowiedź. Najważniejsze jest wyjaśnienie, że ustawienie interfejsu rozszerza dostęp (w przypadku ustawienia źródeł). Miałem problem z dostępem do portów, mimo że miałem sourcesbiałą listę. Powodem było to, że do strefy przypisano interfejs.
pinkeen

1
Aby być dokładnie poprawnym, ta odpowiedź wymaga usunięcia wszystkich domyślnych usług ze publicstrefy, jeśli takie istnieją (usługi te będą dostępne dla wszystkich adresów, ponieważ interfejsy są publicdomyślnie przypisane do strefy). Lub zmień strefę domyślną na inną: blocklub drop(jest to powszechna praktyka). Lub zmień publiccel strefy na %%REJECT%%lub DROP.
dess

6

Oświadczenie: Właściwie nie próbowałem tego, co sugeruję tutaj, ale jest to dość zbliżone do ostatniej konfiguracji zapory ogniowej, więc zrobiłem to. Firewalld zapewnia kilka wstępnie skonfigurowanych stref, właśnie w tym celu. Jest jeden o nazwie „upuść”, który upuszcza wszystko, co do niego przychodzi, a drugi o nazwie „zaufany”, który pozwala na dowolne połączenie (tzn. Myślę, że nawet nie powinieneś otwierać poszczególnych portów). Sztuczka polega na tym, aby uzyskać odpowiednią strefę do uruchomienia tego, co chcesz.

Firewalld zastosuje reguły dla strefy w oparciu o następujący priorytet:

  • Jeśli źródłowy adres IP pasuje do źródłowego adresu IP powiązanego ze strefą, używa go.
  • Jeśli źródłowy adres IP nie pasuje do żadnej konkretnej strefy, sprawdza, czy istnieje strefa skonfigurowana dla interfejsu, do którego przyszedł pakiet. Jeśli istnieje, wykorzystuje to.
  • Wreszcie, jeśli nic innego nie pasuje, wykorzystuje strefę domyślną.

Po pierwsze, chcesz powiązać swoje zaufane adresy IP ze strefą „zaufaną”:

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

Następnie ustaw strefę domyślną na „upuszczenie” lub powiąż z nią interfejs:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

a następnie wprowadzić zmiany (ostrzeżenie: prawdopodobnie spowoduje to przerwanie połączenia, jeśli robisz to przez sieć i nie dodałeś źródłowego adresu IP do strefy zaufanej):

firewall-cmd --reload

Oczywiście można je również tymczasowo przetestować, pomijając „--permanent” (i wtedy nie trzeba też ponownie ładować).


blockmożna również użyć (zamiast drop), jeśli chcesz powiedzieć innym gospodarzom, że z nimi nie rozmawiasz ...
Gert van den Berg

5

W ten sposób obsługuję moje zapory ogniowe. Oto moja preferowana metoda osiągnięcia tego, co chcesz.

# firewall-cmd --list-all

Zobaczysz, że Twoja strefa domyślna jest publiczna, a włączone usługi to klient dhcpv6 i ssh. Nie chcemy żadnych dostępnych usług publicznych, prawda? Dozwolone są tylko adresy IP z białej listy. Usuńmy więc dwie usługi publiczne.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Teraz umieśćmy na białej liście konkretny adres IP, który zapewnia dostęp do dowolnego portu.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Teraz umieśćmy na białej liście kolejny adres IP, który chcemy mieć tylko dostęp do SSH, http i https. Żadnych innych portów.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Jeśli łączysz się przez SSH, upewnij się, że autoryzujesz swój adres IP przed zastosowaniem nowego zestawu reguł. Gdy będzie gotowy do zastosowania nowych zasad.

#firewall-cmd --reload

2

Możesz łatwo zarządzać za pomocą Rich Rule.

Pierwszy krok

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Drugi krok - Dodaj bogatą regułę

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

Wszystkie porty są dostępne przez 192.168.2.2 po dodaniu reguły rozszerzonej i zablokowaniu każdego portu z innego źródła.

Jeśli dodasz dowolny port lub usługę za pomocą poniższego polecenia, będzie on dostępny dla wszystkich źródeł.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Jeśli chcesz otworzyć określony port dla określonego IP niż polecenie poniżej

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'

2

Najlepsza odpowiedź z dougBTV jest błędna. Nie mogę odpowiedzieć na jego odpowiedź, ponieważ nie mam jeszcze wymaganych punktów powtórzeń, więc wyjaśnię tutaj:

Używa domyślnej strefy „public”. Wiąże sieci do tej strefy, a następnie otwiera porty w tej strefie. Ale przy domyślnej konfiguracji cały ruch przechodzi przez strefę domyślną, a nie tylko sieci źródłowe, z którymi jest ona powiązana. Więc jego polecenia --add-source nie mają znaczenia, a jego polecenia --add-port pozwoliły teraz całemu światu na dostęp do tych portów.

Druga odpowiedź Normundsa Kalnberzinsa jest poprawna. Chcesz utworzyć oddzielną strefę, powiązać sieć / adresy IP z tą strefą i otworzyć porty w tej strefie.

Alternatywnie możesz zostawić wszystko w strefie domyślnej i użyć bogatych reguł firewalld, aby umożliwić dostęp z niektórych adresów IP:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Umożliwia to cały ruch z 192.168.2.2 do wszystkich portów, a ponieważ nie określiłem strefy, zostanie ona zastosowana do domyślnej strefy „publicznej” (użyj --get-default-zone, aby sprawdzić, jaka jest twoja domyślna strefa i - get-active-zone, aby zobaczyć, które strefy są aktualnie w użyciu).

Aby umożliwić dostęp z tego adresu IP tylko do określonego portu, zrobiłbym:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

Najlepszą praktyką jest uruchamianie tych poleceń bez opcji --permanent (lub --perm w skrócie), co wpływa na aktualnie działającą zaporę. Po sprawdzeniu, że reguła działa, uruchom ją ponownie z dołączonym opcją --perm, aby była pamiętana przy kolejnych przeładowaniach zapory ogniowej.


1

Wystarczy dodać do Normunds odpowiedź:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Aby zablokować cały pozostały ruch:

$ sudo firewall-cmd --set-default-zone=drop

Ostrzeżenie: jeśli uzyskujesz dostęp ze zdalnego komputera, może to spowodować przerwanie sesji logowania. Jeśli konfiguracja adresu IP strefy „work” nie przebiegła prawidłowo, nie będzie można połączyć się z serwerem.

Aby ponownie załadować zaporę:

$ sudo firewall-cmd --reload

Nie mogłem wymyślić, jak dodać dwa różne adresy IP za pomocą „--add-rich-rule”.


W przypadku bieżącej domyślnej konfiguracji FirewallD może to nie wystarczyć. Szczegółowe informacje można znaleźć w moim komentarzu do odpowiedzi Normundsa.
dess

dla wielu adresów IP użyj utwórz ipsetjak firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipdodać IPP do ipset, a firewall-cmd --ipset=blacklist --add-entry=192.168.1.4następnie możesz użyćfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye

0

Dziwię się, że odpowiedzi strefy zaufanej nie są wybraną odpowiedzią. Strefa zaufana ma domyślny „cel: AKCEPTUJ”, podczas gdy reszta to „cel: domyślnie”. Chociaż tak naprawdę nie ma znaczenia, wydaje się, że jest to zamierzona metoda ze względu na jej nazwę i domyślną wartość docelową.

Jak szybko zablokować pudełko, aby tylko Ty mógł uzyskać do niego dostęp:

firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones

Po wylistowaniu wszystkich stref powinieneś zobaczyć coś takiego:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  sources: 1.2.3.4 5.6.7.8/24
  masquerade: no

drop (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth1
  masquerade: no

Uwaga: usunąłem wiersze o wartości zerowej / brakującej. Ważne jest to, że zarówno zaufane, jak i upuszczone są (aktywne), a upuszczenie ma publiczny interfejs.

Co to robi z iptables w celu demonstracji:

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination
IN_trusted  all  --  1.2.3.4         0.0.0.0/0
IN_trusted  all  --  5.6.7.8/24        0.0.0.0/0
Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.