web-dev-qa-db-fra.com

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

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

Cela ne fonctionne 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!

20
Zenet

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 à activer 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
30
Scott Pack

Ajouter

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

pour autoriser les recherches DNS.

7
slillibri

Ce type d'exigence peut être mieux géré avec un proxy et/ou un filtre Web. Dansgaurdian peut être configuré pour cela. Vous devrez utiliser les 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.

5
BillThor

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.

2
Niall Donegan

Vous devez configurer cela sur votre serveur Web. iptables est un filtre de paquets. Les transactions HTTP envoient le nom du site (ie stackoverflow) dans le cadre de la charge utile TCP (c'est-à-dire pas dans l'en-tête TCP en-tête, 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.
1
Philip Reynolds