Digression Installation parefeu (iptables & ip6tables) "pour les nuls"

J’ai appliqué le tuto de ricardo mais comme thialme le faisait remarquer, le ping ne fonctionne pas. En effet, impossible de pinger par exemple google.fr.

J’ai adapté le script pour que le ping fonctionne:

iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -N RELATED_ICMP iptables -A RELATED_ICMP -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A RELATED_ICMP -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A RELATED_ICMP -p icmp --icmp-type parameter-problem -j ACCEPT iptables -A RELATED_ICMP -j DROP iptables -A INPUT -p icmp --fragment -j DROP iptables -A OUTPUT -p icmp --fragment -j DROP iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p icmp -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p icmp -m state --state RELATED -j RELATED_ICMP iptables -A OUTPUT -p icmp -m state --state RELATED -j RELATED_ICMP iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p -icmp -j DROP iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT #(ftp) iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #(ftp) iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #(ssh) iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #(web) iptables -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT #(imprimante)
Je me suis fortement inspiré de ce firewall pour paranoïaque:
http://www.hermann-uwe.de/files/fw_laptop

Une doc qui décrit le filtrage de paquet icmp:
http://www.daemon.be/maarten/icmpfilter.html

Qu’est ce que vous en pensez ?

Pas d’avis ?

Ben, si je comprends bien, j’obtiens le m^ rslt que toi en supprimant tt simplement la ligne :
iptables -A INPUT -p icmp -j DROP
puisqu’elle fait dble emploi avec
iptables -t filter -p INPUT DROP
mais j’ai tjrs pu obtenir :

[code]ricardo@sid-hda8:~$ ping 217.12.6.29
PING 217.12.6.29 (217.12.6.29) 56(84) bytes of data.
64 bytes from 217.12.6.29: icmp_seq=1 ttl=248 time=66.0 ms
64 bytes from 217.12.6.29: icmp_seq=2 ttl=248 time=67.5 ms
64 bytes from 217.12.6.29: icmp_seq=3 ttl=248 time=64.5 ms
64 bytes from 217.12.6.29: icmp_seq=4 ttl=248 time=67.0 ms
64 bytes from 217.12.6.29: icmp_seq=5 ttl=248 time=67.9 ms

— 217.12.6.29 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 64.500/66.605/67.965/1.243 ms
ricardo@sid-hda8:~$[/code]

[quote=“ricardo”]Ben, si je comprends bien, j’obtiens le m^ rslt que toi en supprimant tt simplement la ligne :
iptables -A INPUT -p icmp -j DROP
[/quote]
Le problème c’est que tu autorises tout le trafic icmp en enlevant cette ligne.

Il y a plusieurs choses à revoir :p!

Mais si tu ne veux qu’autoriser le ping je pencherais plutôt pour quelque chose comme cela :

# Politique par défaut
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# Chaîne utilisateur en sortie
iptables -N wan_out_new
iptables -A OUTPUT -m conntrack --ctstate NEW -j wan_out_new

# Chaîne utilisateur en entrée
iptables -N wan_in_established
iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j wan_in_established

# Autorisation du ping vers l'extérieur et de sa réponse vers l'intérieur
iptables -A wan_out_new -p icmp --icmp-type echo-request -j ACCEPT
iptables -A wan_in_established -p icmp --icmp-type echo-reply -j ACCEPT

Soit en sortie un paquet d’état NEW pour le echo-request et dans l’état ESTABLISHED pour sa réponse echo-reply.

Ces règles peuvent être plus amplement modifiées mais cela reste un exemple simple et incomplet utilisant les chaînes utilisateurs (à ne pas copier/coller tout seul)

J’espère que je n’ai pas fait de fautes …

[quote=“dimm”][quote=“ricardo”]Ben, si je comprends bien, j’obtiens le m^ rslt que toi en supprimant tt simplement la ligne :
iptables -A INPUT -p icmp -j DROP
[/quote]
Le problème c’est que tu autorises tout le trafic icmp en enlevant cette ligne.[/quote]
Non, j’enlève ça :
iptables -A INPUT -p icmp -j DROP
mais au début, j’ai ça
iptables -t filter -p INPUT DROP
qui filtre ts les INPUT
C’est pour ça qu’on m’avait dit (fran.b ?, je ne me souviens plus qui) qu’il y avait double effet.

[quote=“thialme”]

Politique par défaut

iptables -P INPUT DROP
iptables -P OUTPUT DROP[/quote]
Est-ce bien utile de supprimer ce qui sort de ton clavier ?
à moins que tu aies des doutes sur toi-m^ ? :smt002

[quote=“ricardo”][quote=“thialme”]

Politique par défaut

iptables -P INPUT DROP
iptables -P OUTPUT DROP[/quote]
Est-ce bien utile de supprimer ce qui sort de ton clavier ?
à moins que tu aies des doutes sur toi-m^ ? :smt002[/quote]Je suis personnellement assez d’accord que c’est superflu, mais ça peut servir si tu veux bloquer ce qu’envoie une machine compromise.

Moi, Monsieur, ma machine, elle n’est pas compromise, elle est honnête, elle. :laughing:

D’ailleurs, j’ai fais une faute de genre à con promis (=chose dûe).

Il faut analyser un peu.
En supposant que mon serveur puisse effectuer des connexions FTP vers l’extérieur, et qu’il soit compromis. Si ensuite une attaque brute-force par exemple est lancée depuis le serveur sur un service FTP extérieur, ce n’est pas une règle standard (iptables -P OUTPUT DROP) qui va empêcher quoi que ce soit.
Par contre, cela empêchera sûrement les connexions sur des ports non privilégiés

Pour ma part, j’autorise seulement le traffic que je considère légitime, d’où la politique par défaut en DROP pour la chaîne OUTPUT. Le point de vue est “Pourquoi autoriser un traffic non voulu ?” que l’on peut bien évidemment retourner dans l’autre sens : “Pourquoi rejeter le traffic sortant d’une machine de confiance ?”. Moi je suis dans le camp je ne fais pas confiance :p!

parano :smiling_imp:

En ce qui me concerne, je suis plutôt du type «Je fais confiance mais je surveille…», ça m’a permis de déterrer quelques malins qui faisaient du P2P et surtout d’isoler des machines W vérolées et avertissant les utilisateurs.

Pour la surveillance active je ne suis pas au point pour l’instant, mais j’espère bien me faire quelque chose aux petits oignons. J’ai quelques idées mais pas le temps pour les étudier. J’ai l’intention de décharger mon script firewall des correspondances recent pour laisser le soin a un programme tiers de scruter les connexions et de charger dynamiquement les règles dans les chaînes utilisateur, puis de grapher tout cela afin de pouvoir analyser le traffic.

Actuellement je me fais avoir contre les attaques force-brute sur mon serveur ftp. J’utilise le protocole SSL, et pas l’attaquant. Normalement seules 9 tentatives sont autorisées avant bannissement (3 tentatives * 3 nouvelles connexions). Le problème est que l’attaquant se voit répondre à chaque demande d’authentification, “Utiliser SSL pour vos authentifier”, et de ce fait la connexion courante n’est jamais terminée.

Je me demandais à qui devais être dédiée la tâche d’interdire le traffic, mais après réflexion ce n’est pas celle du serveur FTP, et pour le script firewall ce n’est pas son travail non plus. Le programme tiers devrait être plus intelligent (et permettre d’éviter certains dénis de services, j’espère) Plein de choses à creuser en tout cas :p!

Bonjour et merci pour ce tuto,
Je voulais savoir comment désactiver temporairement toutes les règles.
Parce que actuellement je suis obligé de faire clean et ensuite de retaper toutes les règles ce qui n’est pas très pratique…

OK. Je viens de relire le script. Aprés avoir fait un clean, juste, tu ne fais surtout pas de stop (ça sauve le parefeu comme il est à ce moment là, càd vierge), tu fais juste un start, pour revenir à l’état qui existe dans /etc/config_parefeu. Tu peux d’ailleurs modifier ce fichier directement pour faire tes modifs, et les appliquer en faisant juste un start.

ok merci pour les infos, j’ai essayé avec clean suivi de start est c’est bon sa marche. Merci encore.

La question était judicieuse et je vais ajouter la réponse de Matt au premier fil.
@ Matt :
dis-moi si j’ai bien compris le processus que tu indiques :

Si vous voulez désactiver temporairement toutes les règles, vous tapez : /etc/init.d/mon_parefeu clean en prenant garde de ne pas pérenniser cet état, càd de ne pas rebouter ou de ne pas ajouter la commande '/etc/init.d/mon_parefeu stop' Pour revenir à l'état antérieur, il vous suffit de taper : /etc/init.d/mon_parefeu start

Au vu de la dangereusité de la chose je propose une nouvelle version (si ça se trouve c’est pourri mais ça a le mérite de ne pas poser de problème de stop juste après un clean).

[code]#!/bin/sh

chargement/déchargement d’iptables

IPTABLES=’/sbin /iptables’
config=’/etc /config_parefeu’

case “$1” in
’start’)

si clean est passé par là

if [ -f ${config}.old ]; then
mv ${config}.old $config
fi
if [ -f $config ]; then
/sbin/iptables-restore < $config
fi

RETVAL=$?
;;
‘stop’)

si clean n’est pas passé par là (ou a était anéanti par un start)

if [ ! -f ${config}.old ]; then
/sbin/iptables-save > $config
fi

RETVAL=$?
;;
‘clean’)

clean le parefeu pendant que la machine tourne

ça peut être une faille de sécurite si on l’exécute lors de l’extinction avant l’arrêt des interfaces

pensez à refaire un start après sinon la sauvegarde se fera automatiquement à l’extinction

marque son passage

if [ -f $config ]; then
mv $config ${config}.old
fi

$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
RETVAL=$?
;;
‘restart’)
$0 stop && $0 start
RETVAL=$?
;;
*)
echo "Usage: $0 { start | stop | restart | clean }"
RETVAL=1
;;
esac
exit $RETVAL[/code]
L’idée c’est que le clean va déplacer la config vers un *.old. Si ce *.old existe ça veut dire que le dernier appel était un clean. Si start est appellé après un clean il voit le *.old et le remet à sa place.

Mes modifications sont bidon ? (alors ça m’arrangerais de le savoir pour l’avenir et je mettrais mon message à jour pour dire de ne pas l’utiliser)
Elle est bonne ? (alors peut être le mettre au début)