Je voulais juste savoir ce que vous pensiez de mes règles pour iptables.
Je ne suis pas certain que tout soit fonctionnel mais globalement ça
marche :)
##################################################
## REGLES DE LOG ##
##################################################
$IPT -N LOG_DROP
$IPT -A LOG_DROP -j LOG --log-prefix '[DROP] : ' --log-level info
$IPT -A LOG_DROP -j DROP
##################################################
## POLICES PAR DEFAULT ##
##################################################
$IPT -A INPUT -i lo -j ACCEPT # Allow traffic on
$IPT -A OUTPUT -o lo -j ACCEPT # loopback interface
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT -A INPUT -i $EXT -s 127.0.0.0/8 -j LOG_DROP # Block anything claiming to be localhost
#$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # On accepte les connexions entrantes deja etablies
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # On accepte les connexions sortantes
##################################################
## AUTORISATION POUR LE DNS ##
##################################################
for d in $IP_DNS; do
$IPT -A INPUT -i $EXT --protocol udp --source-port 53 -s $d -j ACCEPT
$IPT -A OUTPUT -o $EXT --protocol udp --destination-port 53 -d $d -j ACCEPT
$IPT -A INPUT -i $EXT --protocol tcp --source-port 53 -s $d -j ACCEPT
$IPT -A OUTPUT -o $EXT --protocol tcp --destination-port 53 -d $d -j ACCEPT
done
##################################################
## AUTORISATION POUR HTTP ##
##################################################
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
##################################################
## AUTORISATION POUR HTTPS ##
##################################################
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 443 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 443 -j ACCEPT
##################################################
## AUTORISATION POUR MSN ##
##################################################
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 6891:6900 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 6891:6900 -j ACCEPT
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 1863 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 1863 -j ACCEPT
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p udp --dport 1863 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p udp --sport 1863 -j ACCEPT
##################################################
## AUTORISATION POUR POP ##
##################################################
for d in $IP_POP; do
$IPT -A OUTPUT -o $EXT -d $d -m state --state NEW,ESTABLISHED -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -i $EXT -s $d -m state --state ESTABLISHED -p tcp --sport 110 -j ACCEPT
done
##################################################
## AUTORISATION POUR SMTP ##
##################################################
for d in $IP_SMTP; do
$IPT -A OUTPUT -o $EXT -d $d -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j ACCEPT
$IPT -A INPUT -i $EXT -s $d -m state --state ESTABLISHED -p tcp --sport 25 -j ACCEPT
done
##################################################
## AUTORISATION POUR FTP ##
##################################################
for d in $IP_FTP; do
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $EXT -d $d -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
done
##################################################
## AUTORISATION POUR IRC ##
##################################################
for d in $IRC_IRCNET; do
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -d $d -p tcp --dport 6667 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -s $d -p tcp --dport 6667 -j ACCEPT
done
for d in $IRC_IDEALIRC; do
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -d $d -p tcp --dport 6667 -j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -s $d -p tcp --dport 6667 -j ACCEPT
done
##################################################
## AUTORISATION POUR EMULE ET GNUTELLA 2 ##
##################################################
$IPT -A INPUT -p tcp --dport 4662 -j ACCEPT
$IPT -A INPUT -p udp --dport 4666 -j ACCEPT
$IPT -A INPUT -p udp --dport 6347 -j ACCEPT
$IPT -A INPUT -p tcp --dport 34037 -j ACCEPT
$IPT -A INPUT -p tcp --dport 34038 -j ACCEPT
$IPT -A INPUT -p udp --dport 4672 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 4662 -j ACCEPT
$IPT -A OUTPUT -p udp --sport 4672 -j ACCEPT
$IPT -A INPUT -p tcp --dport 6346 -j ACCEPT
$IPT -A INPUT -p udp --dport 6346 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 6346 -j ACCEPT
$IPT -A OUTPUT -p udp --sport 6346 -j ACCEPT
$IPT -A INPUT -p udp --dport 6347 -j ACCEPT
$IPT -A OUTPUT -p udp --sport 6347 -j ACCEPT
##################################################
## REGLES POUR TOUT LE RESTE ##
##################################################
$IPT -A INPUT -j LOG_DROP
$IPT -A OUTPUT -j LOG_DROP
$IPT -A FORWARD -j LOG_DROP
$IPT -A LOG_DROP -j DROP $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP
Aargh ! <couic>
TiChou
Dans le message <news:, *Non Compos Mentis* tapota sur f.c.o.l.configuration :
Meow les enfants,
Bonsoir gamin ;-)
Je voulais juste savoir ce que vous pensiez de mes règles pour iptables. Je ne suis pas certain que tout soit fonctionnel mais globalement ça marche :)
Pas comme vous le souhaitiez à priori, voir mes remarques.
Ok sauf si bien sûr les tables nat et mangle sont utilisées.
################################################## ## LES REGLES CHELOUS ##
Drôle de nom. ;)
################################################## # Drop ICMP echo-request messages sent to broadcast or multicast addresses echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
################################################## ## REGLES DE LOG ## ################################################## $IPT -N LOG_DROP $IPT -A LOG_DROP -j LOG --log-prefix '[DROP] : ' --log-level info $IPT -A LOG_DROP -j DROP
Ok mais serait plus efficace en ajoutant le matche limit afin d'éviter une inondation des logs en cas de scans ou d'attaques qui peuvent alors conduire, selon les performances de la machine, à un déni de service du à la surcharge sur gestionnaire de log.
################################################## ## POLICES PAR DEFAULT ## ################################################## $IPT -A INPUT -i lo -j ACCEPT # Allow traffic on $IPT -A OUTPUT -o lo -j ACCEPT # loopback interface $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP
Si on est puriste et dans un soucis de sécurité maximale, il est judicieux de placer les règles qui définissent les polices par défaut au tout début, avant toutes autres règles. On évite ainsi durant l'initialisation du firewall tout paquet non autorisé.
$IPT -A INPUT -i $EXT -s 127.0.0.0/8 -j LOG_DROP
Vous avez défini le paramètre de noyau /proc/.../rp_filter à 1, ce qui a pour effet de bloquer tout trafic dont l'IP source ne serait pas celle de l'interface de sortie du paquet filtré. La règle ci-dessus est donc inutile et dans le jargon informatique on dit que la règle est redondante.
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ok.
################################################## ## AUTORISATION POUR LE DNS ## ################################################## for d in $IP_DNS; do $IPT -A INPUT -i $EXT --protocol udp --source-port 53 -s $d -j ACCEPT $IPT -A OUTPUT -o $EXT --protocol udp --destination-port 53 -d $d -j ACCEPT $IPT -A INPUT -i $EXT --protocol tcp --source-port 53 -s $d -j ACCEPT $IPT -A OUTPUT -o $EXT --protocol tcp --destination-port 53 -d $d -j ACCEPT done
Ces règles sont inutiles car redondantes. En effet, vous autorisez déjà précédemment à votre machine de se connecter à l'extérieur (--state NEW sur la chaîne OUTPUT), donc entre autre à joindre les serveurs DNS de votre FAI et vous autorisez aussi à recevoir sur votre machine tout trafic donc la connexion est déjà établie et donc de recevoir entre autre les réponses des serveurs.
################################################## ## AUTORISATION POUR HTTP ## ################################################## $IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
Même remarques, règles redondantes. Les paquets à l'état NEW et ESTABLISHED sont déjà autorisés précédemment à sortir et les paquets à l'état ESTABLISHED sont eux aussi déjà autorisés à entrer.
## AUTORISATION POUR HTTPS ##
[...]
## AUTORISATION POUR MSN ##
[...]
## AUTORISATION POUR POP ##
[...]
## AUTORISATION POUR SMTP ##
Idem, redondance.
################################################## ## AUTORISATION POUR FTP ## ################################################## for d in $IP_FTP; do $IPT -A INPUT -i $EXT -s $d -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
Redondance.
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
Vous n'avez pas à vous occuper des connexions ftp-data. Il faut laisser le module ip_conntrack_ftp suivre les connexions ftp et marquer les paquets des connexions ftp-data à l'état RELATED, paquets qui seront alors autorisés comme il faut.
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o $EXT -d $d -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT done
Règles redondantes et inutiles.
## AUTORISATION POUR IRC ##
[...]
Redondance.
Une remarque supplémentaire tout de même au niveau scripting. Vos deux boucles 'for' font la même chose seul les valeurs de départ sont différentes. On peut donc faire une seule boucle for comme ceci :
for d in $IRC_IRCNET $IRC_IDEALIRC do [...] done
################################################## ## AUTORISATION POUR EMULE ET GNUTELLA 2 ## ################################################## $IPT -A INPUT -p tcp --dport 4662 -j ACCEPT $IPT -A INPUT -p udp --dport 4666 -j ACCEPT $IPT -A INPUT -p udp --dport 6347 -j ACCEPT $IPT -A INPUT -p tcp --dport 34037 -j ACCEPT $IPT -A INPUT -p tcp --dport 34038 -j ACCEPT $IPT -A INPUT -p udp --dport 4672 -j ACCEPT
Sont déjà autorisés précédemment les paquets à l'état ESTABLISHED et donc ici vous autorisez les paquets NEW, RELATED mais aussi INVALID. Il serait donc préférable d'introduire le matche state dans vos règles, comme vous le faisiez plus ou moins dans vos précédentes règles :
$IPT -A INPUT -p tcp --dport 4662 -m state --state NEW -j ACCEPT etc.
$IPT -A OUTPUT -p tcp --sport 4662 -j ACCEPT [...]
Redondance.
A ce stade du firewall, une petite conclusion. On constate que la grande majorité de vos règles sont inutiles et ne valideront *jamais* le moindre paquet. Mais j'imagine que ce que vous souhaitiez faire au départ, est de ne rien autoriser en entrée mais aussi en sortie, et de n'autoriser alors en sortie que les services que vous souhaitiez utiliser. Dans ce cas, il aurait fallu faire ainsi :
La règle suivante :
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
doit être modifiée ainsi :
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
et par exemple dans le cas de l'autorisation du trafic http, vos règles :
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
se limiteraient à l'unique règle suivante :
$IPT -A OUTPUT -o $EXT -m state --state NEW -p tcp --dport 80 -j ACCEPT
################################################## ## REGLES POUR TOUT LE RESTE ## ################################################## $IPT -A INPUT -j LOG_DROP $IPT -A OUTPUT -j LOG_DROP $IPT -A FORWARD -j LOG_DROP
Ici même remarque que Nicolas George ! Je déconseille fortement de tout « droper ». Je me permets de faire référence à une discussion sur le sujet que j'avais eu sur un autre groupe :
http://groups.google.fr/groups?threadm=
-- TiChou
Dans le message <news:pan.2004.07.17.15.36.44.210210@spam.free.fr>,
*Non Compos Mentis* tapota sur f.c.o.l.configuration :
Meow les enfants,
Bonsoir gamin ;-)
Je voulais juste savoir ce que vous pensiez de mes règles pour iptables.
Je ne suis pas certain que tout soit fonctionnel mais globalement ça
marche :)
Pas comme vous le souhaitiez à priori, voir mes remarques.
Ok sauf si bien sûr les tables nat et mangle sont utilisées.
##################################################
## LES REGLES CHELOUS ##
Drôle de nom. ;)
##################################################
# Drop ICMP echo-request messages sent to broadcast or multicast addresses
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
##################################################
## REGLES DE LOG ##
##################################################
$IPT -N LOG_DROP
$IPT -A LOG_DROP -j LOG --log-prefix '[DROP] : ' --log-level info
$IPT -A LOG_DROP -j DROP
Ok mais serait plus efficace en ajoutant le matche limit afin d'éviter une
inondation des logs en cas de scans ou d'attaques qui peuvent alors
conduire, selon les performances de la machine, à un déni de service du à la
surcharge sur gestionnaire de log.
##################################################
## POLICES PAR DEFAULT ##
##################################################
$IPT -A INPUT -i lo -j ACCEPT # Allow traffic on
$IPT -A OUTPUT -o lo -j ACCEPT # loopback interface
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
Si on est puriste et dans un soucis de sécurité maximale, il est judicieux
de placer les règles qui définissent les polices par défaut au tout début,
avant toutes autres règles. On évite ainsi durant l'initialisation du
firewall tout paquet non autorisé.
$IPT -A INPUT -i $EXT -s 127.0.0.0/8 -j LOG_DROP
Vous avez défini le paramètre de noyau /proc/.../rp_filter à 1, ce qui a
pour effet de bloquer tout trafic dont l'IP source ne serait pas celle de
l'interface de sortie du paquet filtré.
La règle ci-dessus est donc inutile et dans le jargon informatique on dit
que la règle est redondante.
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ok.
##################################################
## AUTORISATION POUR LE DNS ##
##################################################
for d in $IP_DNS; do
$IPT -A INPUT -i $EXT --protocol udp --source-port 53 -s $d -j ACCEPT
$IPT -A OUTPUT -o $EXT --protocol udp --destination-port 53 -d $d -j
ACCEPT
$IPT -A INPUT -i $EXT --protocol tcp --source-port 53 -s $d -j ACCEPT
$IPT -A OUTPUT -o $EXT --protocol tcp --destination-port 53 -d $d -j
ACCEPT
done
Ces règles sont inutiles car redondantes.
En effet, vous autorisez déjà précédemment à votre machine de se connecter à
l'extérieur (--state NEW sur la chaîne OUTPUT), donc entre autre à joindre
les serveurs DNS de votre FAI et vous autorisez aussi à recevoir sur votre
machine tout trafic donc la connexion est déjà établie et donc de recevoir
entre autre les réponses des serveurs.
##################################################
## AUTORISATION POUR HTTP ##
##################################################
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80
-j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80 -j
ACCEPT
Même remarques, règles redondantes. Les paquets à l'état NEW et ESTABLISHED
sont déjà autorisés précédemment à sortir et les paquets à l'état
ESTABLISHED sont eux aussi déjà autorisés à entrer.
## AUTORISATION POUR HTTPS ##
[...]
## AUTORISATION POUR MSN ##
[...]
## AUTORISATION POUR POP ##
[...]
## AUTORISATION POUR SMTP ##
Idem, redondance.
##################################################
## AUTORISATION POUR FTP ##
##################################################
for d in $IP_FTP; do
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 21 -m state --state ESTABLISHED
-j ACCEPT
$IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 21 -m state --state
NEW,ESTABLISHED -j ACCEPT
Redondance.
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 20 -m state --state
ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 20 -m state --state
ESTABLISHED -j ACCEPT
Vous n'avez pas à vous occuper des connexions ftp-data. Il faut laisser le
module ip_conntrack_ftp suivre les connexions ftp et marquer les paquets des
connexions ftp-data à l'état RELATED, paquets qui seront alors autorisés
comme il faut.
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 1024:65535 --dport 1024:65535
-m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $EXT -d $d -p tcp --sport 1024:65535 --dport 1024:65535
-m state --state ESTABLISHED,RELATED -j ACCEPT
done
Règles redondantes et inutiles.
## AUTORISATION POUR IRC ##
[...]
Redondance.
Une remarque supplémentaire tout de même au niveau scripting. Vos deux
boucles 'for' font la même chose seul les valeurs de départ sont
différentes. On peut donc faire une seule boucle for comme ceci :
for d in $IRC_IRCNET $IRC_IDEALIRC
do
[...]
done
##################################################
## AUTORISATION POUR EMULE ET GNUTELLA 2 ##
##################################################
$IPT -A INPUT -p tcp --dport 4662 -j ACCEPT
$IPT -A INPUT -p udp --dport 4666 -j ACCEPT
$IPT -A INPUT -p udp --dport 6347 -j ACCEPT
$IPT -A INPUT -p tcp --dport 34037 -j ACCEPT
$IPT -A INPUT -p tcp --dport 34038 -j ACCEPT
$IPT -A INPUT -p udp --dport 4672 -j ACCEPT
Sont déjà autorisés précédemment les paquets à l'état ESTABLISHED et donc
ici vous autorisez les paquets NEW, RELATED mais aussi INVALID. Il serait
donc préférable d'introduire le matche state dans vos règles, comme vous le
faisiez plus ou moins dans vos précédentes règles :
$IPT -A INPUT -p tcp --dport 4662 -m state --state NEW -j ACCEPT
etc.
$IPT -A OUTPUT -p tcp --sport 4662 -j ACCEPT
[...]
Redondance.
A ce stade du firewall, une petite conclusion. On constate que la grande
majorité de vos règles sont inutiles et ne valideront *jamais* le moindre
paquet. Mais j'imagine que ce que vous souhaitiez faire au départ, est de ne
rien autoriser en entrée mais aussi en sortie, et de n'autoriser alors en
sortie que les services que vous souhaitiez utiliser. Dans ce cas, il aurait
fallu faire ainsi :
La règle suivante :
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
doit être modifiée ainsi :
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
et par exemple dans le cas de l'autorisation du trafic http, vos règles :
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80
-j ACCEPT
$IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80
-j ACCEPT
se limiteraient à l'unique règle suivante :
$IPT -A OUTPUT -o $EXT -m state --state NEW -p tcp --dport 80 -j ACCEPT
##################################################
## REGLES POUR TOUT LE RESTE ##
##################################################
$IPT -A INPUT -j LOG_DROP
$IPT -A OUTPUT -j LOG_DROP
$IPT -A FORWARD -j LOG_DROP
Ici même remarque que Nicolas George ! Je déconseille fortement de tout «
droper ».
Je me permets de faire référence à une discussion sur le sujet que j'avais
eu sur un autre groupe :
Dans le message <news:, *Non Compos Mentis* tapota sur f.c.o.l.configuration :
Meow les enfants,
Bonsoir gamin ;-)
Je voulais juste savoir ce que vous pensiez de mes règles pour iptables. Je ne suis pas certain que tout soit fonctionnel mais globalement ça marche :)
Pas comme vous le souhaitiez à priori, voir mes remarques.
Ok sauf si bien sûr les tables nat et mangle sont utilisées.
################################################## ## LES REGLES CHELOUS ##
Drôle de nom. ;)
################################################## # Drop ICMP echo-request messages sent to broadcast or multicast addresses echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
################################################## ## REGLES DE LOG ## ################################################## $IPT -N LOG_DROP $IPT -A LOG_DROP -j LOG --log-prefix '[DROP] : ' --log-level info $IPT -A LOG_DROP -j DROP
Ok mais serait plus efficace en ajoutant le matche limit afin d'éviter une inondation des logs en cas de scans ou d'attaques qui peuvent alors conduire, selon les performances de la machine, à un déni de service du à la surcharge sur gestionnaire de log.
################################################## ## POLICES PAR DEFAULT ## ################################################## $IPT -A INPUT -i lo -j ACCEPT # Allow traffic on $IPT -A OUTPUT -o lo -j ACCEPT # loopback interface $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP
Si on est puriste et dans un soucis de sécurité maximale, il est judicieux de placer les règles qui définissent les polices par défaut au tout début, avant toutes autres règles. On évite ainsi durant l'initialisation du firewall tout paquet non autorisé.
$IPT -A INPUT -i $EXT -s 127.0.0.0/8 -j LOG_DROP
Vous avez défini le paramètre de noyau /proc/.../rp_filter à 1, ce qui a pour effet de bloquer tout trafic dont l'IP source ne serait pas celle de l'interface de sortie du paquet filtré. La règle ci-dessus est donc inutile et dans le jargon informatique on dit que la règle est redondante.
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ok.
################################################## ## AUTORISATION POUR LE DNS ## ################################################## for d in $IP_DNS; do $IPT -A INPUT -i $EXT --protocol udp --source-port 53 -s $d -j ACCEPT $IPT -A OUTPUT -o $EXT --protocol udp --destination-port 53 -d $d -j ACCEPT $IPT -A INPUT -i $EXT --protocol tcp --source-port 53 -s $d -j ACCEPT $IPT -A OUTPUT -o $EXT --protocol tcp --destination-port 53 -d $d -j ACCEPT done
Ces règles sont inutiles car redondantes. En effet, vous autorisez déjà précédemment à votre machine de se connecter à l'extérieur (--state NEW sur la chaîne OUTPUT), donc entre autre à joindre les serveurs DNS de votre FAI et vous autorisez aussi à recevoir sur votre machine tout trafic donc la connexion est déjà établie et donc de recevoir entre autre les réponses des serveurs.
################################################## ## AUTORISATION POUR HTTP ## ################################################## $IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
Même remarques, règles redondantes. Les paquets à l'état NEW et ESTABLISHED sont déjà autorisés précédemment à sortir et les paquets à l'état ESTABLISHED sont eux aussi déjà autorisés à entrer.
## AUTORISATION POUR HTTPS ##
[...]
## AUTORISATION POUR MSN ##
[...]
## AUTORISATION POUR POP ##
[...]
## AUTORISATION POUR SMTP ##
Idem, redondance.
################################################## ## AUTORISATION POUR FTP ## ################################################## for d in $IP_FTP; do $IPT -A INPUT -i $EXT -s $d -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
Redondance.
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -o $EXT -d $d -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
Vous n'avez pas à vous occuper des connexions ftp-data. Il faut laisser le module ip_conntrack_ftp suivre les connexions ftp et marquer les paquets des connexions ftp-data à l'état RELATED, paquets qui seront alors autorisés comme il faut.
$IPT -A INPUT -i $EXT -s $d -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o $EXT -d $d -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT done
Règles redondantes et inutiles.
## AUTORISATION POUR IRC ##
[...]
Redondance.
Une remarque supplémentaire tout de même au niveau scripting. Vos deux boucles 'for' font la même chose seul les valeurs de départ sont différentes. On peut donc faire une seule boucle for comme ceci :
for d in $IRC_IRCNET $IRC_IDEALIRC do [...] done
################################################## ## AUTORISATION POUR EMULE ET GNUTELLA 2 ## ################################################## $IPT -A INPUT -p tcp --dport 4662 -j ACCEPT $IPT -A INPUT -p udp --dport 4666 -j ACCEPT $IPT -A INPUT -p udp --dport 6347 -j ACCEPT $IPT -A INPUT -p tcp --dport 34037 -j ACCEPT $IPT -A INPUT -p tcp --dport 34038 -j ACCEPT $IPT -A INPUT -p udp --dport 4672 -j ACCEPT
Sont déjà autorisés précédemment les paquets à l'état ESTABLISHED et donc ici vous autorisez les paquets NEW, RELATED mais aussi INVALID. Il serait donc préférable d'introduire le matche state dans vos règles, comme vous le faisiez plus ou moins dans vos précédentes règles :
$IPT -A INPUT -p tcp --dport 4662 -m state --state NEW -j ACCEPT etc.
$IPT -A OUTPUT -p tcp --sport 4662 -j ACCEPT [...]
Redondance.
A ce stade du firewall, une petite conclusion. On constate que la grande majorité de vos règles sont inutiles et ne valideront *jamais* le moindre paquet. Mais j'imagine que ce que vous souhaitiez faire au départ, est de ne rien autoriser en entrée mais aussi en sortie, et de n'autoriser alors en sortie que les services que vous souhaitiez utiliser. Dans ce cas, il aurait fallu faire ainsi :
La règle suivante :
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
doit être modifiée ainsi :
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
et par exemple dans le cas de l'autorisation du trafic http, vos règles :
$IPT -A OUTPUT -o $EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -i $EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
se limiteraient à l'unique règle suivante :
$IPT -A OUTPUT -o $EXT -m state --state NEW -p tcp --dport 80 -j ACCEPT
################################################## ## REGLES POUR TOUT LE RESTE ## ################################################## $IPT -A INPUT -j LOG_DROP $IPT -A OUTPUT -j LOG_DROP $IPT -A FORWARD -j LOG_DROP
Ici même remarque que Nicolas George ! Je déconseille fortement de tout « droper ». Je me permets de faire référence à une discussion sur le sujet que j'avais eu sur un autre groupe :
http://groups.google.fr/groups?threadm=
-- TiChou
Annie D.
TiChou wrote:
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 1 > /proc/sys/net/ipv4/conf/all/log_martians Ok.
Ne pas oublier de faire de même avec le paramètre spécifique à chaque interface concernée (ici eth1), le comportement étant le résultat d'un ET logique entre les deux.
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ok.
J'ai eu un petit souci avec cette règle en sortie sur un routeur à noyau 2.4.18 : elle causait un "trou" dans les sorties de traceroute au niveau du routeur. Explication : les paquets ICMP ttl-exceeded retournés par celui-ci étaient vus par le suivi de connexion comme INVALID. Ça ne me paraît pas très logique comme comportement, je m'attendais cec qu'ils soient reconnus RELATED comme les mêmes paquets ICMP retournés par les autres noeuds. Du coup, je ne filtre plus en fonction des états dans la chaîne OUTPUT.
TiChou wrote:
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
Ok.
Ne pas oublier de faire de même avec le paramètre spécifique à chaque
interface concernée (ici eth1), le comportement étant le résultat d'un
ET logique entre les deux.
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ok.
J'ai eu un petit souci avec cette règle en sortie sur un routeur à noyau
2.4.18 : elle causait un "trou" dans les sorties de traceroute au niveau
du routeur. Explication : les paquets ICMP ttl-exceeded retournés par
celui-ci étaient vus par le suivi de connexion comme INVALID. Ça ne me
paraît pas très logique comme comportement, je m'attendais cec qu'ils
soient reconnus RELATED comme les mêmes paquets ICMP retournés par les
autres noeuds. Du coup, je ne filtre plus en fonction des états dans la
chaîne OUTPUT.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 1 > /proc/sys/net/ipv4/conf/all/log_martians Ok.
Ne pas oublier de faire de même avec le paramètre spécifique à chaque interface concernée (ici eth1), le comportement étant le résultat d'un ET logique entre les deux.
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ok.
J'ai eu un petit souci avec cette règle en sortie sur un routeur à noyau 2.4.18 : elle causait un "trou" dans les sorties de traceroute au niveau du routeur. Explication : les paquets ICMP ttl-exceeded retournés par celui-ci étaient vus par le suivi de connexion comme INVALID. Ça ne me paraît pas très logique comme comportement, je m'attendais cec qu'ils soient reconnus RELATED comme les mêmes paquets ICMP retournés par les autres noeuds. Du coup, je ne filtre plus en fonction des états dans la chaîne OUTPUT.