web-dev-qa-db-fra.com

Adresses IP source de liste blanche dans CentOS 7

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.

26

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'
51
dougBTV

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

25
Normunds Kalnberzins

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:

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

6
Jemenake

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
5
Sagaponack FX

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'
2
Ranjeet Ranjan

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.

2
devhen

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

1
SongLiAtDuke

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