Je souhaite configurer le pare-feu CentOS 7 de telle sorte que toutes les demandes entrantes soient bloquées, à l'exception des adresses IP d'origine que j'ai ajoutées à la liste blanche. Et pour les adresses IP de liste blanche, tous les ports doivent être accessibles.
Je suis en mesure de trouver quelques solutions (je ne sais pas si elles fonctionneront) pour iptables
mais CentOS 7 utilise firewalld
. Je ne trouve rien de similaire à réaliser avec firewall-cmd
commande.
Les interfaces sont dans la zone publique. J'ai également déjà déplacé tous les services vers la zone publique.
J'accomplirais cela en ajoutant des sources à une zone. Vérifiez d'abord les sources disponibles pour votre zone:
firewall-cmd --permanent --zone=public --list-sources
S'il n'y en a pas, vous pouvez commencer à les ajouter, c'est votre "liste blanche"
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
(Cela ajoute un tout /24
et une seule IP, juste pour avoir une référence à la fois pour un sous-réseau et une seule IP)
Définissez la plage de ports que vous souhaitez ouvrir:
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp
Cela ne fait que les ports 1 à 22. Vous pouvez élargir cela, si vous le souhaitez.
Maintenant, rechargez ce que vous avez fait.
firewall-cmd --reload
Et vérifiez votre travail:
firewall-cmd --zone=public --list-all
Note latérale/éditorial: Peu importe, mais j'aime la zone "de confiance" pour un ensemble d'adresses IP répertoriées dans firewalld. Vous pouvez faire une évaluation supplémentaire en lisant les suggestions de redhat sur le choix d'une zone .
Voir également:
Si vous souhaitez DROP
paquets en dehors de cette source, voici un exemple pour supprimer ceux en dehors de /24
J'ai utilisé comme exemple plus tôt, vous pouvez utiliser des règles riches pour cela , je crois. C'est conceptuel, je ne l'ai pas testé (plus loin que de voir que centos 7 accepte la commande), mais, devrait être assez facile pour faire un pcap et voir s'il se comporte comme vous vous y attendez
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
Même si une réponse a été acceptée et votée, je ne pense pas qu'elle soit correcte. Je ne trouve pas d'explication claire dans la documentation, mais d'après le comportement implémenté, cela ressemble à ceci:
La réponse serait donc:
Par exemple, en supposant que la zone par défaut est publique et n'a pas de ports ouverts, ajoutez la source et la plage de ports à la zone "de travail":
$ Sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ Sudo firewall-cmd --zone=work --add-port=8080-8090/tcp
vérifiez maintenant les zones actives (la zone par défaut est toujours active):
$ Sudo firewall-cmd --get-active-zones
tu auras:
work
sources: 192.168.0.0/24
donc les règles de zone "de travail" s'appliqueront au sous-réseau particulier. Vous aurez une gamme de ports ouverts pour la "liste blanche" = sous-résea comme demandé. Et bien sûr, utilisez --permanent
option dans --add-xxx
instructions pour que le comportement reste fidèle.
À son tour, tous les ports ou services que vous avez dans la zone "publique" (par défaut) s'appliqueront à toutes les interfaces et adresses source.
$ 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:
Le même système fonctionne pour les interfaces. Dites en ajoutant l'interface "ens3" à la zone "travail":
$ Sudo firewall-cmd --zone=work --add-interface=ens3
vous utiliserez les règles de zone "de travail" pour toutes les demandes de l'interface particulière - sélecteur plus grossier que "source".
Avertissement: je n'ai pas vraiment essayé ce que je suggère ici, mais c'est assez proche de la dernière configuration de pare-feu que j'ai faite, donc je m'en vais. Firewalld vous fournit quelques zones préconfigurées, juste à cet effet. Il y en a un appelé "drop", qui supprime tout ce qui entre, et un appelé "trusted", qui permet une connexion any (c'est-à-dire que vous ne devriez même pas avoir besoin d'ouvrir des ports individuels, je pense). L'astuce consiste à obtenir la bonne zone pour déclencher ce que vous voulez.
Firewalld appliquera les règles d'une zone en fonction de la priorité suivante:
Donc, tout d'abord, vous voulez lier vos IP de confiance à la zone "de confiance":
firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4
Ensuite, définissez votre zone par défaut sur "drop" ou liez votre interface à celle-ci:
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0
puis effectuez les modifications (avertissement: cela interrompra probablement votre connexion si vous le faites sur le réseau et que vous n'avez pas ajouté votre IP source à la zone de confiance):
firewall-cmd --reload
Bien sûr, vous pouvez également les tester temporairement en omettant le "--permanent" (et vous n'avez pas non plus à - recharger).
J'utilise mes pare-feu de cette manière. Voici ma méthode préférée pour accomplir ce que vous voulez.
# firewall-cmd --list-all
Vous verrez que votre zone par défaut est publique et que les services activés sont dhcpv6-client et ssh. Nous ne voulons pas de services publics disponibles, non? Seuls les IP sur liste blanche sont autorisés. Supprimons donc les deux services publics.
# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
Maintenant, ajoutons à la liste blanche une adresse IP spécifique qui donne accès à n'importe quel port.
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'
Maintenant, inscrivons sur liste blanche une autre IP, que nous voulons seulement avoir accès aux accès SSH, http et https. Pas d'autres 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'
Si vous vous connectez via SSH, assurez-vous d'autoriser votre IP avant d'appliquer votre nouveau jeu de règles. Lorsque vous êtes prêt à appliquer les nouvelles règles.
#firewall-cmd --reload
Vous pouvez gérer facilement par Rich Rule.
Première étape
firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0
Deuxième étape - Ajouter une règle riche
firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'
Tous les ports sont accessibles par 192.168.2.2 une fois que vous avez ajouté une règle riche et bloqué tous les ports d'autres sources.
Si vous ajoutez un port ou un service par la commande ci-dessous, il sera accessible par toutes les sources.
firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080
Si vous souhaitez ouvrir un port spécifique pour une commande Ip inférieure à la commande ci-dessous
firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
La meilleure réponse de dougBTV est fausse. Je ne peux pas répondre à sa réponse car je n'ai pas encore les points de représentation requis, je vais donc expliquer ici:
Il utilise la zone par défaut "public". Il lie des réseaux à cette zone, puis ouvre des ports sur cette zone. Mais, dans une configuration par défaut, tout le trafic passe par la zone par défaut, pas seulement les réseaux sources auxquels vous y êtes lié. Ses commandes --add-source ne font donc aucune différence et ses commandes --add-port ont maintenant permis au monde entier d'accéder à ces ports.
La 2e réponse de Normunds Kalnberzins est correcte. Vous souhaitez créer une zone distincte, lier votre réseau/IP à cette zone et ouvrir les ports de cette zone.
Alternativement, vous pouvez tout laisser dans la zone par défaut et utiliser les règles riches de firewalld pour autoriser l'accès à partir de certaines IP:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
Cela autorise tout le trafic de 192.168.2.2 vers tous les ports et parce que je n'ai pas spécifié de zone, cela sera appliqué à la zone par défaut "public" (utilisez --get-default-zone pour vérifier quelle est votre zone par défaut et - get-active-zones pour voir quelles zones sont actuellement utilisées).
Pour autoriser l'accès de cette IP uniquement à un port spécifique, je ferais:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'
La meilleure pratique consiste à exécuter ces commandes sans --permanent (ou --perm pour faire court), ce qui affecte le pare-feu en cours d'exécution. Après avoir vérifié que votre règle fonctionne, exécutez-la à nouveau avec --perm ajouté afin qu'elle soit mémorisée lors des rechargements suivants de firewalld.
Pour ajouter à la réponse de Normunds:
$ Sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ Sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp
Pour bloquer tout autre trafic:
$ Sudo firewall-cmd --set-default-zone=drop
Avertissement: si vous accédez à partir d'une machine distante, cela peut déconnecter votre session de connexion. Si vous n'avez pas obtenu la configuration IP de la zone de travail correctement, vous ne pourrez pas vous connecter à votre serveur.
Pour recharger le pare-feu:
$ Sudo firewall-cmd --reload
Je ne pouvais pas comprendre comment ajouter deux adresses IP différentes avec "--add-rich-rule".
Je suis surpris que les réponses de la zone de confiance ne soient pas la réponse sélectionnée. La zone de confiance a une "cible: ACCEPTER" par défaut tandis que les autres sont "cible: par défaut". Même si cela n'a pas vraiment d'importance, il semble que ce soit la méthode prévue en raison de son nom et de sa valeur cible par défaut.
Comment verrouiller rapidement une boîte pour que vous seul puissiez y accéder:
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
Après avoir répertorié toutes les zones, vous devriez voir quelque chose comme ceci:
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
Remarque: j'ai supprimé les lignes avec une valeur nulle/manquante. L'important est que trust et drop soient tous deux (actifs) et drop a votre interface publique.
Ce que cela fait à iptables pour la démonstration:
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