OVH Cloud OVH Cloud

iptables

3 réponses
Avatar
Non Compos Mentis
Meow les enfants,

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 :)

Merci à ceux qui y jetteront un coup d'oeil

Fred


#!/bin/bash
##################################################
## VARIABLES ##
##################################################
EXT="eth1"
IP_DNS="212.27.32.177 213.228.0.212"
IP_FTP="212.129.62.129"
IP_POP="212.27.42.11 212.27.42.12 212.27.42.13 212.27.42.14"
IP_SMTP="213.228.0.176 213.228.0.169 213.228.0.44 213.228.0.62"
IRC_IRCNET="194.117.194.75 62.4.23.42"
IRC_IDEALIRC="81.57.215.33 213.186.45.218 62.73.3.4 62.212.119.136"
IPT="/sbin/iptables"

##################################################
## EFFACEMENT DES PRECEDENTES REGLES ##
##################################################
$IPT -F
$IPT -X
$IPT -Z

##################################################
## LES REGLES CHELOUS ##
##################################################
# Drop ICMP echo-request messages sent to broadcast or multicast addresses
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Drop source routed packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Don't accept ICMP redirect messages
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Don't send ICMP redirect messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# Enable source address spoofing protection
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# Log packets with impossible source addresses
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

##################################################
## 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

3 réponses

Avatar
Nicolas George
Non Compos Mentis wrote in message
:
$IPT -A LOG_DROP -j DROP
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP


Aargh ! <couic>

Avatar
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.

Merci à ceux qui y jetteront un coup d'oeil


De rien.

## VARIABLES ##


[...]

Ok.

##################################################
## EFFACEMENT DES PRECEDENTES REGLES ##
##################################################
$IPT -F
$IPT -X
$IPT -Z


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


Bof.

# Drop source routed packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Don't accept ICMP redirect messages
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Don't send ICMP redirect messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# Enable source address spoofing protection
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# Log packets with impossible source addresses
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians


Ok.

##################################################
## 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

Avatar
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.