règles iptables pour autoriser le trafic HTTP vers un seul domaine

20

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!

Zenet
la source
2
N'oubliez pas sstatic.net et autres. serverfault.com ne vient pas entièrement de serverfault.com
Zoredache
Pouvez-vous exécuter un proxy sur un autre système? C'est la solution la meilleure / la plus simple: serverfault.com/questions/215134
mattdm

Réponses:

29

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:

  1. La stratégie DROP par défaut est appliquée
  2. IPTables reçoit un nom d'hôte comme destination
  3. IPTables tente une recherche DNS sur 'serverfault.com'
  4. La recherche DNS est bloquée par l'action DROP

Bien que les options source / destination acceptent les noms d'hôte, cela est fortement déconseillé. Pour citer la page de manuel,

Les noms d'hôtes ne seront résolus qu'une seule fois, avant que la règle ne soit soumise au noyau. Veuillez noter que spécifier un nom à résoudre avec une requête distante telle que DNS est une très mauvaise idée.

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.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# 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

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Scott Pack
la source
3
Belle réponse bien conçue.
JakeRobinson
1
Je l'apprécie, même si vous avez également dû manquer mon erreur. Oups.
Scott Pack
3
En fait, vous pouvez placer vos iptables -Pinstructions 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 des DROPpolitiques) en haut de mes scripts iptables.
Steven lundi
1
@Steven: Vous avez absolument raison. L'OP semble les saisir de manière interactive. Imaginons que vous êtes connecté à votre hôte via SSH et que votre première règle concerne la politique DROP. Votre connexion SSH sera abandonnée avant que vous puissiez saisir d'autres règles. C'est le même problème de timing, si une manifestation différente, qu'elle a rencontré.
Scott Pack
Merci. J'essayais ça. Mais n'a pas fonctionné sans ajouter sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Cela ne devrait-il pas être ajouté?
Kiran
7

Ajouter

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

pour autoriser les recherches DNS.

slillibri
la source
5

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.

BillThor
la source
1
Tout à fait d'accord avec cela. iptablesest 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.
Steven lundi
2

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.

Niall Donegan
la source
Le truc c'est que quand j'essaye la règle 3 sans "tout laisser tomber" ça marche très bien avec iptables!
Zenet
2
hmm, j'ai mal lu la question. À droite, ce qui se passe en arrière-plan est que iptables résoudra serverfault.com en 64.34.119.12 (voir la réponse de slillibri pour comprendre pourquoi la résolution ne fonctionnait pas). Cependant, comme iptables ne comprend pas les noms d'hôte et autorise simplement l'ip, vous pourrez vous connecter à n'importe quel site Web sur cette ip, s'il a plusieurs sites.
Niall Donegan
2
@Emily, cela peut fonctionner correctement, dans la mesure où la règle est ajoutée, mais si l'IP serverfault.com change, le trafic ne sera pas autorisé. Autoriser un site comme google.com qui a des centaines d'adresses qui changent fréquemment ne fonctionnerait pas du tout.
Zoredache
1

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:

  1. Redirigez vers l'URL correcte s'ils saisissent la mauvaise URL (par exemple redirigez vers stackoverflow.com s'ils entrent sur www.stackoverflow.com)
  2. Dites à votre serveur Web de ne pas héberger d'autres hôtes que stackoverflow.com
  3. Mettez le site sur une IP distincte que rien d'autre ne résout et demandez à votre serveur Web de l'écouter.
Philip Reynolds
la source
Salut Phil, je ne suis pas sûr de comprendre quel serveur Web? Je n'ai pas de serveur web. Je fais cette configuration sur mon ordinateur.
Zenet