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

Question de base sur le pare-feu:

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

Par exemple, j'ai une boîte Linux Scientific 6.1 (une dissortingbution basée RHEL), et je veux que son server SSH accepte uniquement les connections de localhost ou LAN?

Merci.

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

 # 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 dit que toutes les adresses LAN sont autorisées à parler au port TCP 22, que localhost obtient la même considération (oui, 127. * pas seulement 127.0.0.1), et les packages de toutes les autres adresses ne correspondant pas à ces deux premières règles sont abandonnés sans cérémonie le seau de bits . Vous pouvez utiliser REJECT au lieu de DROP si vous voulez un rejet actif (TCP RST) au lieu de faire du port TCP 22 un trou noir pour les packages.

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

Ces commands peuvent ne pas faire ce que vous voulez si votre pare-feu a déjà certaines règles configurées. (Dites iptables -L tant que root pour savoir). Ce qui arrive souvent, c'est qu'une des règles existantes attrape les packages que vous essayez de filterr, de sorte que l'ajout de nouvelles règles n'a aucun effet. Bien que vous puissiez utiliser -I au lieu de -A avec la command iptables pour épisser de nouvelles règles au milieu d'une string au lieu de les append, il est généralement préférable de savoir comment les strings sont alimentées au démarrage du système et de modifier ce process pour que votre nouvelle les règles sont toujours installées dans le bon ordre.

RHEL 7+

Sur les systèmes de type RHEL récents, la meilleure façon d'y parvenir est d'utiliser firewall-cmd ou son équivalent graphique. Cela indique au démon firewalld l'OS ce que vous voulez, qui est ce qui remplit et manipule ce que vous voyez via iptables -L .

RHEL 6 et plus tôt

Sur les anciens systèmes de type RHEL, la manière la plus simple de modifier les strings de pare-feu lors de la command est de modifier /etc/sysconfig/iptables . Les outils de pare-feu GUI et TUI du operating system sont plutôt simplists. Dès que vous commencez à append des règles plus complexes, il est préférable de revenir à de bons anciens files de configuration. Attention, une fois que vous commencez à faire cela, vous risquez de perdre vos modifications si vous utilisez les outils de pare-feu du operating system pour modifier la configuration, car il peut ne pas savoir comment gérer les règles artisanales comme celles-ci.

Ajoutez quelque chose comme ceci à ce file:

 -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 

Où vous l'ajoutez, c'est un peu difficile. Si vous trouvez une ligne dans ce file qui parle de --dport 22 , il suffit de la replace par les trois lignes ci-dessus. Sinon, il devrait probablement aller avant que la première ligne existante se termine par -j ACCEPT . En règle générale, vous devrez acquérir une certaine familiarité avec la façon dont iptables fonctionne, à quel point le point d'insertion correct sera évident.

Sauvegardez ce file, puis dites service iptables restart pour recharger les règles du pare-feu. Assurez-vous de le faire en étant connecté à la console, au cas où vous modifieriez les modifications! Vous ne voulez pas vous verrouiller hors de votre machine lorsque vous êtes connecté sur SSH.

La similitude avec les commands ci-dessus n'est pas une coïncidence. La plupart de ce file se compose d'arguments à la command iptables . Les différences par rapport à ce qui précède sont que la command iptables est supprimée et que le nom de la string INPUT devient la string RH-Firewall-1-INPUT spécifique RHEL spécifique. (Si vous souhaitez examiner le file plus en détail, vous verrez plus tôt dans le file où ils ont essentiellement renommé la string INPUT .

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

Selon cette page web (je n'ai pas vérifié qu'elle s'applique à 6.1), le service iptables save sauvegardera les règles de pare-feu actuelles, et ces règles sauvegardées sont chargées au démarrage. Vous devez donc définir les règles que vous voulez à travers les commands iptables (ou tout autre moyen), puis exécuter le service iptables save pour que votre configuration soit persistante.

Le post de blog de Scott Pack est un début pour laisser tomber les packages «excensortingques» qui ne sont pas nécessaires et qui ont un risque élevé de faire partie d'une attaque. Au-delà de cela, vous aurez envie de fermer tous les ports entrants et d'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, eg 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 

La façon préférée de le faire est avec iptables . Il semble que cela a été suffisamment couvert par les autres, donc, pour être complet, je vais vous indiquer une méthode alternative de contrôle d'access disponible pour de nombreux démons sur la plupart des dissortingbutions Linux. Cette méthode de contrôle d'access est fournie par la bibliothèque libwrap .

Pour vérifier si votre démon favori a le support de libwrap , essayez d'exécuter ce qui suit:

 ldd `which sshd` | grep libwrap 

Si vous obtenez un résultat non vide, comme

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

alors vous êtes définitivement bon à faire.

Il est presque certain que votre démon sshd a la prise en charge de libwrap . Il doit donc consulter les /etc/hosts.allow et /etc/hosts.deny pour le contrôle d'access. En supposant que votre réseau LAN local est 192.168.100.0/24 , vous pouvez refuser l' access à sshd à tous les clients sauf ceux de l'hôte local ou du LAN local en insérant ce qui suit dans votre file /etc/hosts.deny :

 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 pas ou ne ferme pas les ports en tant que tels. Il indique simplement aux démons qui utilisent cette méthode de contrôle d'access s'ils doivent accepter ou rejeter les tentatives de connection des clients qui correspondent aux templates donnés.

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

Si vous disposez de votre propre pare-feu basé sur Linux, vous devez 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 l'access depuis l'extérieur, sauf si vous activez explicitement le transfert de port (comme je l'ai récemment décrit en réponse à cette question ).

Pour plus de security ci-dessus, vous pouvez utiliser un sous-réseau distinct pour les connections LAN. Pour ce faire, pour chaque ordinateur, ajoutez une seconde adresse IP qui serait utilisée uniquement dans le réseau local et non par le routeur. Disons que le LAN entier utilise maintenant les adresses 192.168.0.xxx et que le routeur (passerelle, pare-feu) 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, éditez la configuration de sshd pour n'utiliser que cette adresse (afin qu'elle n'autorise pas les connections venant sur 192.168.0.xxx ) – éditez /etc/ssh/sshd_config et modifiez ListenAddress à celui de votre nouveau sous-réseau ( 192.168.5.1 dans le exemple ci-dessus). C'est tout! Si vous ne configurez pas la passerelle pour apather la communication de ce sous-réseau, elle doit être séparée de l'extérieur.