IPTables : J'ai merdé quelque part mais je sais pas où

Bonjour,

Après plusieurs jours de recherches, de tests en tout genre avec mon pare-feu je me résous enfin à demander de l’aide.
Je souhaite avoir un pare-feu avec iptables pour un pc de bureau. Pas de serveur ou folies de ce genre.

Ma config :
J’utilise Debian Jessie.
Voici le noyau utilisé :

uname -a Linux Calcifer 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt9-2 (2015-04-13) i686 GNU/Linux
Pour naviguer j’utilise Iceweasel.
Mon gestionnaire de connexion est NetWork Manager.
J’utilise XFCE.

Le problème :
Quand je lance le script d’installation du pare-feu je n’ai aucune erreur.
Par contre dès que je tente d’accéder au web le navigateurs charge pendant une éternité mais n’arrive à rien. Je me suis dit que cela venait de la résolution DNS donc j’ai essayé d’accéder aux sites via leur adresse IP puis, comme cela ne fonctionnait toujours pas en modifiant le fichier host. (pour le fichier host c’est ce fil qui m’a donné l’idée.
Pensant que le problème venait du navigateur j’ai essayé de faire un apt-get update qui a aussi échoué.

Voici les règles en question :

[code]
#!/bin/bash

BEGIN INIT INFO

Provides: firewall

Required-Start: $remote_fs $syslog

Required-Stop: $remote_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Démarre les règles iptables

Description: Charge la configuration du pare-feu iptables

END INIT INFO

#Un pare-feu avec iptables

#Vidange
iptables -t filter -F
iptables -t filter -X
echo Vidange de iptables [OK]

#Mise en place des policies. Toutes les connexions sont refusées.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo Mise en place des policies [OK]

#On accepte les connexion déjà établies
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
echo Ne pas casser les connexions en cours [OK]

#Acceptation de tout ce qu’il se pase sur l’interface lo
iptables -A INPUT -i lo -s 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.0/8 -j ACCEPT
echo Autorisation de lo [OK]

#On ajoute les exceptions
#DNS

Pour les DNS je filtre par IP parce que je ne veux pas utiliser ceux de mon FAI.

#DNS1
iptables -A OUTPUT -p udp -d 192.71.245.208 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.71.254.208 -j ACCEPT
#DNS2
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
echo Autorisation des DNS [OK]

#HTTP
iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT
echo Autorisation de HTTP [OK]

#HTTPS
iptables -A OUTPUT -p tcp --destination-port 443 -j ACCEPT
echo Autorisation de HTTPS [OK]

#NTP
iptables -A OUTPUT -p tcp --destination-port 123 -j ACCEPT
iptables -A OUTPUT -p udp --destination-port 123 -j ACCEPT
echo Autorisation de NTP [OK]

#IRC
iptables -A OUTPUT -p tcp --destination-port 6666 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 6667 -j ACCEPT
echo Autorisation de IRC [OK]

#Jabber/XMPP
iptables -A INPUT -p tcp --destination-port 5222 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 5222 -j ACCEPT
echo Autorisation de XMPP [OK][/code]

Voila voila, si quelqu’un pouvait me mettre sur la voie parce que je ne sais plus quoi faire. :119

[code]#!/bin/bash

BEGIN INIT INFO

Provides: firewall

Required-Start: $remote_fs $syslog

Required-Stop: $remote_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Démarre les règles iptables

Description: Charge la configuration du pare-feu iptables

END INIT INFO

#Un pare-feu avec iptables

#Vidange
iptables -t filter -F
iptables -t filter -X
echo Vidange de iptables [OK]

#Mise en place des policies. Toutes les connexions sont refusées.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo Mise en place des policies [OK]

#On accepte les connexion déjà établies
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo Ne pas casser les connexions en cours [OK]

#Acceptation de tout ce qu’il se pase sur l’interface lo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
echo Autorisation de lo [OK]

#On ajoute les exceptions
#DNS

Pour les DNS je filtre par IP parce que je ne veux pas utiliser ceux de mon FAI.

#DNS1
iptables -A OUTPUT -p udp -d 192.71.245.208 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.71.254.208 -j ACCEPT
#DNS2
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
echo Autorisation des DNS [OK]

#HTTP
iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT
echo Autorisation de HTTP [OK]

#HTTPS
iptables -A OUTPUT -p tcp --destination-port 443 -j ACCEPT
echo Autorisation de HTTPS [OK]

#NTP
iptables -A OUTPUT -p tcp --destination-port 123 -j ACCEPT
iptables -A OUTPUT -p udp --destination-port 123 -j ACCEPT
echo Autorisation de NTP [OK]

#IRC
iptables -A OUTPUT -p tcp --destination-port 6666 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 6667 -j ACCEPT
echo Autorisation de IRC [OK]

#Jabber/XMPP
iptables -A INPUT -p tcp --destination-port 5222 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 5222 -j ACCEPT
echo Autorisation de XMPP [OK]
[/code]serait déjà mieux.

[quote=“fran.b”][code]#!/bin/bash

BEGIN INIT INFO

Provides: firewall

Required-Start: $remote_fs $syslog

Required-Stop: $remote_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Démarre les règles iptables

Description: Charge la configuration du pare-feu iptables

END INIT INFO

#Un pare-feu avec iptables

#Vidange
iptables -t filter -F
iptables -t filter -X
echo Vidange de iptables [OK]

#Mise en place des policies. Toutes les connexions sont refusées.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo Mise en place des policies [OK]

#On accepte les connexion déjà établies
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo Ne pas casser les connexions en cours [OK]

#Acceptation de tout ce qu’il se pase sur l’interface lo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
echo Autorisation de lo [OK]

#On ajoute les exceptions
#DNS

Pour les DNS je filtre par IP parce que je ne veux pas utiliser ceux de mon FAI.

#DNS1
iptables -A OUTPUT -p udp -d 192.71.245.208 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.71.254.208 -j ACCEPT
#DNS2
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
echo Autorisation des DNS [OK]

#HTTP
iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT
echo Autorisation de HTTP [OK]

#HTTPS
iptables -A OUTPUT -p tcp --destination-port 443 -j ACCEPT
echo Autorisation de HTTPS [OK]

#NTP
iptables -A OUTPUT -p tcp --destination-port 123 -j ACCEPT
iptables -A OUTPUT -p udp --destination-port 123 -j ACCEPT
echo Autorisation de NTP [OK]

#IRC
iptables -A OUTPUT -p tcp --destination-port 6666 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 6667 -j ACCEPT
echo Autorisation de IRC [OK]

#Jabber/XMPP
iptables -A INPUT -p tcp --destination-port 5222 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 5222 -j ACCEPT
echo Autorisation de XMPP [OK]
[/code]serait déjà mieux.[/quote]
Pour les interdictions c’est pas ca plutot?:

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP

Quand vous “pinguez”, ça donne quoi?

Par contre ça serait bien de tester avec un DNS FAI ou OpenDNS, parce que, à part ça, je ne vois rien!

:slightly_smiling:

C’était l’oubli de

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTainsi que les

-s 127.0.0.0/8 dans le lo qui sont inutiles (j’ignore si cela gêne mais je les enlèverais). Telles que je mense que les règles que je t’ai données doivent marcher

Bien joué

Pourquoi fais-tu des règles pour les connexions sortantes? Un jour tu vas lancer un jeu ou autre qui va être bloqué et tu vas passer des heures à chercher pourquoi! Après je ne sais pas quel est ton FAI, mais les modems ont en général un mode routeur qui bloque les connexions entrantes et je trouve ça bien plus simple et suffisant, mais chacun voit midi à sa porte! :wink:

Filtrer les connexions sortantes peut éviter un keyloguer d’envoyer des données à un serveur distant sur un port qui ne serait pas autorisé dans ton jeu de règles, par exemple.

Puis ça permet de s’amuser a comprendre ce qu’il se passe vraiment dans sa machine, comment dialoguent les applications, ça peut être un challenge personnel…

“tout ce qui n’est pas explicitement autorisé est interdit” est plus sécure que “tout ce qui n’est pas explicitement interdit est autorisé”… Après faut voir si c’est vraiment utile…

C’est comme ça pourtant qu’il faut le penser … la première chose est de tout interdire et d’autoriser que ce que l’on as besoin.
Chose utile lorsque tu commence à mettre ne place quelque chose et que tu souhaite prendre ton temps pour le configurer et le sécuriser.

Lors du déploiement d’un nouveau vhost, je m’assure que tout soit okay avant de l’activer, bah … là … c’est pareil :033

Question pratique vous le monté à quel lancer le script de firewall à quel moment ? avant le montage des inetrfaces :033 ?

moi j’utilise le dispatcher de network manager. Du coup je pense qu’il doit lancer mon script juste apres qu’une des connexions indiquées dans mon script passe “up”… :confused:

Pour résoudre ce problème (du lancement de script pare-feu avant le montage des interface par network-manager) ne serait-il pas judicieux d’éditer /etc/rc2.d/ afin de mettre le numéro de start du script AVANT le network manager ou tout autre appli ayant un rapport avec le réseau ??

:108

oh si surement, mais j’aimais bien l’idée que ca soit NetworkManager qui active les regles le pare feu des qu’une interface se connecte…
Je ne me suis plus penché sur la question depuis longtemps, mais je crois que j’avais buté sur le fait que j’utilise tanto eth0, tantot wlan0 pour me connecter, et j’avais pas trouvé comment faire marcher les règles sur les 2 interfaces à la fois. tandis qu’avec le dispatcher de NetWork manager, y a 2 variables qui s’occupent de ça dans le script ($1 --> interface, et $2 --> son statut), et ça marche quelque soit l’interface que j’utilise :

Non, ce n’est pas judicieux de modifier les numéros des symlinks directement dans /etc/rd*.d.
Il est préférable de définir les dépendances correctement dans l’en-tête LSB du script avant de l’activer.

Oui, mais ce n’est pertinent que pour ajouter (et supprimer) les règles spécifiques à une interface dont on ne connaît pas le nom à l’avance. Si les règles s’appliquent indifféremment à toutes les interfaces (sauf lo), alors cela n’a pas d’intérêt. La pire des méthodes étant de recharger le script complet à chaque activation d’interface.

Bonjour,

Tout d’abord excusez mon retard pour répondre, j’étais en vacances familiales dans un village sans connexion internet.

[quote=Debianluver]Pour les interdictions c’est pas ca plutot?:

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP

[/quote]
On peut le faire comme ça mais la table filter est implicite. Donc si on ne précise une autre c’est celle par défaut.

Je ne pouvais pas pinguer. La commande tournait dans le vide.

J’ai un poste qui doit être particulièrement blindé. Le pare-feu de ma box n’est pas suffisant.

Finalement merci à fran.b, j’avais effectivement omis une ligne.
Désormais tout fonctionne. Je passe le sujet en résolu.

Bonjour,

Juste une petite remarque pour le DNS 2, tu as deux lignes identiques.
Je suppose qu’il doit en avoir une pour l’udp

[quote]#DNS2
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.121.170.170 -j ACCEPT
echo Autorisation des DNS [OK][/quote]

Dominique

Bien vu.