Whitelist-Quell-IP-Adressen in CentOS 7

23

Ich möchte die CentOS 7-Firewall so einrichten, dass alle eingehenden Anforderungen blockiert werden, mit Ausnahme der ursprünglichen IP-Adressen, die ich in die Whitelist aufgenommen habe. Und für die Whitelist-IP-Adressen sollten alle Ports zugänglich sein.

Ich kann nur wenige Lösungen finden (nicht sicher, ob sie funktionieren), iptablesaber CentOS 7 verwendet sie firewalld. Ich kann etwas Ähnliches nicht finden, um es mit dem firewall-cmdKommando zu erreichen .

Die Schnittstellen befinden sich in der öffentlichen Zone. Ich habe auch schon alle Dienste in die öffentliche Zone verlegt.

Krishnandu Sarkar
quelle

Antworten:

44

Dazu füge ich einer Zone Quellen hinzu. Überprüfen Sie zunächst, welche Quellen für Ihre Zone verfügbar sind:

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

Wenn keine vorhanden sind, können Sie sie hinzufügen. Dies ist Ihre "Whitelist".

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

(Das fügt eine ganze /24und eine einzelne IP hinzu, nur damit Sie eine Referenz für ein Subnetz und eine einzelne IP haben.)

Legen Sie den Bereich der Ports fest, die geöffnet werden sollen:

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

Dies macht nur die Ports 1 bis 22. Sie können dies erweitern, wenn Sie möchten.

Laden Sie jetzt neu, was Sie getan haben.

firewall-cmd --reload

Und überprüfe deine Arbeit:

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

Randnotiz / Leitartikel: Es spielt keine Rolle, aber ich mag die "vertrauenswürdige" Zone für einen Satz von IPs auf der weißen Liste in der Firewall. Sie können eine weitere Beurteilung vornehmen, indem Sie die Vorschläge von redhat zur Auswahl einer Zone lesen .

Siehe auch:


Wenn Sie DROPPakete außerhalb dieser Quelle senden möchten, finden Sie hier ein Beispiel für das Löschen von Paketen außerhalb der Pakete, die /24ich zuvor als Beispiel verwendet habe. Ich glaube , Sie können hierfür umfangreiche Regeln verwenden . Dies ist konzeptionell, ich habe es nicht getestet (abgesehen davon, dass Centos 7 den Befehl akzeptiert), aber es sollte einfach genug sein, einen PCAP durchzuführen und zu prüfen, ob es sich so verhält, wie Sie es erwarten

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
dougBTV
quelle
Vielen Dank für die Antwort. Kann nicht abstimmen, weil der Ruf nicht stimmt. Aber wie lösche ich alle anderen IPs mit Ausnahme derjenigen, die ich mithilfe von Quellen hinzugefügt habe?
Krishnandu Sarkar
Danke @KrishnanduSarkar - Sie haben Recht, standardmäßig sollte es eine ICMP-Ablehnung sein. Aber ich denke, Sie können eine Rich-Regel hinzufügen, um die Pakete zu verwerfen. Ich habe meiner Antwort ein Beispiel hinzugefügt, von dem ich denke, dass es funktionieren wird. Vielen Dank für die positive Bewertung. Wenn eine Antwort funktioniert, sollten Sie eine Antwort akzeptieren.
DougBTV
Tolle Antwort, ich hatte bisher iptables verwendet.
Tensigh
(!) Diese Antwort funktioniert bei der aktuellen FirewallD-Standardkonfiguration nicht wie erwartet (Schnittstellen werden standardmäßig der öffentlichen Zone zugewiesen).
Dess
24

Auch wenn eine Antwort akzeptiert und positiv bewertet wurde, halte ich sie nicht für richtig. Ich finde keine klare Erklärung in der Dokumentation, aber vom implementierten Verhalten sieht es so aus:

  1. Schnittstelle und Quelle werden als Selektoren verwendet - welche Zone (n) aktiviert werden sollen
  2. beide werden für die Standardzone ignoriert (immer aktiv)

Die Antwort wäre also:

  1. Sperren Sie die Standardzone, sagen Sie "öffentlich" - keine Ports offen oder Dienste verfügbar
  2. Sagen Sie in einer anderen Zone "Arbeit" - definieren Sie Quell- und offene Ports

Angenommen, die Standardzone ist öffentlich und hat keine offenen Ports, fügen Sie der Arbeitszone Quelle und Portbereich hinzu:

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

Überprüfen Sie nun die aktiven Zonen (Standardzone ist immer aktiv):

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

Du wirst kriegen:

work
  sources: 192.168.0.0/24

Daher gelten die Regeln für Arbeitszonen für das jeweilige Subnetz. Sie haben eine Reihe von offenen Ports für das Subnetz "Whitelist" = wie angefordert. Und natürlich verwenden Sie die --permanentOption in --add-xxxAnweisungen, um das Verhalten beizubehalten.

Alle Ports oder Dienste, die Sie in der "öffentlichen" (Standard-) Zone haben, gelten wiederum für alle Schnittstellen und Quelladressen.

$ 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:

Dasselbe System funktioniert für Schnittstellen. Sprich durch Hinzufügen der Schnittstelle "ens3" zur "Arbeits" -Zone:

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

Sie verwenden die Zonenregeln "Arbeit" für alle Anforderungen von der jeweiligen Schnittstelle - grobe Auswahl als "Quelle".

Normunds Kalnberzins
quelle
4
Das ist die beste Antwort. Der wichtigste Teil ist die Erklärung, dass das Festlegen einer Schnittstelle den Zugriff erweitert (falls Quellen festgelegt sind). Ich hatte ein Problem damit, dass die Ports zugänglich waren, obwohl ich eine sourcesWhitelist hatte. Der Grund war, dass der Zone eine Schnittstelle zugewiesen wurde.
Pinkeen
1
Um genau richtig zu sein, müssen alle Standarddienste aus der publicZone entfernt werden (diese Dienste sind für alle Adressen verfügbar, da die Schnittstellen publicstandardmäßig der Zone zugewiesen sind ). Oder ändern Sie die Standardzone in eine andere: blockoder drop(dies ist gängige Praxis). Oder ändern Sie das publicZonenziel in %%REJECT%%oder DROP.
Dess
6

Haftungsausschluss: Ich habe nicht wirklich versucht, was ich hier vorschlage, aber es ist ziemlich nah an der letzten Firewall-Einrichtung, die ich gemacht habe, also gehe ich davon aus. Firewalld stellt Ihnen zu diesem Zweck einige vorkonfigurierte Zonen zur Verfügung. Es gibt einen namens "drop", der alles fallen lässt, was hereinkommt, und einen namens "trusted", der es erlaubt jede Verbindung (dh, Sie sollten nicht einmal einzelne Ports öffnen müssen, denke ich). Der Trick besteht darin, die richtige Zone zu finden, um das auszulösen, was Sie möchten.

Firewalld wendet die Regeln für eine Zone basierend auf der folgenden Rangfolge an:

  • Wenn die Quell-IP mit einer an eine Zone gebundenen Quell-IP übereinstimmt, wird diese verwendet.
  • Wenn die Quell-IP keiner bestimmten Zone entspricht, wird geprüft, ob für die Schnittstelle, an der das Paket eingegangen ist, eine Zone konfiguriert ist . Wenn es eine gibt, wird diese verwendet.
  • Wenn nichts anderes zutrifft, wird die Standardzone verwendet.

Zunächst möchten Sie Ihre vertrauenswürdigen IP-Adressen an die "vertrauenswürdige" Zone binden:

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

Dann setzen Sie entweder Ihre Standardzone auf "drop" oder binden Sie Ihre Schnittstelle daran:

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

und dann die Änderungen wirksam werden lassen (Warnung: Dies wird wahrscheinlich Ihre Verbindung unterbrechen, wenn Sie dies über das Netzwerk tun und Ihre Quell-IP nicht zur vertrauenswürdigen Zone hinzugefügt haben):

firewall-cmd --reload

Natürlich können Sie diese auch nur vorübergehend testen, indem Sie "--permanent" weglassen (und dann müssen Sie auch nicht --reloaden).

Jemenake
quelle
blockkann auch verwendet werden (anstelle von drop), wenn Sie anderen Hosts mitteilen möchten, dass Sie nicht mit ihnen sprechen ....
Gert van den Berg
5

Ich bediene meine Firewalls auf diese Weise. Hier ist meine bevorzugte Methode, um das zu erreichen, was Sie wollen.

# firewall-cmd --list-all

Sie sehen, dass Ihre Standardzone öffentlich ist und die aktivierten Dienste dhcpv6-client und ssh sind. Wir wollen doch keine öffentlichen Dienste, oder? Nur die IPs auf der Whitelist sind berechtigt. Entfernen wir also die beiden öffentlichen Dienste.

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

Lassen Sie uns nun eine bestimmte IP-Adresse auf die Whitelist setzen, die Zugriff auf einen beliebigen Port gewährt.

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

Lassen Sie uns jetzt eine andere IP-Adresse auf die Whitelist setzen, die nur Zugriff auf SSH, http und https haben soll. Keine anderen Ports.

#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'

Wenn Sie eine Verbindung über SSH herstellen, müssen Sie Ihre IP-Adresse autorisieren, bevor Sie Ihren neuen Regelsatz anwenden. Wenn Sie bereit sind, die neuen Regeln anzuwenden.

#firewall-cmd --reload
Sagaponack FX
quelle
2

Sie können problemlos mit Rich Rule verwalten.

Erster Schritt

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

Zweiter Schritt - Rich Rule hinzufügen

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

Auf alle Ports kann von 192.168.2.2 zugegriffen werden, sobald Sie eine Rich-Regel hinzugefügt und alle Ports von anderen Quellen blockiert haben.

Wenn Sie einen Port oder Dienst mit dem folgenden Befehl hinzufügen, können alle Quellen darauf zugreifen.

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

Wenn Sie einen bestimmten Port für ein bestimmtes IP öffnen möchten, gehen Sie wie folgt vor

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

Die Top-Antwort von dougBTV ist falsch. Ich kann auf seine Antwort nicht antworten, da ich noch nicht die erforderlichen Wiederholungspunkte habe. Deshalb erkläre ich hier:

Er verwendet die Standardzone "public". Er bindet Netzwerke an diese Zone und öffnet dann Ports in dieser Zone. In einer Standardkonfiguration durchläuft der gesamte Datenverkehr jedoch die Standardzone und nicht nur die Quellnetzwerke, die Sie mit ihr verknüpfen. Seine --add-source-Befehle machen also keinen Unterschied, und seine --add-port-Befehle haben jetzt der ganzen Welt den Zugriff auf diese Ports ermöglicht.

Die 2. Antwort von Normunds Kalnberzins ist richtig. Sie möchten eine separate Zone erstellen, Ihr Netzwerk / Ihre IP-Adressen an diese Zone binden und die Ports in dieser Zone öffnen.

Alternativ können Sie alles in der Standardzone belassen und die umfangreichen Firewall-Regeln verwenden, um den Zugriff von bestimmten IP-Adressen aus zuzulassen:

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

Dadurch wird der gesamte Datenverkehr von 192.168.2.2 zu allen Ports zugelassen. Da ich keine Zone angegeben habe, wird dieser auf die Standardzone "public" angewendet. Get-Active-Zones, um zu sehen, welche Zonen derzeit verwendet werden.

Um den Zugriff von dieser IP nur auf einen bestimmten Port zuzulassen, würde ich Folgendes tun:

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

Es wird empfohlen, diese Befehle ohne --permanent (oder kurz --perm) auszuführen, was sich auf die derzeit ausgeführte Firewall auswirkt. Nachdem Sie getestet haben, ob Ihre Regel funktioniert, führen Sie sie erneut mit angefügtem --perm aus, damit sie bei nachfolgenden Firewall-Neuladungen gespeichert wird.

devhen
quelle
1

Nur um Normunds Antwort hinzuzufügen:

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

So blockieren Sie den gesamten anderen Datenverkehr:

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

Warnung: Wenn Sie vom Remotecomputer aus zugreifen, wird möglicherweise die Anmeldesitzung getrennt. Wenn Sie das IP-Setup für die 'Arbeits'-Zone nicht korrekt erhalten haben, können Sie keine Verbindung zu Ihrem Server herstellen.

So laden Sie die Firewall neu:

$ sudo firewall-cmd --reload

Ich konnte nicht herausfinden, wie ich mit '--add-rich-rule' zwei verschiedene IPs hinzufügen kann.

SongLiAtDuke
quelle
Für die aktuelle FirewallD-Standardkonfiguration reicht dies möglicherweise nicht aus. Siehe meinen Kommentar zu Normunds Antwort für Details.
Dess
für mehrere IPs erstelle ein ipsetlike firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipadd ips zum ipset mit firewall-cmd --ipset=blacklist --add-entry=192.168.1.4dann kannst dufirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye
0

Ich bin überrascht, dass die Antworten in der vertrauenswürdigen Zone nicht die ausgewählte Antwort sind. Die vertrauenswürdige Zone hat ein Standardziel: AKZEPTIEREN, während der Rest "Ziel: Standard" ist. Obwohl es wirklich egal ist, scheint es sich aufgrund des Namens und des Standardzielwerts um die beabsichtigte Methode zu handeln.

So schließen Sie eine Box schnell ab, damit nur Sie darauf zugreifen können:

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

Nachdem Sie alle Zonen aufgelistet haben, sollten Sie Folgendes sehen:

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

Hinweis: Ich habe Zeilen mit einem Null- / fehlenden Wert entfernt. Wichtig ist, dass Trusted und Drop beide (aktiv) sind und Drop Ihre öffentliche Schnittstelle hat.

Was dies für iptables zur Demonstration bedeutet:

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
Kirin
quelle