bloquer tout sauf quelques ips avec firewalld

17

Sur une machine en réseau Linux, je voudrais restreindre l'ensemble des adresses de la zone "publique" (concept firewalld), qui sont autorisées à y accéder. Ainsi, le résultat final serait qu'aucune autre machine ne peut accéder à aucun port ou protocole, à l'exception de ceux explicitement autorisés, une sorte de mélange de

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.120" drop'

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.105" drop'

Le problème ci-dessus est que ce n'est pas une vraie liste, il bloquera tout car si sa seule adresse est bloquée en n'étant pas la même que l'autre, générant un effet accidentel de "drop all", comment pourrais-je "débloquer" un non spécifique ensemble contigu? la source accepte-t-elle une liste d'adresses? je n'ai rien vu dans mon regard sur les documents ou le résultat google jusqu'à présent.


EDIT: Je viens de créer ceci:

# firewall-cmd  --zone=encrypt --list-all
encrypt (active)
  interfaces: eth1
  sources: 192.168.56.120
  services: ssh
  ports: 6000/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

Mais je peux toujours atteindre le port 6000 de .123 mon intention était que si une source n'est pas répertoriée, elle ne devrait pouvoir accéder à aucun service ou port

Mike
la source

Réponses:

24

Les règles riches ne sont pas du tout nécessaires.

Si vous souhaitez restreindre une zone à un ensemble spécifique d'adresses IP, définissez simplement ces adresses IP comme sources pour la zone elle-même (et supprimez toute définition d'interface qui peut être présente, car elles remplacent les adresses IP source).

Vous ne voulez probablement pas faire cela dans la zone "publique", car cela est sémantiquement destiné à ce que les services publics soient ouverts sur le monde.

Au lieu de cela, essayez d'utiliser une zone différente telle que "interne" pour la plupart des adresses IP de confiance pour accéder à des services potentiellement sensibles tels que sshd. (Vous pouvez également créer vos propres zones.)

Attention: ne confondez pas la zone spéciale "de confiance" avec la zone "interne" normale. Toutes les sources ajoutées à la zone "de confiance" seront autorisées sur tous les ports; l'ajout de services à la zone "de confiance" est autorisé mais cela n'a aucun sens de le faire.

firewall-cmd --zone=internal --add-service=ssh
firewall-cmd --zone=internal --add-source=192.168.56.105/32
firewall-cmd --zone=internal --add-source=192.168.56.120/32
firewall-cmd --zone=public --remove-service=ssh

Il en résultera une zone "interne" qui permettra d'accéder à ssh, mais uniquement à partir des deux adresses IP données. Pour le rendre persistant, réexécutez chaque commande avec en --permanentannexe.

Michael Hampton
la source
veuillez clarifier ce que vous entendez par "définition d'interface qui peut être présente", iv a essayé votre suggestion, veuillez voir ma modification.
mike
@mike Comme je l'ai dit, vous devez vous retirer eth1de la zone. firewall-cmd --zone=encrypt --remove-interface=eth1
Michael Hampton
Eh bien, la zone de chiffrement est la nouvelle zone, avant que eth1 ne soit en public, je l'ai déplacé du public pour chiffrer, donc chiffrer a la source .120, je pensais que seulement 120 devraient pouvoir atteindre le port, qu'est-ce que je manque?
mike
1
Si vous placez l'interface dans la zone, tout ce qui arrive via l'interface peut accéder aux ports et services ajoutés à la zone, quelle que soit l'adresse IP. Donc, il appartient probablement au public, où il était à l'origine.
Michael Hampton
ahh, donc les sources acceptées seront toujours autorisées même si l'interface est placée en public, et les sources acceptées sont placées dans une source de confiance différente?
mike
1

Selon firewalld.richlanguage:

Source source [not] address = "address [/ mask]"

   With the source address the origin of a connection attempt can be limited to the source address. An address is either a single IP address, or a network IP address. The address has to match the rule family (IPv4/IPv6). Subnet mask is expressed in either
   dot-decimal (/x.x.x.x) or prefix (/x) notations for IPv4, and in prefix notation (/x) for IPv6 network addresses. It is possible to invert the sense of an address by adding not before address. All but the specified address will match then.

Spécifiez un masque de réseau pour l'adresse afin d'autoriser les blocs contigus.

En dehors de cela, vous pouvez essayer de créer un ipsetpour une liste non contiguë d'adresses IP autorisées.

Par exemple, dans /etc/firewalld/direct.xml:

<?xml version="1.0" encoding="utf-8"?>
<direct>
   <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-m set --match-set whitelist src -j ACCEPT</rule>
</direct>

L'actuel ipsetdoit être créé séparément.

dawud
la source
cela rejetterait, ce dont j'ai besoin est l'inverse, accepter si dans l'ensemble,
mike
0

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