Confirmation script & règles IPTables

Bonjour,
J’aurais besoin de vos expertise concernant les script IPTables que je compte mettre en place sur mon serveur perso. Il s’agit d’un Guruplug en stable avec quelques service (FTP, IMAP, POP, SMTP, HTTP, UPS & SSH)

Pour le script de lancement au démarrage je me suis inspiré par le poste qui se trouve das T&A

[code]#! /bin/sh

BEGIN INIT INFO

Provides: iptables

Required-Start: $remote_fs $syslog

Required-Stop: $remote_fs $syslog

X-Start-Before: $network

X-Stop-After: $network

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: IPTables

Description: FireWall / PareFeu. Chargement/Déchargement des règles d’iptables

END INIT INFO

Do NOT “set -e”

PATH should only include /usr/* if it runs after the mountnfs.sh script

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC=“IPTables rules”
NAME=iptables
DAEMON=/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
SAVEFILE=/etc/save-$NAME
RULES_FILE=/etc/default/rules-$NAME

Exit if the package is not installed

[ -x “$DAEMON” ] || exit 0

Read configuration variable file if it is present

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

Load the VERBOSE setting and other rcS variables

. /lib/init/vars.sh

Define LSB log_* functions.

Depend on lsb-base (>= 3.2-14) to ensure that this file is present

and status_of_proc is working.

. /lib/lsb/init-functions

Function that starts the daemon/service

do_start()
{
# Vérification de l’existance d’une sauvegarde
if [ -r $SAVEFILE ] ; then
$DAEMON-restore < $SAVEFILE
RETVAL=$?
else # Sinon lecture des règles par défaut
if [ -r $RULESFILE ] ; then
. /etc/default/$RULESFILE
RETVAL=$?
else # Sinon retour en erreur
RETVAL=1
fi
fi
return “$RETVAL”
}

Sauvegarde des règles en vue de l’extinction

do_stop()
{
$DAEMON-save > $SAVEFILE
RETVAL=$?
return “$RETVAL”
}

Nettoyage de toutes les règles

do_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
$DAEMON -t filter -F
$DAEMON -t nat -F
$DAEMON -t mangle -F
$DAEMON -t raw -F
$DAEMON -t filter -P INPUT ACCEPT
$DAEMON -t filter -P OUTPUT ACCEPT
$DAEMON -t filter -P FORWARD ACCEPT
$DAEMON -t nat -P PREROUTING ACCEPT
$DAEMON -t nat -P POSTROUTING ACCEPT
$DAEMON -t nat -P OUTPUT ACCEPT
$DAEMON -t mangle -P PREROUTING ACCEPT
$DAEMON -t mangle -P OUTPUT ACCEPT
$DAEMON -t mangle -P POSTROUTING ACCEPT
$DAEMON -t mangle -P FORWARD ACCEPT
$DAEMON -t mangle -P INPUT ACCEPT
$DAEMON -t raw -P OUTPUT ACCEPT
$DAEMON -t raw -P PREROUTING ACCEPT
RETVAL=$?
return “$RETVAL”
}

case “$1” in
start)
[ “$VERBOSE” != no ] && log_daemon_msg “Starting $DESC” “$NAME”
do_start
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ “$VERBOSE” != no ] && log_daemon_msg “Stopping $DESC” “$NAME”
do_stop
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
restart)
log_daemon_msg “Restarting $DESC” “$NAME”
do_stop
case “$?” in
0|1)
do_start
case “$?” in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo “Usage: $SCRIPTNAME {start|stop|restart}” >&2
exit 3
;;
esac

:[/code]

Ensuite pour les règles j’ai aussi récupérer celle de ce poste

[code]# Règles de base ##############################################################

Interdire tout

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

Authorisation global#########################################################

Conserver les connections

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Autoriser loopback

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

ping

iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

Authorisation au cas par cas

FTP

iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT

iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT

SSH

iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

SMTP

#iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT

#DNS
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

HTTP

iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

POP3

iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT

NTP

iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

IMAP

iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT

HTTPS

iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

Samba

#iptables -t filter -A OUTPUT -p tcp --dport 445 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 445 -j ACCEPT

SMTP SSL (SMTPS)

iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT

SMTP (avec authentification)

iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT

FTP SSL implicite (FTPS)

#iptables -t filter -A OUTPUT -p tcp --dport 989 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 989 -j ACCEPT

#iptables -t filter -A OUTPUT -p udp --dport 989 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 989 -j ACCEPT

#iptables -t filter -A OUTPUT -p tcp --dport 990 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 990 -j ACCEPT

#iptables -t filter -A OUTPUT -p udp --dport 990 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 990 -j ACCEPT

IMAP SSL (IMAPS)

iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT

POP3 SSL (PO3S)

iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT

FTP passif

iptables -t filter -A OUTPUT -p tcp --sport 3000:3100 -j ACCEPT

UPS

iptables -t filter -A OUTPUT -p tcp --dport 3493 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 3493 -j ACCEPT

Bittorent

iptables -t filter -A OUTPUT -p tcp --sport 6880:6999 -j ACCEPT

Règles particulière avec OpenDPI

iptables -t nat -A PREROUTING -m opendpi -ssh -p tcp –dport 443 -j DNAT –to-dest :22 [/code]

La dernière règle utilise OpenDPI qui devrais me permettre de me passer de SSLH. Le but étant de rediriger les connections SSH en 443 vers le port 22.

Voilà, toutes les remarques sont les bienvenus :mrgreen:

Mes commentaires concernant le script d’init :

  1. Le pare-feu devrait être démarré en runlevel S, comme le réseau.
  2. $RULES_FILE contient déjà le chemin /etc/default/, mais quand le script le “source” dans la fonction do_start(), il ajoute encore /etc/default/.
  3. Visiblement, les fichiers présents dans /etc/default ne contiennent que des définitions de variables, pas des commandes. Je ne pense pas que ce soit l’emplacement approprié pour un script de création de règles iptables.
  4. La fonction do_clean() n’est jamais appelée.
  5. D’autre part elle a pour effet de charger les tables qui n’étaient pas chargées auparavant, ce qui est inutile. Il serait plus rationnel de vérifier si une table est chargée (présente dans /proc/net/ip_tables_names) avant de la réinitialiser.
  6. Aussi elle ne supprime pas les éventuelles chaînes utilisateur (iptables -X).

Mes commentaires concernant les règles iptables :
7) Ping : Le ping (echo) n’est qu’un type ICMP parmi d’autres (–icmp-type echo)
8) FTP : les règles sur le port 20 sont inutiles. En revanche il faut charger le module de suivi de connexion pour FTP, nf_conntrack_ftp, afin de marquer comme RELATED le premier paquet d’une connexion de données en mode passif ou actif.
9) FTP, SSH, HTTP… : la machine est à la fois client et serveur ?
10) FTP passif : avec le module de suivi FTP, cette règle n’est utile que pour le FTP chiffré, et n’est efficace qu’en tant que serveur, pas en tant que client.
11) opendpi : connais pas, comment ça marche ? Si ça fait de l’analyse du contenu des paquets pour découvrir le protocole, alors ça ne marchera pas : les règles de la table nat ne peuvent s’appliquer qu’au premier paquet d’une connexion, or celui-ci ne contient pas de données. Lorsque le premier paquet contenant des données est transmis, il est trop tard, le mapping de NAT est déjà déterminé. D’autre part dans le protocole SSH, c’est le serveur qui envoie sa bannière en premier, le client se connecte et l’attend. Mais pour que le serveur SSH envoie la bannière, il faut qu’il reçoive la connexion et donc que la redirection soit déjà en place, donc que le protocole ait déjà pu être analysé, donc que le serveur ait déjà envoyé la bannière… (boucle infinie).

Il y avait 1 personne qui m’importait de voir poser une commentaire sur ce sujet et elle l’a fait :041

Je vais prendre en compte toutes tes remarques et remettrais les scripts corrigés. Merci bien :023

Pour info OpenDPI est similaire à Layer7, mais est fait en C au lieu de regex. Les perfs sont censé être bien plus élevé du coup.

A mon avis, il n’est pas possible d’utiliser opendpi pour faire une redirection de port comme alternative à sslh.

Quelques questions/remarques :

iptables

1)Il me semblait que le réseau n’était pas activé en run level 1, mais j’ai vérifier sur mon serveur et effectivement dès le “S” j’ai bien “networking” & “ifupdown”

2)OK corrigé

3)# Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME
Ce code est par défaut dans le squelette ds scripts, je ne l’ai pas touché. Mais pour le fichier de règles je peut en effet le déplacer, mais où ? (APDMC :whistle: )

4)Je l’ai ajouté dans le “restart” et le “stop” (j’en ai profité pour renommer la méthode “do_stop” en “do_save”)

5)Je test dans le fichier que tu me cite si la table existe avant de faire les commandes dessus.

6)OK ajouté

Résultat (MAJ suivant la réponse en dessous):

[code]#! /bin/sh

BEGIN INIT INFO

Provides: iptables

Required-Start: $networking

Required-Stop: $local_fs

X-Start-Before: $ifupdown

X-Stop-After: $ifupdown

Default-Start: S

Default-Stop: 0 6

Short-Description: IPTables

Description: FireWall / PareFeu. Chargement/Déchargement des règles d’iptables

END INIT INFO

Do NOT “set -e”

set -x #Debug

PATH should only include /usr/* if it runs after the mountnfs.sh script

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC=“IPTables rules”
NAME=iptables
DAEMON=/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
SAVEFILE=/etc/save-$NAME
RULESFILE=/etc/default/rules-$NAME

Si le module FTP doit êter vérifé et chargé le cas échéant (Yes | NO)

FTP=“YES”

Exit if the package is not installed

[ -x “$DAEMON” ] || exit 0

Read configuration variable file if it is present

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

Load the VERBOSE setting and other rcS variables

. /lib/init/vars.sh

Define LSB log_* functions.

Depend on lsb-base (>= 3.2-14) to ensure that this file is present

and status_of_proc is working.

. /lib/lsb/init-functions

Function that starts the daemon/service

do_start()
{
# Vérification de l’existance d’une sauvegarde
if [ -r $SAVEFILE ] ; then
$DAEMON-restore < $SAVEFILE
RETVAL=$?
else # Sinon lecture des règles par défaut
if [ -r $RULESFILE ] ; then
# Vidage des tables au cas où
do_clean
# Lecture des nouvelles règles
. $RULESFILE
RETVAL=$?
else # Sinon retour en erreur
RETVAL=1
fi
fi

# Module spécial pour le FTP en mode passif et le canal de données
if [ $FTP = "YES" ] ; then
	if [  `lsmod | grep -c nf_conntrack_ftp` -lt 1 ] ; then 
		echo "Chargement du module NF_CONNTRACK_FTP"
	   	modprobe nf_conntrack_ftp
	fi
fi

return "$RETVAL"

}

Sauvegarde des règles en vue de l’extinction

do_save()
{
$DAEMON-save > $SAVEFILE
RETVAL=$?
return “$RETVAL”
}

Nettoyage de toutes les règles

do_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

# Supression des chaines utilisateur
RETVAL=0

if [ `grep 'filter' -c /proc/net/ip_tables_names` -gt 0 ] ; then
	$DAEMON -t filter -X
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t filter -F
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t filter -P INPUT ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t filter -P OUTPUT ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t filter -P FORWARD ACCEPT
fi

if [ `grep 'nat' -c /proc/net/ip_tables_names` -gt 0 ] ; then
	$DAEMON -t nat -X
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t nat -F
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t nat -P PREROUTING ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t nat -P POSTROUTING ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t nat -P OUTPUT ACCEPT
	RETVAL=`expr $? + $RETVAL`
fi

if [ `grep 'mangle' -c /proc/net/ip_tables_names` -gt 0 ] ; then
	$DAEMON -t mangle -X
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t mangle -F
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t mangle -P PREROUTING ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t mangle -P OUTPUT ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t mangle -P POSTROUTING ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t mangle -P FORWARD ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t mangle -P INPUT ACCEPT
	RETVAL=`expr $? + $RETVAL`
fi

if [ `grep 'raw' -c /proc/net/ip_tables_names` -gt 0 ] ; then
	$DAEMON -t raw -X
	$DAEMON -t raw -F
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t raw -P OUTPUT ACCEPT
	RETVAL=`expr $? + $RETVAL`
	$DAEMON -t raw -P PREROUTING ACCEPT
	RETVAL=`expr $? + $RETVAL`
fi

return "$RETVAL"

}

case “$1” in
start)
[ “$VERBOSE” != no ] && log_daemon_msg “Starting $DESC” “$NAME”
do_start
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ “$VERBOSE” != no ] && log_daemon_msg “Stopping $DESC” “$NAME”
do_save
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac

	do_clean
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		*) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
;;
restart)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_save
	case "$?" in
		0|1)
			do_start
			case "$?" in
				0) log_end_msg 0 ;;
				1) log_end_msg 1 ;; # Old process is still running
				*) log_end_msg 1 ;; # Failed to start
			esac
		;;
		*)
			# Failed to save
			log_end_msg 1
		;;
	esac
;;
clean)
	do_clean
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		*) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	# Supression du fichier de restauration
            rm $SAVEFILE
            case "$?" in
                    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                    *) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
;;
*)
	echo "Usage: $SCRIPTNAME {start|stop|restart|clean}" >&2
	exit 3
;;

esac

:[/code]

rules-iptables

7)OK fait

8)J’ai remarqué qu’il existait d’autre “nf_conntrack_”, genre nf_conntrack_ftp. N’est il pas plus adapté ?

9)Oui, le FTP me permet de faire un backup sur une autre machine, le SSH pour me connecter à mes machines du réseau local, le HTTP … quand le filtre internet au boulot est trop restrictif lynx est mon ami :mrgreen:

10)Tu parle de cette règle ?

# FTP passif iptables -t filter -A OUTPUT -p tcp --sport 3000:3100 -j ACCEPT
Où il faudrait changer OUTPUT en INPUT si j’ai bien compris ?

  1. :12 dommage, je vais faire des test mais j’ai peu d’espoirs du coup
    (MAJ suivant la réponse en dessous)

[code]#! /bin/sh

Règles de base

Interdire tout

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

Authorisation global#########################################################

Conserver les connections

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Autoriser loopback

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

ping

#réponse aux ping

iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#envoi d’un ping
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

Authorisation au cas par cas

FTP

iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT

SSH

iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

SMTP

iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT

#DNS
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

HTTP

iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

POP3

iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT

NTP

iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

IMAP

iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT

HTTPS

iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

Samba

#iptables -t filter -A OUTPUT -p tcp --dport 445 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 445 -j ACCEPT

SMTP SSL (SMTPS)

iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT

SMTP (avec authentification)

iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT

FTP SSL implicite (FTPS)

#iptables -t filter -A OUTPUT -p tcp --dport 989 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 989 -j ACCEPT

#iptables -t filter -A OUTPUT -p udp --dport 989 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 989 -j ACCEPT

#iptables -t filter -A OUTPUT -p tcp --dport 990 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 990 -j ACCEPT

#iptables -t filter -A OUTPUT -p udp --dport 990 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 990 -j ACCEPT

IMAP SSL (IMAPS)

iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT

POP3 SSL (PO3S)

iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT

FTP passif

iptables -t filter -A OUTPUT -p tcp --sport 3000:3100 -j ACCEPT

UPS

iptables -t filter -A OUTPUT -p tcp --dport 3493 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 3493 -j ACCEPT

Bittorent

iptables -t filter -A OUTPUT -p tcp --sport 6880:6999 -j ACCEPT

Règles particulière avec OpenDPI

#iptables -t nat -A PREROUTING -m opendpi -ssh -p tcp –dport 443 -j DNAT –to-dest :22[/code]

Merci bien pour toutes tes remarques :041

  1. Position de $RULES_FILES : Je dirais quelque part dans /etc.

  2. Tu pourrais aussi appeler do_clean avant de sourcer $RULES_FILE, car ce dernier ne réinitialise pas les tables.

  3. iptables -X : La suppression des chaînes utilisateur doit être faite pour chaque table, comme la suppression des règles.

  4. Suivi de connexion FTP : Coquille de ma part, c’est bien le module nf_conntrack_ftp qu’il faut charger (je corrige mon message). Il peut l’être au démarrage du système, en l’ajoutant au fichier /etc/modules. Mettre une commande modprobe dans le script $RULES_FILE a deux inconvénients :

  • le module n’est pas chargé si $SAVEFILE existe puisque dans ce cas $RULES_FILE n’est pas exécuté ;
  • potentiellement, la commande pourrait être exécutée alors que le module est déjà chargé (en cas de stop, suppression de $SAVEFILE, puis start par exemple), ce qui n’est pas dramatique mais pas très propre non plus.
  1. Règle FTP passif : j’avais mal lu la règle et je pensais que c’était INPUT et --dport. Avec OUTPUT et --sport, ça ne servait à rien car la plage de ports passifs sert pour des connexions entrantes, pas sortantes. Quant à INPUT et --sport, c’est pire que tout : ça ne sert à rien à part à n’importe qui de pouvoir se connecter depuis l’extérieur à n’importe quel port de ta machine à partir du moment où il utilise un port source compris entre 3000 et 3100. Pour du FTP non chiffré, il vaut mieux utiliser le suivi de connexion FTP.