Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[iptables] votre avis -> securité + améliorations

13 réponses
Avatar
omnikron
Bonjour/soir à tous :o)

J'aimerai vous soumettre un script netfilter de firewalling + nat que j'aimis en place sur ma passerelle. Je me suis pour cela inspiré de divers doc trouvés sur le net et en particulier de l'article de lealinux. J'aimerai avoir l'avis des personne maitrisant le sujet... surtout en ce qui concerne les états de connections RELATED et ESTABLISHED, car j'ai peur d'avoir fait l'erreur de toujours les mettre dans le meme panier. En fait, c'est surtout au niveau du serveur ftp que je m'interroge.

Mon lan est sur le reseaux 192.168.1.0/24 et mon acces internet se trouve sur 192.168.1.1 par eth1. J'ai un serveur ftp sur la gateway qui est ouvert au public et j'ai un serveur ssh sur ma machine 192.168.1.11 que j'atteint en forwardant le port 6022 vers le 22 (de ma machine perso donc - cad 192.168.1.11).

Pourriez vous me conseiller en particulier en ce qui conserne les state of connection de mes differentes regles ? De plus, j'aimerai utiliser d'autres ports pour mon ftp (qui est je rappel sur le firewall/passerelle), or, je m'attends a pas mal de problemes... je voudrai utiliser les ports 6020 et 6021, en fesant en sorte que l'actif et le passif soient ok tous les deux. Je precise que ce n'est pas mon principal objectif (pour le ftp) mais pour info j'aimerai avoir vos commentaires la dessus.

D'avance merci,
Julien.


// begin of the script
#!/bin/sh


#
# Begin of variables definitions
#

IPTABLES=/sbin/iptables
EXTERNAL_IF="eth1"
INTERNAL_IF="eth0"

#
# End of variables definitions
#




#
# Begin of functions definitions
#

start() {
echo "Starting Netfilter/Iptables"

echo 0 > /proc/sys/net/ipv4/ip_forward

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# chain log and drop for dropped packets
$IPTABLES -N LOG_DROP
$IPTABLES -A LOG_DROP -j LOG --log-prefix "[IPT DROP] : "
$IPTABLES -A LOG_DROP -j DROP

# chain log and accept for accepted packets (in)
$IPTABLES -N LOG_ACCEPT
$IPTABLES -A LOG_ACCEPT -j LOG --log-prefix "[IPT ACCEPT] : "
$IPTABLES -A LOG_ACCEPT -j ACCEPT

# chain log and accept for accepted packets (out)
#$IPTABLES -N LOG_ACCEPT_OUT
#$IPTABLES -A LOG_ACCEPT_OUT -j LOG --log-prefix "[IPT ACCEPT OUT] : "
#$IPTABLES -A LOG_ACCEPT_OUT -j ACCEPT


# all accepted on lo
$IPTABLES -A INPUT -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -A OUTPUT -o lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT

# all accepted on eth0
$IPTABLES -A INPUT -i $INTERNAL_IF -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_IF -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT


# lan have access to all on internet
$IPTABLES -A FORWARD -i $INTERNAL_IF -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT


# gateway have access to dns (port 53)
$IPTABLES -A INPUT -p udp --sport 53 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 53 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# gateway have access to dhcp (port 67)
$IPTABLES -A INPUT -p udp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# gateway have access to ntp (port 123)
$IPTABLES -A INPUT -p udp --sport 123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# gateway have access to web
$IPTABLES -A INPUT -p tcp --sport 80 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 443 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# gateway have access to ftp
$IPTABLES -A INPUT -p tcp --sport 21 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 21 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 20 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 20 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


# ftp the gateway from internet (server)
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# ssh the gateway from internet (server)
#$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 22 -m state --state NEW -j LOG_ACCEPT
#$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
#$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 22 -j ACCEPT

# ssh atlantis (forwarding to server)
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -p tcp --dport 22 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 6022 -j DNAT --to-destination 192.168.1.11:22


# no spoofing
for i in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $i
done

# icmp / ping
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -m limit --limit 10/min -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT


# log dropped packets
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp -j LOG_DROP
$IPTABLES -A INPUT -i $EXTERNAL_IF -p udp -j LOG_DROP


# masquerade of the lan
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

echo "."
}

stop() {
echo "Stopping Netfilter/Iptables"

$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT

$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

$IPTABLES -F
$IPTABLES -t nat -F

$IPTABLES -X
$IPTABLES -t nat -X

echo 0 > /proc/sys/net/ipv4/ip_forward

echo "."
}

#
# End of functions definitions
#





case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
$IPTABLES -L
$IPTABLES -t nat -L
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
esac

exit
//end of the script



PS : Le 123 est ouvert car mon modem (une freebox) balance l'ip par dhcp sur eth1. A ce sujet, pourriez vous m'indiquer si je suis obligé d'ouvrir a chaque fois le port en tcp+udp ? De meme, qu'en est il pour les requetes dns et les requetes ntp ?

10 réponses

1 2
Avatar
omnikron
On Sun, 14 Sep 2003 00:21:58 +0200
Bertrand Masius wrote:

Bonjour,


Re-bonjour,

[...]

Attend les réponses d'autres "experts", puis reposte tes règles après
modifications, pour voir si t'as bien travailé ;-).


Bien merci beacoup de ta reponse ! J'ai deja pas mal de bonnes améliorations a faire :-)
Je reposte mon script quand j'aurai corrigé tout ça (cad peut être seulement demain maintement) !

Julien

Avatar
omnikron
On Sun, 14 Sep 2003 00:21:58 +0200
Bertrand Masius wrote:

# gateway have access to dhcp (port 67)
$IPTABLES -A INPUT -p udp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Pareil, les deux dernières lignes sont inutiles pour la même raison.
Tu peux rajouter que le port local sera toujours 68....euh, je veux dire
123.
Pour plus de sécurité, tu peux ajouter l'adresse IP du serveur DHCP

# gateway have access to ntp (port 123)
$IPTABLES -A INPUT -p udp --sport 123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ces quatres lignes sont à supprimer.

# gateway have access to web
$IPTABLES -A INPUT -p tcp --sport 80 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 443 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
tu peux charger le module multiport : ... -m multiports --sport 80,443..

et gagner deux lignes


Salut !

Je suis sur les corrections... lorsque tu met "Ces quatres lignes sont à supprimer." tu parles desquelles ? :o) Si ce sont les lignes ntp, pourquoi puis-je les supprimer ? Les requetes ntp ne passeront plus vers l'exterieur (depuis le firewall) non ? Je en pense pas que tu parlais des lignes qui concernent le web... A ce propos je ne sais pas si je vais utiliser le multiport ; en effet il faut que je verifie d'avoir compilé mon kernel avec cette option... Le pc est un vieux p90 alors je me sens pas de recompiler pdt 3 heures cet ap.midi :))

Julien


Avatar
omnikron
On Sun, 14 Sep 2003 00:21:58 +0200
Bertrand Masius wrote:

Les deux dernières lignes sont inutiles, le DNS se faisant uniquement en
UDP
Tu peux ajouter l'adresse des DNS, pour plus de sécurité.
# gateway have access to dhcp (port 67)
$IPTABLES -A INPUT -p udp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT



Salut (encore :p),

Je vais (juste apres ca) configurer bind sur ma passerelle... Donc, si je fait matcher mes regles avec les serveurs dns de mon fai, ca risque de poser probleme non ? Si je met l'option 'forward first' dans bind, mes requetes de nom seront directement redirigées vers les dns de mon fai et donc pas de probleme mais qu'en est il si je ne met pas cette option et que je choisis de faire tourner mon dns independement ? Mon serveur fera alors les requetes dns vers les dns root non ? Donc pour cette deuxieme option le mieux est certainement de ne pas matcher les adresses dns du fai ? Je me trompe ?

Merci,
Julien


Avatar
omnikron
On Sun, 14 Sep 2003 00:21:58 +0200
Bertrand Masius wrote:

Attend les réponses d'autres "experts", puis reposte tes règles après
modifications, pour voir si t'as bien travailé ;-).


Voila, j'ai modifié et ajouté des commentaires. Merci de me dire si j'ai bein compris tous tes conseils :o)
C'est clair que c'est vraiment puissant comme logiciel netfilter !! J'ai aussi fait un script de QoS inspiré du wondershaper et utilsant diferentes diciplines de mise en attente (htp, sfq, red, imq) qui marche tres bien chez moi mais qui n'est tout de meme pas totallement au point... et là encore c'est iptable qui marque les paquets avec la table mangling... enfin bon, tout cela pour dire que les possibilités sont immences !

Qu'en est il pour les autres plateformes ? *BSD, Unix proprietaires, etc... les outils sont ils encore *beacoup* plsu puissant ou est ce sensiblement equivalent ? Qu'utilisent les gros routeurs des fai ? J'avoue que c'est un domaine qui me rends assez curieux et que je trouve tres interessant. Linux sait il s'imposer en la matiere ?


// ---- begin du script ----

#!/bin/sh


#
# Begin of variables definitions
#

# EXTERNAL_IF est l'interface connecté au net
# INTERNAL_IF est l'interface connecté au reseau local
# IPTABLES est le chemin vers l'executable iptables
IPTABLES=/sbin/iptables
EXTERNAL_IF="eth1"
INTERNAL_IF="eth0"

#
# End of variables definitions
#




#
# Begin of functions definitions
#

start() {
echo "Starting Netfilter/Iptables"

# Le routage est d'abord desactivé
# Ca ne sert pas à grand chose mais bon ;o)
echo 0 > /proc/sys/net/ipv4/ip_forward

# Politique par default, on bloque tout
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Création d'une chaine perso pour logger les paquets dropés
# chain log and drop for dropped packets
$IPTABLES -N LOG_DROP
$IPTABLES -A LOG_DROP -j LOG --log-prefix "[IPT DROP] : "
$IPTABLES -A LOG_DROP -j DROP

# Création d'une chaine perso pour logger certains paquets acceptés
# chain log and accept for accepted packets (in)
$IPTABLES -N LOG_ACCEPT
$IPTABLES -A LOG_ACCEPT -j LOG --log-prefix "[IPT ACCEPT] : "
$IPTABLES -A LOG_ACCEPT -j ACCEPT

# chain log and accept for accepted packets (out)
#$IPTABLES -N LOG_ACCEPT_OUT
#$IPTABLES -A LOG_ACCEPT_OUT -j LOG --log-prefix "[IPT ACCEPT OUT] : "
#$IPTABLES -A LOG_ACCEPT_OUT -j ACCEPT


# Tous les packets ayant l'etat de connection INVALID sont dropés
# drop invalid packets
$IPTABLES -A INPUT -i $EXTERNAL_IF -m state --state INVALID -j LOG_DROP
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state INVALID -j LOG_DROP

# Toutes les nouvelles connection pour lesquelles le paquet n'est pas
# un paquet SYN sont dropées
# drop new connections if packet is not a syn
$IPTABLES -A INPUT -p tcp ! --syn -i $EXTERNAL_IF -m state --state NEW -j LOG_DROP
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state NEW -j LOG_DROP


# Tout est accepté sur l'interface de loopback de la machine
# all accepted on lo
$IPTABLES -A INPUT -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -A OUTPUT -o lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT

# Tout est accepté sur eth0, l'interface connectée au reseau local
# all accepted on eth0
$IPTABLES -A INPUT -i $INTERNAL_IF -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_IF -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT

# Le reseau local a acces a tout sur le net
# lan have access to all on internet
$IPTABLES -A FORWARD -i $INTERNAL_IF -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

# Le firewall peut faire des requetes vers les dns du fai
# gateway can ask dns of my isp (port 53)
$IPTABLES -A INPUT -p udp --sport 53 -i $EXTERNAL_IF --src 212.27.32.176 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -o $EXTERNAL_IF --dst 212.27.32.176 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p udp --sport 53 -i $EXTERNAL_IF --src 212.27.32.177 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -o $EXTERNAL_IF --dst 212.27.32.177 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Le firewall peut demander service au dhcp du modem pour que celui ci lui donne son ip externe
# Je ne connais pas l'adresse ip du modem donc je ne peux pas restreindre à lui meme
# gateway can ask dhcp of the modem (port 67)
$IPTABLES -A INPUT -p udp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Le firewall a access aux services web, ftp et ntp (serveur de temps)
# gateway have access to web (80,443), ftp (21,20) and ntp (123)
$IPTABLES -A INPUT -p udp -m multiport --sport 80,443,21,20,123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp -m multiport --dport 80,443,21,20,123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp -m multiport --sport 80,443,21,20,123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m multiport --dport 80,443,21,20,123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


# Le firewall possede un serveur ftp accessible depuis l'exterieur
# Les debuts de connection sont loggués
# Le serveur fonctionne en principe pour les clients configurés en passif et en actif
# ftp the gateway from internet (server)
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF -m multiport --dport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF -m multiport --sport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 20 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Le firewall accepte les connections ssh depuis l'exterieur
# Le debut de la connection est loggé
# ssh the gateway from internet (server)
#$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 22 -m state --state NEW -j LOG_ACCEPT
#$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
#$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 22 -j ACCEPT

# Le firewall redirige toutes les requetes arrivant sur le port 6022 vers le port 22 de la machine
# 192.168.1.11 (atlantis)
# ssh atlantis (forwarding to server)
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -p tcp --dport 22 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 6022 -j DNAT --to-destination 192.168.1.11:22


# Pour empécher le spoofing
# Pris sur lealinux.org
# no spoofing
for i in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $i
done

# Restriction des packets icpm
# A voir et a améliorer, peut-etre a restreindre au ping seulement
# icmp / ping (hum...)
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -m limit --limit 10/min -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT


# Tous les autres paquets ne matchant aucune des regles sont loggés et droppés
# log dropped packets
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp -j LOG_DROP
$IPTABLES -A INPUT -i $EXTERNAL_IF -p udp -j LOG_DROP


# Masquerade des ip du reseau local et activation du routage
# Permet entre autre le partage de connection
# masquerade of the lan
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

echo "."
}

stop() {
echo "Stopping Netfilter/Iptables"

# Tout est accepté comme politique par default sur la chaine filter
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT

# Tout est accepté comme politique par default sur la chaine nat
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

# Toutes les regles sont vidées
# Tables filter et nat
$IPTABLES -F
$IPTABLES -t nat -F

# Toutes les chaines perso sont detruites
# Tables filter et nat
$IPTABLES -X
$IPTABLES -t nat -X

# Le routage est desactivé
echo 0 > /proc/sys/net/ipv4/ip_forward

echo "."
}

#
# End of functions definitions
#





case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# Le parametre -L liste toutes les chaine en cours
# Tables filter et nat
$IPTABLES -L
$IPTABLES -t nat -L
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
esac

exit

// ---- end du script ----

Avatar
omnikron
On Sun, 14 Sep 2003 16:29:32 +0200
omnikron wrote:


# Le firewall possede un serveur ftp accessible depuis l'exterieur
# Les debuts de connection sont loggués
# Le serveur fonctionne en principe pour les clients configurés en passif et en actif
# ftp the gateway from internet (server)
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF -m multiport --dport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF -m multiport --sport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 20 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT



Après tests, ceci ne fonctionne pas depuis l'exterieur en ftp passif (actif ok).
Peut-être ai-je mal compris un de tes conseils.

Que me conseillez vous ?
Julien

Avatar
Bertrand Masius
Bonjour,

Le Sun, 14 Sep 2003 16:29:32 +0200, omnikron a

On Sun, 14 Sep 2003 00:21:58 +0200
Bertrand Masius wrote:

Attend les réponses d'autres "experts", puis reposte tes règles après
modifications, pour voir si t'as bien travailé ;-).


Voila, j'ai modifié et ajouté des commentaires. Merci de me dire si j'ai bein compris tous tes conseils :o)


C'est impeccable. Bravo.

C'est clair que c'est vraiment puissant comme logiciel netfilter !! J'ai aussi fait un script de QoS inspiré du wondershaper et utilsant diferentes diciplines de mise en attente (htp, sfq, red, imq) qui marche tres bien chez moi mais qui n'est tout de meme pas totallement au point... et là encore c'est iptable qui marque les paquets avec la table mangling... enfin bon, tout cela pour dire que les possibilités sont immences !
< Mode apprend Usenet >

limite tes lignes à 72 caractères stp.
</ Mode apprend Usenet >

Va faire un tour sur www.netfilter.org, et lis les HOWTO (il existe une
traduction française ailleurs). Tu seras épaté par la puissance des
nouveaux modules sortis.


Qu'en est il pour les autres plateformes ? *BSD, Unix proprietaires, etc... les outils sont ils encore *beacoup* plsu puissant ou est ce sensiblement equivalent ? Qu'utilisent les gros routeurs des fai ? J'avoue que c'est un domaine qui me rends assez curieux et que je trouve tres interessant. Linux sait il s'imposer en la matiere ?


J'avoue ne pas savoir vraiment. C'est un domaine qui m'interesse
également.

J'ajoute une règle supplémentaire au début pour sécuriser le lan :

# ne pas autoriser les IP du lan à rentrer par internet
# do not allow lan IPs to enter the internet interface
$IPTABLES -A FORWARD -i $EXTERNAL_IF -s 192.168.1.0/24 -j LOG_DROP

# Le firewall peut demander service au dhcp du modem pour que celui ci lui donne son ip externe
# Je ne connais pas l'adresse ip du modem donc je ne peux pas restreindre à lui meme
# gateway can ask dhcp of the modem (port 67)
$IPTABLES -A INPUT -p udp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Tu peux préciser que le port local est le 68. Remarque, je trouve

bizarre que ce soit le DHCP du modem qui soit interrogé.

# Restriction des packets icpm
# A voir et a améliorer, peut-etre a restreindre au ping seulement
# icmp / ping (hum...)
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -m limit --limit 10/min -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT

Je te propose les règles suivantes :


# laisser passer les requêtes ping,les réponses pong et traceroute en
sortie
# allow ping requests, pong and traceroute answers on output
$IPTABLES -A OUTPUT -p icmp -m icmp --icmp-type ping,pong,time-exceeded
-j ACCEPT

# laisser passer les réponses pong et les réponses traceroute en entrée
# allow pong answers and traceroute answers on input
$IPTABLES -A INPUT -p icmp -m icmp --icmp-type pong, time-exceeded -m
state RELATED -m limit --limit 10/min -j ACCEPT

# laisser passer les requêtes ping en entrée
# allow ping requests on input
$IPTABLES -A INPUT -p icmp -m icmp --icmp-type ping -m state NEW -m
limit --limit 10/min -j ACCEPT

# laisser passer les paquets de fermeture de port de l'hôte distant
# allow port unreachable from remote hosts
$IPTABLES -A INPUT -p icmp -m icmp --icmp-type port-unreachable -m state
--state RELATED -j ACCEPT

(facultatif : annule le mode 'stealth')
# autoriser les icmp "port fermé" à sortir
# allow port unreachable to remote hosts
$IPTABLES -A OUTPUT -p icmp -m icmp --icmp-type port-unreachable -j
ACCEPT

J'ai supprimé les --state ESTABLISHED car ceux-ci ne fonctionnent qu'en
mode "connecté", or icmp et udp ne sont pas des modes connectés. La
modif peut être faite partout.

Il est inutile de bloquer les ping/pong, ça ne gêne que les gamins de 12
ans qui jouent aux script-kiddies, les pros ont mille autres techniques,
et ne prendront même pas la peine de faire un ping. De plus, c'est
normalement obligatoire de répondre à un ping :-(

Voilà, c'est tout pour ce soir. C'est une config de base qui permet de
se connecter en sécurité à internet, pour une utilisation privée.
J'avoue moi-même ne pas être allé plus loin dans ma config, mais on peut
rajouter plein de trucs : Dos, détection de scans nmap, par exemple :-).
--
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément."

(Nicolas Boileau, l'Art poétique)


Avatar
Bertrand Masius
Bonjour,

Le Mon, 15 Sep 2003 00:14:41 +0200, Bertrand Masius


J'ai supprimé les --state ESTABLISHED car ceux-ci ne fonctionnent qu'en
mode "connecté", or icmp et udp ne sont pas des modes connectés. La
modif peut être faite partout.
Je me répond :

Non !
C'est RELATED qui peut être supprimé partout en UDP et TCP, sauf pour le
ftp.
voir man iptables pour précisions



--
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément."

(Nicolas Boileau, l'Art poétique)

Avatar
omnikron
On Mon, 15 Sep 2003 18:33:52 +0200
Bertrand Masius wrote:

C'est RELATED qui peut être supprimé partout en UDP et TCP, sauf pour le
ftp.
voir man iptables pour précisions


ok !
je reposte le script si j'ai le temps de faire cela ce soir...

encore merci bertrand,
julien

Avatar
Bertrand Masius
Bonjour,

Le Sun, 14 Sep 2003 22:57:01 +0200, omnikron a

On Sun, 14 Sep 2003 16:29:32 +0200
omnikron wrote:


# Le firewall possede un serveur ftp accessible depuis l'exterieur
# Les debuts de connection sont loggués
# Le serveur fonctionne en principe pour les clients configurés en passif et en actif
# ftp the gateway from internet (server)
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state NEW -j LOG_ACCEPT
ça c'est pour actif et passif, canal contrôle en entrée NEW


$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 -m state --state NEW -j LOG_ACCEPT
ça c'est pour actif, canal contrôle en sortie NEW


$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF -m multiport --dport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
ça c'est pour actif et passif en entrée ESTABLISHED pour 21, et NEW ( RELATED), ESTABLISHED pour 20 (a)


$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF -m multiport --sport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
ça c'est pour actif et passif en sortie ESTABLISHED (b)


$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
ça c'est pareil que (a), en plus sélectif (meilleur). soit supprimer,


soit intégrer dans (a)
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 20 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
ça c'est pareil que (b), en plus sélectif. supprimer ou intégrer.





Après tests, ceci ne fonctionne pas depuis l'exterieur en ftp passif (actif ok).
Peut-être ai-je mal compris un de tes conseils.

Que me conseillez vous ?


Il faut charger le module ip_conntrack_ftp et ip_nat_ftp
ce qui donne, en supprimant les deux dernières lignes en double et un
RELATED qui ne sert pas :

.../...
$ modprobe -k ip_conntrack_ftp
$ modprobe -k ip_nat_ftp
.../...
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state
NEW -j LOG_ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 -m state --state
NEW -j LOG_ACCEPT
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF -m multiport --dport 21,20
--sport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF -m multiport --sport 21,20
--dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

Ca devrait fonctionner.

Nota sur les RELATED : ça ne sert qu'au connection ftp en mode actif et
aux icmp d'erreurs, en configuration de base.
--
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément."

(Nicolas Boileau, l'Art poétique)


Avatar
Julien Salgado
omnikron a écrit :
Qu'en est il pour les autres plateformes ? *BSD, Unix proprietaires,
etc... les outils sont ils encore *beacoup* plsu puissant ou est ce
sensiblement equivalent ?


On sort un peut du domaine du groupe, il y a ipf (BSB, Solaris, HP/UX.
Irix, True64, ...), pf (pour OpenBSD), ipfw (FreeBSD). Ensuite il y a
les firewalls Commerciaux...
- pf est très, très bien, propre la syntaxe est celle de ipf.
- ipf permet d'avoir une syntaxe compatible sur pas mal d'architecture
(pratique).
- les commerciaux sont parfois très avancés sur en particulier sur des
points comme l'admin centralisée ou la redondance ou les outils libres
sont un peu faible.

Qu'utilisent les gros routeurs des fai ?


En général, les routeurs ne font pas firewall, car ils ont déjà pas mal
de boulot de routeur à faire (BGP en paticulier), ils ont des ACL pour
une protection de base au niveau IP et en général sans suivre l'état des
connexions. Ensuite. la partie purement filtrage est faite par des
équipements dédiés (en général commerciaux pour profiter au maximum du
matériel).

J'avoue que c'est un domaine qui me rends assez curieux et que je
trouve tres interessant. Linux sait il s'imposer en la matiere ?


Linux s'impose à mon avis sur certains points comme :
- il est libre (comme les *pf*, pas de troll...)
- il est possible d'écrire des modules en mode noyau assez facilement,
pour gérer des protocoles exotiques.
- il est possible de faire passer le traffic en mode utilisateur pour le
gérer par un prorgramme externe.



// ---- begin du script ----

#!/bin/sh


#
# Begin of variables definitions
#

# EXTERNAL_IF est l'interface connecté au net
# INTERNAL_IF est l'interface connecté au reseau local
# IPTABLES est le chemin vers l'executable iptables
IPTABLES=/sbin/iptables
EXTERNAL_IF="eth1"
INTERNAL_IF="eth0"

#
# End of variables definitions
#




#
# Begin of functions definitions
#

start() {
echo "Starting Netfilter/Iptables"

# Le routage est d'abord desactivé
# Ca ne sert pas à grand chose mais bon ;o)


Ben si, ça empêche qu'un paquet passe avant les règles... dans le
principe il faut aussi activer les interfaces une fois les règles
établies.

echo 0 > /proc/sys/net/ipv4/ip_forward
[...]




# Toutes les nouvelles connection pour lesquelles le paquet n'est pas
# un paquet SYN sont dropées
# drop new connections if packet is not a syn
$IPTABLES -A INPUT -p tcp ! --syn -i $EXTERNAL_IF -m state --state NEW -j LOG_DROP


Il faut plutôt être général :
$IPTABLES -A INPUT -p tcp ! --syn -m state --state RELATED,NEW -j LOG_DROP
$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state RELATED,NEW -j LOG_DROP
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state RELATED,NEW -j LOG_DROP

Ensuite on peut discuter sur les drapeaux vérifiés par --syn... Puis on
peut aussi vérifier les SYN en cours en cours de connexion, plus
subtil...

$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state NEW -j LOG_DROP


# Tout est accepté sur l'interface de loopback de la machine
# all accepted on lo
$IPTABLES -A INPUT -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -A OUTPUT -o lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT

# Tout est accepté sur eth0, l'interface connectée au reseau local
# all accepted on eth0
$IPTABLES -A INPUT -i $INTERNAL_IF -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_IF -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT


Tu peux préciser l'IP du firewall...

# Le reseau local a acces a tout sur le net
# lan have access to all on internet
$IPTABLES -A FORWARD -i $INTERNAL_IF -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT


C'est un peu trop permissif (on est jammais trop prudent), tu peux :
- préciser le réseau interne
- préciser les ports internes (supérieur à 1024:)

# Le firewall peut faire des requetes vers les dns du fai
# gateway can ask dns of my isp (port 53)
$IPTABLES -A INPUT -p udp --sport 53 -i $EXTERNAL_IF --src 212.27.32.176 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -o $EXTERNAL_IF --dst 212.27.32.176 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p udp --sport 53 -i $EXTERNAL_IF --src 212.27.32.177 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -o $EXTERNAL_IF --dst 212.27.32.177 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Le RELATED ne sert à rien

# Le firewall peut demander service au dhcp du modem pour que celui ci lui donne son ip externe
# Je ne connais pas l'adresse ip du modem donc je ne peux pas restreindre à lui meme
# gateway can ask dhcp of the modem (port 67)
$IPTABLES -A INPUT -p udp --sport 67 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 67 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Pareil...

# Le firewall a access aux services web, ftp et ntp (serveur de temps)
# gateway have access to web (80,443), ftp (21,20) and ntp (123)
$IPTABLES -A INPUT -p udp -m multiport --sport 80,443,21,20,123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p udp -m multiport --dport 80,443,21,20,123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp -m multiport --sport 80,443,21,20,123 -i $EXTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m multiport --dport 80,443,21,20,123 -o $EXTERNAL_IF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


On peut préciser les port clients qui sont supérieurs à 1024.
Le web et ftp c'est du TCP, NTP c'est de l'UDP... Maintenant à par le
port 20 pour ftp il n'y a pas besoin de RELATED. Pour le FTP actif
(le firewall étant client) la connexion est RELATED et vient du serveur
extérieur.
$IPTABLES -A INPUT -p tcp --sport 20 --dport 1024: -i $EXTERNAL_IF
-m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m multiport --dport 80,443,21
--sport 1024:-m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -m multiport --sport 80,443,21,20
--dport 1024: -o $EXTERNAL_IF -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m multiport --dport 80,443,21,20
--sport 1024: -o $EXTERNAL_IF -m state --state ESTABLISHED -j ACCEPT

Il faut aussi une règle pour le FTP passif... éventuellement.
$IPATBLES -A OUTPUT -p tcp --dport 1024: --sport 1024:
-m state --state ESTABLISHED,RELATED -j ACCEPT
$IPATBLES -A INPUT -p tcp --dport 1024: --sport 1024:
-m state --state ESTABLISHED -j ACCEPT


# Le firewall possede un serveur ftp accessible depuis l'exterieur
# Les debuts de connection sont loggués
# Le serveur fonctionne en principe pour les clients configurés en passif et en actif
# ftp the gateway from internet (server)
$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 21 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 -m state --state NEW -j LOG_ACCEPT


La connexion active est en RELATED...
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 20 --dport 1024:
-m state --state RELATED -j LOG_ACCEPT

Pour le passif les règles sont :
$IPATBLES -A INPUT -p tcp --dport 1024: --sport 1024:
-m state --state ESTABLISHED,RELATED -j ACCEPT
$IPATBLES -A OUTPUT -p tcp --dport 1024: --sport 1024:
-m state --state ESTABLISHED -j ACCEPT

On peut les combiner avec les règles du FTP client plus haut et avoir
que deux règles :
$IPATBLES -A INPUT -p tcp --dport 1024: --sport 1024:
-m state --state ESTABLISHED,RELATED -j ACCEPT
$IPATBLES -A OUTPUT -p tcp --dport 1024: --sport 1024:
-m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF -m multiport --dport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF -m multiport --sport 21,20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 20 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT


Les règles sont redondantes... il suffit d'avoir :

$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF
-m multiport --dport 21,20 --sport 1024:
-m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF
-m multiport --sport 21,20 --dport 1024:
-m state --state ESTABLISHED -j ACCEPT

# Le firewall accepte les connections ssh depuis l'exterieur
# Le debut de la connection est loggé
# ssh the gateway from internet (server)
#$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 22 -m state --state NEW -j LOG_ACCEPT
#$IPTABLES -A INPUT -p tcp -i $EXTERNAL_IF --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
#$IPTABLES -A OUTPUT -p tcp -o $EXTERNAL_IF --sport 22 -j ACCEPT


Le RELATED est inutile et en fait, le port 22 peut être mis avec le port
21 pour les règles.


# Le firewall redirige toutes les requetes arrivant sur le port 6022 vers le port 22 de la machine
# 192.168.1.11 (atlantis)
# ssh atlantis (forwarding to server)
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -p tcp --dport 22 -m state --state NEW -j LOG_ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 6022 -j DNAT --to-destination 192.168.1.11:22


En fait les règles sont trop permissives car tu autorises des personnes
à parler directement à ton réseau local en utilisant ta règle de
FORWARD. Il faut simplement qu'ils connaissent l'adressage de ton réseau
privé. Les solutions :
- ne pas autoriser les flux et faire du ssh par rebond sur la
passerelle (si c'est possible en fonction des utilisateurs).
- coloriser les paquets en PREROUTING et les accepter ensuite en
FOWARDING.
- utiliser le module conntrack pour vérifier que le paquet filtrer en
FORWARD est bien un paquet NATé.
Dans tous les deux derniers cas bien limité la destination (IP) et la
source (port).


# Pour empécher le spoofing
# Pris sur lealinux.org
# no spoofing
for i in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $i
done

# Restriction des packets icpm
# A voir et a améliorer, peut-etre a restreindre au ping seulement
# icmp / ping (hum...)


Modifier les valeurs dans /proc....

$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -m limit --limit 10/min -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT


Il n'y a pas de traffic ESTABLISHED en icmp... et mettre des limites
peut être une très mauvaise idée, en particulier pour les icmp qui sont
des messages d'erreur.
$IPTABLES -A OUTPUT -p icmp -m state --state NEW
-m icmp --icmp-type ping -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED
-m icmp --icmp-type pong -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED
-m icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state RELATED
-m icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW
-m icmp --icmp-type ping -m limit --limit 10/min -j ACCEPT
$IPTABLES -A INPUT -p icmp -j DROP

# Tous les autres paquets ne matchant aucune des regles sont loggés et droppés
# log dropped packets
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp -j LOG_DROP
$IPTABLES -A INPUT -i $EXTERNAL_IF -p udp -j LOG_DROP


Donc tu ne journalises pas les paquets sur d'autres protocoles... En une
ligne (pour chaque chaine) :
$IPTABLES -A INPUT -j LOG_DROP
$IPTABLES -A FORWARD -j LOG_DROP
Tout le reste doit être du traffic connu...

# Masquerade des ip du reseau local et activation du routage
# Permet entre autre le partage de connection
# masquerade of the lan
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

echo "."
}

stop() {
echo "Stopping Netfilter/Iptables"

# Tout est accepté comme politique par default sur la chaine filter
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT

# Tout est accepté comme politique par default sur la chaine nat
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

# Toutes les regles sont vidées
# Tables filter et nat
$IPTABLES -F
$IPTABLES -t nat -F

# Toutes les chaines perso sont detruites
# Tables filter et nat
$IPTABLES -X
$IPTABLES -t nat -X

# Le routage est desactivé
echo 0 > /proc/sys/net/ipv4/ip_forward

echo "."
}

#
# End of functions definitions
#





case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# Le parametre -L liste toutes les chaine en cours
# Tables filter et nat
$IPTABLES -L
$IPTABLES -t nat -L
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
esac

exit

// ---- end du script ----



--
Julien

1 2