Définir certains ports de pare-feu pour accepter uniquement les connexions réseau locales?

18

Comment configurer le pare-feu sur un système dans un LAN afin que certains ports ne soient ouverts qu'aux connexions du réseau local et non du monde extérieur?

Par exemple, j'ai une boîte exécutant Scientific Linux 6.1 (une distribution basée sur RHEL), et je veux que son serveur SSH n'accepte que les connexions de l'hôte local ou du LAN. Comment puis-je faire cela?

hpy
la source

Réponses:

24

Avec les iptables du noyau complètement vides ( iptables -F), cela fera ce que vous demandez:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Cela signifie que toutes les adresses LAN sont autorisées à parler au port TCP 22, que localhost reçoit la même considération (oui, 127. * pas seulement 127.0.0.1), et les paquets de toutes les autres adresses ne correspondant pas à ces deux premières règles sont déposés sans cérémonie dans le seau à mors . Vous pouvez utiliser REJECTau lieu de DROPsi vous souhaitez un rejet actif (TCP RST) au lieu de faire du port TCP 22 un trou noir pour les paquets.

Si votre LAN n'utilise pas le bloc 192.168.0. *, Vous devrez naturellement changer l'IP et le masque sur la première ligne pour correspondre au schéma IP de votre LAN.

Ces commandes peuvent ne pas faire ce que vous voulez si votre pare-feu a déjà des règles configurées. (Dites en iptables -Ltant que root pour le savoir.) Ce qui arrive fréquemment, c'est que l'une des règles existantes saisit les paquets que vous essayez de filtrer, de sorte que l'ajout de nouvelles règles n'a aucun effet. Bien que vous puissiez utiliser -Iau lieu de -Ala iptablescommande pour épisser de nouvelles règles au milieu d'une chaîne au lieu de les ajouter, il est généralement préférable de savoir comment les chaînes sont remplies au démarrage du système et de modifier ce processus afin que vos nouvelles règles soient toujours installées dans le bon ordre.

RHEL 7+

Sur les systèmes de type RHEL récents, la meilleure façon de le faire est d'utiliser firewall-cmdou son équivalent GUI. Cela indique au firewallddémon du système d'exploitation ce que vous voulez, c'est-à-dire ce qui remplit et manipule réellement ce que vous voyez via iptables -L.

RHEL 6 et versions antérieures

Sur les anciens systèmes de type RHEL, la façon la plus simple de modifier les chaînes de pare-feu lors de la commande est de modifier /etc/sysconfig/iptables. Les outils de pare-feu GUI et TUI du système d'exploitation sont plutôt simplistes, donc une fois que vous commencez à ajouter des règles plus complexes comme celle-ci, il est préférable de revenir à de bons vieux fichiers de configuration. Attention, une fois que vous commencez à le faire, vous risquez de perdre vos modifications si vous utilisez les outils de pare-feu du système d'exploitation pour modifier la configuration, car il peut ne pas savoir comment gérer des règles artisanales comme celles-ci.

Ajoutez quelque chose comme ça à ce fichier:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Lorsque vous l'ajoutez, c'est la partie la plus délicate. Si vous trouvez une ligne dans ce fichier qui parle --dport 22, remplacez-la simplement par les trois lignes ci-dessus. Sinon, il devrait probablement précéder la première ligne existante se terminant par -j ACCEPT. En règle générale, vous devrez vous familiariser avec le fonctionnement d' iptables , auquel point le bon point d'insertion sera évident.

Enregistrez ce fichier, puis dites service iptables restartde recharger les règles du pare-feu. Assurez-vous de le faire lorsque vous êtes connecté à la console, au cas où vous mettriez du doigt les modifications! Vous ne voulez pas vous verrouiller hors de votre machine lorsque vous êtes connecté via SSH.

La similitude avec les commandes ci-dessus n'est pas une coïncidence. La plupart de ce fichier se compose d'arguments de la iptablescommande. Les différences par rapport à ce qui précède sont que la iptablescommande est supprimée et que le INPUTnom de la chaîne devient la chaîne spéciale spécifique à RHEL RH-Firewall-1-INPUT. (Si vous souhaitez examiner le fichier plus en détail, vous verrez plus tôt dans le fichier où ils ont essentiellement renommé la INPUTchaîne. Pourquoi? Impossible de dire.)

Warren Young
la source
4

L'outil de bas niveau pour la configuration du pare-feu sous Linux est iptables . Il existe également des outils de niveau supérieur. Je ne sais pas si Scientific Linux a un outil de pare-feu recommandé.

Selon cette page Web (je n'ai pas vérifié qu'elle s'applique à la version 6.1), service iptables saveenregistrera les règles de pare-feu actuelles et ces règles enregistrées seront chargées au démarrage. Vous devez donc configurer les règles que vous souhaitez via des iptablescommandes (ou tout autre moyen), puis exécuter service iptables savepour rendre votre configuration persistante.

Le billet de blog de Scott Pack est un point de départ pour abandonner des paquets «bizarres» qui ne sont généralement pas nécessaires et qui présentent un risque élevé de faire partie d'une attaque. Au-delà de cela, vous voudrez fermer tous les ports entrants et ouvrir uniquement ceux dont vous avez besoin. Quelque chose comme ça:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
Gilles 'SO- arrête d'être méchant'
la source
1
Gilles, tu n'as pas mal lu la question un peu? Je comprends que la box Scientific Linux est l'un des ordinateurs du LAN, mais pas le pare-feu.
rozcietrzewiacz
@Gilles Oui, la box est l'un des ordinateurs du LAN.
hpy
@rozcietrzewiacz Je comprends que le pare-feu se trouve sur la même machine que le serveur. Je conviens que la question est ambiguë dans une certaine mesure, mais comme penyuan n'a mentionné que le système d'exploitation d'une machine, je suppose que tout se passe sur cette machine. Sinon, ce ne serait pas une question Unix, ce serait une question d'administration réseau non spécifiée.
Gilles 'SO- arrête d'être méchant'
1

La façon préférée de le faire est avec iptables. Il semble que cela ait été adéquatement couvert par d'autres, donc, pour être complet, je soulignerai une méthode de contrôle d'accès alternative qui est disponible pour de nombreux démons sur la plupart des distributions Linux. Cette méthode de contrôle d'accès est fournie par la libwrapbibliothèque.

Pour vérifier si votre démon préféré est pris en libwrapcharge, essayez d'exécuter ce qui suit:

ldd `which sshd` | grep libwrap

Si vous obtenez un résultat non vide, tel que

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

alors vous êtes définitivement prêt à partir.

Il est presque certain que votre sshddémon a un libwrapsupport, et il doit donc consulter les fichiers /etc/hosts.allowet /etc/hosts.denypour le contrôle d'accès. En supposant que votre réseau local LAN est 192.168.100.0/24, vous pouvez refuser l' accès à sshdtous les clients à l' exception de ceux sur l'hôte local ou sur le LAN local en mettant ce qui suit dans votre /etc/hosts.denyfichier:

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Notez que cette méthode n'ouvre ni ne ferme les ports en soi. Il indique simplement aux démons qui utilisent cette méthode de contrôle d'accès s'ils doivent accepter ou rejeter les tentatives de connexion des clients qui correspondent aux modèles donnés.

Pour plus de détails, consultez les pages de manuel, en commençant par hosts_access(5).

Steven Monday
la source
1

Si vous avez votre propre pare-feu basé sur Linux, vous feriez mieux de le configurer iptables, comme d'autres le décrivent ici. Si ce n'est pas le cas et que le pare-feu est votre routeur, la configuration par défaut empêche probablement déjà l'accès de l'extérieur, sauf si vous activez explicitement la redirection de port (comme je l'ai récemment décrit en réponse à cette question ).

Pour plus de sécurité, vous pouvez utiliser un sous-réseau distinct pour les connexions LAN. Pour ce faire, pour chaque ordinateur, ajoutez une deuxième adresse IP qui serait utilisée uniquement dans le LAN et non par le routeur. Disons que l'ensemble du LAN utilise désormais des 192.168.0.xxxadresses et que le routeur (passerelle, pare-feu) l'est 192.168.0.1. Ajoutez donc une deuxième adresse pour chaque ordinateur - par exemple:

ifconfig eth0:0 192.168.5.1/24

Ensuite, modifiez la sshdconfiguration pour utiliser uniquement cette adresse (afin qu'elle n'autorise pas les connexions à venir 192.168.0.xxx) - modifiez /etc/ssh/sshd_configet modifiez ListenAddresscelle de votre nouveau sous-réseau ( 192.168.5.1dans l'exemple ci-dessus). C'est ça! Si vous ne configurez pas la passerelle pour acheminer la communication de ce sous-réseau, elle doit être séparée de l'extérieur.

rozcietrzewiacz
la source