Adresses IP source de liste blanche dans CentOS 7

23

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), iptablesmais CentOS 7 les utilise firewalld. Je ne trouve pas quelque chose de similaire à réaliser avec la firewall-cmdcommande.

Les interfaces sont dans la zone publique. J'ai également déjà déplacé tous les services vers la zone publique.

Krishnandu Sarkar
la source

Réponses:

44

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 ensemble /24et une seule IP, juste pour que vous ayez 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 mettre des DROPpaquets en dehors de cette source, voici un exemple pour supprimer ceux en dehors de celui que /24j'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'
dougBTV
la source
Merci beaucoup d'avoir répondu. Impossible de voter en raison d'une pénurie de réputation. Mais comment supprimer toutes les autres IP, à l'exception de celle que j'ai ajoutée à l'aide de sources?
Krishnandu Sarkar
Merci @ KrishnanduSarkar - vous avez raison, par défaut, ce devrait être un rejet ICMP. Mais, je pense que vous pouvez ajouter une règle riche pour supprimer les paquets. J'ai ajouté un exemple à ma réponse qui, je pense, fonctionnera. Merci concernant le vote positif, je comprends, si une réponse fonctionne, envisagez d'accepter une réponse.
dougBTV
Excellente réponse, j'avais utilisé iptables jusqu'à présent.
Tensigh
(!) Cette réponse ne fonctionnera pas comme prévu pour la configuration FirewallD par défaut actuelle (les interfaces sont assignées à la zone publique par défaut).
dess
25

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:

  1. l'interface et la source sont utilisées comme sélecteurs - quelle (s) zone (s) activer
  2. les deux sont ignorés pour la zone par défaut (toujours actif)

La réponse serait donc:

  1. verrouiller la zone par défaut, dites "public" - pas de ports ouverts ou de services disponibles
  2. dans une autre zone, dites "travail" - définissez les ports source et ouverts

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 le "whitelist" = sous-réseau comme demandé. Et bien sûr, utilisez l' --permanentoption dans les --add-xxxinstructions pour que le comportement reste fidèle.

En retour, 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".

Normunds Kalnberzins
la source
4
C'est la meilleure réponse. La partie la plus cruciale est l'explication selon laquelle la définition d'une interface élargit l'accès (dans le cas où les sources sont définies). J'ai eu un problème que les ports étaient accessibles même si j'avais une sourcesliste blanche. La raison en était que la zone avait une interface assignée.
pinkeen
1
Pour être exactement correcte, cette réponse doit supprimer tous les services par défaut de la publiczone, le cas échéant (ces services seront disponibles pour toutes les adresses car les interfaces sont attribuées à la publiczone par défaut). Ou changez la zone par défaut en une autre: blockou drop(c'est une pratique courante). Ou changez la publiccible de zone en %%REJECT%%ou DROP.
dess
6

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é "trust", qui permet toute connexion (c'est-à-dire, 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:

  • Si l'IP source correspond à une IP source liée à une zone, elle l'utilise.
  • Si l'IP source ne correspond à aucune zone particulière, il vérifie s'il y a une zone configurée pour l' interface sur laquelle le paquet est entré. S'il y en a un, il l'utilise.
  • Enfin, si rien d'autre ne correspond, il utilise la zone par défaut.

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).

Jemenake
la source
blockpeut également être utilisé (au lieu de drop) si vous voulez dire aux autres hôtes que vous ne leur parlez pas ....
Gert van den Berg
5

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 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
Sagaponack FX
la source
2

Vous pouvez gérer facilement par Rich Rule.

Premier pas

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 spécifique à celle ci-dessous

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

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 comme 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 de firewalld ultérieurs.

devhen
la source
1

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».

SongLiAtDuke
la source
Pour la configuration FirewallD par défaut actuelle, cela peut ne pas être suffisant. Voir mon commentaire sur la réponse de Normunds pour plus de détails.
dess
pour plusieurs IP, utilisez créer un ajout ips ipsetsimilaire firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipà l'ipset avec firewall-cmd --ipset=blacklist --add-entry=192.168.1.4ensuite vous pouvez utiliserfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye
0

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
Kirin
la source