J'ai besoin de configurer ma machine pour autoriser le trafic HTTP vers / depuis serverfault.com uniquement. Tous les autres sites Web, ports de services ne sont pas accessibles. Je suis venu avec ces règles iptables:
#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT
Ça ne marche pas très bien:
Après avoir tout laissé tomber et passer à la règle 3:
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
Je reçois cette erreur:
iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.
Pensez-vous qu'il est lié au DNS? Dois-je également le permettre? Ou devrais-je simplement mettre des adresses IP dans les règles? Pensez-vous que ce que j'essaie de faire pourrait être réalisé avec des règles plus simples? Comment?
J'apprécierais toute aide ou conseil à ce sujet. Merci beaucoup!
Réponses:
Avec les règles IPTables, l'ordre est important. Les règles sont ajoutées et appliquées dans l'ordre. De plus, lors de l'ajout manuel de règles, elles sont appliquées immédiatement. Ainsi, dans votre exemple, tous les paquets passant par les chaînes INPUT et OUTPUT commencent à être supprimés dès que la stratégie par défaut est définie. C'est aussi, incidemment, pourquoi vous avez reçu le message d'erreur que vous avez fait. Ce qui se passe est le suivant:
Bien que les options source / destination acceptent les noms d'hôte, cela est fortement déconseillé. Pour citer la page de manuel,
Slillibri a frappé le clou sur la tête dont sa réponse, vous avez manqué la règle DNS ACCEPT. Dans votre cas, cela n'aura pas d'importance, mais en général, je définirais la stratégie par défaut plus tard dans le processus. La dernière chose que vous voulez est de travailler à distance et d'autoriser SSH après avoir activé un refus par défaut.
En outre, en fonction de votre distribution, vous devriez pouvoir enregistrer vos règles de pare-feu afin qu'elles soient automatiquement appliquées au moment du démarrage.
Sachant tout cela et réorganisant votre script, voici ce que je recommanderais.
la source
iptables -P
instructions n'importe où dans votre script, car les stratégies de chaîne ne sont appliquées que lorsque les paquets "tombent" à la fin d'une chaîne. Je place habituellement les déclarations de politique (généralement desDROP
politiques) en haut de mes scripts iptables.sudo iptables -I OUTPUT 1 -o lo -j ACCEPT
. Cela ne devrait-il pas être ajouté?Ajouter
pour autoriser les recherches DNS.
la source
Ce type d'exigence peut être mieux géré avec un proxy Web et / ou un filtre. Dansgaurdian peut être configuré pour ce faire. Vous devrez utiliser des règles NAT pour forcer votre trafic à travers le filtre.
L'utilisation d'iptables pour filtrer permettra à tous les sites disponibles à partir des adresses IP pertinentes. Il s'agit normalement d'un petit sous-ensemble de l'ensemble du Web.
la source
iptables
est probablement le mauvais outil à utiliser ici, car il ne traite pas particulièrement bien les noms DNS. Un proxy Web avec des paramètres de filtre appropriés est un bien meilleur choix.J'ai bien peur que iptables ne fonctionne pas à ce niveau, il ne se soucie que de l'adresse IP, pas du nom d'hôte. Si vous souhaitez bloquer l'accès à d'autres hôtes virtuels nommés sur la même IP, vous devrez envisager de mettre des fichiers .htaccess.
la source
Vous devez configurer cela sur votre serveur Web. iptables est un filtre de paquets. Les transactions HTTP envoient le nom du site (c'est-à-dire stackoverflow) dans le cadre de la charge utile TCP (c'est-à-dire pas dans le cadre de l'en-tête TCP, ce que iptables lit facilement).
Compte tenu de cela, et du fait que les transactions HTTP vont presque certainement être réparties sur plusieurs paquets (c'est-à-dire que vous ne pouvez pas simplement faire correspondre une chaîne dans l'en-tête HTTP), cela est beaucoup mieux géré par la configuration de votre serveur Web ou par un proxy en face de celui-ci.
Il serait utile de connaître le raisonnement derrière cela, il existe quelques autres alternatives:
la source