Travaux sur le script de pare-feu simplifié du Wiki

Du point de vue des règles iptables, ça m’a l’air pas mal. Je n’ai pas vérifié la comparaison de la version du noyau.
Il y a encore deux défauts mineurs :

  1. Dans la fonction fw_clear (),

est en doublon avec

puisque “filter” est la table par défaut.

  1. L’en-tête LSB contient

ce qui signifie que le script sera invoqué avec l’argument “stop” lors de l’arrêt ou du redémarrage du système. Or il n’a pas de commande “stop”. Je pense qu’on peut l’ajouter et la traiter simplement comme la commande “clean”. Ou bien on peut retirer le script de ces runlevels, puisque de toute façon le système va être arrêté ou redémarré.

Par contre, j’ai peur qu’on se soit un peu éloigné de l’idée initiale de pare-feu “simplifié”.

Salut,
On ne pourra pas dire que tu ne m’as pas mâché le travail. :smiley:
Je corrige et je poste.

Je pense qu’il faut une commande stop, ça ferait drôle un script dans init.d qu’on en lance pas avec start/stop.
Pour être logique elle devrait remplacer la commande “clean”.

Le script est simplifié pour les utilisateurs (ils rentrent quelques variables et le lancent). Pour moi ça reste justifié comme adjectif.

Merci. :006

Re,
Voici donc la dernière mouture. Merci à ceux qui voudront bien tester.

[code]#!/bin/sh

BEGIN INIT INFO

Provides: parefeu

Required-Start: $local_fs

Should-Start:

Required-Stop: $local_fs

Should-Stop:

X-Start-Before: $network

X-Stop-After: $network

Default-Start: S

Default-Stop: 0 6

Short-description: Configuration du pare-feu

Description: Met en place les règles iptables (IPv4 uniquement)

END INIT INFO

— Explications

Par défaut cette configuration s’applique à toutes les interfaces réseau.

Si vous souhaitez restreindre cela à une interface donnée, dé-commentez la ligne #IFACE=“eth0”

(dans la section variables)

Par défaut, le script autorise tout en sortie. Pour changer ce comportement veuillez indiquer quels sont les ports

autorisés en sortie dans les 2 variables suivantes (Tout sera bloqué sauf les ports inscrits)

$REMOTE_TCP_SERVICES

et/ou $REMOTE_UDP_SERVICES

- Pour configurer une machine qui fasse office de routeur, changez la valeur de la

variable ISROUTERNAT à true, ET configurez les interfaces ethx et ethy selon votre configuration.

=> ethx correspond à l’interface du LAN (reliée à votre Intranet)

=> ethy correspond à l’interface WAN (reliée à Internet ou à la truc-box)

— VARIABLES

. /lib/lsb/init-functions
readonly IPTABLES=/sbin/iptables

Services que le système offrira au réseau, à séparer avec des espaces

Par défaut RIEN n’est autorisé à part le Ping.

TCP_SERVICES="“
UDP_SERVICES=”"

Services que le système utilisera du réseau

(défaut : autorise TOUT en sortie si aucun port n’est précisé)

REMOTE_TCP_SERVICES="“
REMOTE_UDP_SERVICES=”"

Pour une machine faisant office de routeur avec NAT, changez la valeur de la variable ISROUTERNAT à “true”.

ISROUTERNAT=false

ethx correspond à l’interface du LAN

ethy correspond à l’interface reliée à la truc-box (à compléter seulement si vous activez la fonction routeur)

ethx="eth1"
ethy=“eth0”

Ajustez le nom de l’interface pour restreindre le trafic entrant à cette interface particulière.

Par exemple : IFACE=“eth0”

#IFACE=“eth0”

Activation des logs (mettre à “true” pour activer)

LOGGING=false

NE RIEN MODIFIER APRES CETTE LIGNE (à moins de savoir ce que vous faite)

if [ -n “${IFACE}” ] ; then
IFACE="-i ${IFACE}"
fi

Récupération de la version du noyau et test si >= à 2.6.36

version=$(uname -r| cut -f1 -d"-")
major=awk -v str=$version 'BEGIN {split(str, tk, "."); print tk[1]}'
minor=awk -v str=$version 'BEGIN {split(str, tk, "."); print tk[2]}'
revis=awk -v str=$version 'BEGIN {split(str, tk, "."); print tk[3]}'

if [ $major -gt 2 ] ; then k2636=1
elif [ $major -lt 2 ] ; then k2636=0
elif [ $minor -gt 6 ] ; then k2636=1
elif [ $minor -lt 6 ] ; then k2636=0
elif [ $revis -ge 36 ] ; then k2636=1
else k2636=0
fi

— FONCTIONS

fw_start () {

Vidage

fw_clear

Parefeu - Suppression des règles

Interdictions

$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP
echo “Pare-feu - interdictions générales établies”

Loopback

$IPTABLES -t filter -A INPUT -i lo -j ACCEPT

Trafic d’entrée :

$IPTABLES -t filter -A INPUT ${IFACE} -m state --state ESTABLISHED,RELATED -j ACCEPT

Limitation de la taille et de la fréquence des pings acceptés

$IPTABLES -A INPUT ${IFACE} -p icmp --icmp-type echo-request -m limit --limit 10/second -m length --length 8:2000 -j ACCEPT

Sortie autorisée, si aucun port autorisé en sortie n’est défini

if [ -z “$REMOTE_TCP_SERVICES”] && [ -z “$REMOTE_UDP_SERVICES” ]; then
$IPTABLES -t filter -A OUTPUT -j ACCEPT
else
$IPTABLES -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Services à autoriser en sortie

for PORT in $REMOTE_TCP_SERVICES; do
$IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $REMOTE_UDP_SERVICES; do
$IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
fi

Services à autoriser en entrée

for PORT in $TCP_SERVICES; do
$IPTABLES -A INPUT ${IFACE} -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $UDP_SERVICES; do
$IPTABLES -A INPUT ${IFACE} -p udp --dport ${PORT} -j ACCEPT
done
echo “Pare-feu - Mise en place des règles”

NAT

if $ISROUTERNAT ; then
$IPTABLES -A INPUT -i $ethx -j ACCEPT
$IPTABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i $ethx -o $ethy -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
echo "Pare-feu - Routeur avec NAT : [OK]"
fi

Toutes les autres connexions sont enregistrées dans syslog (si activé)

if $LOGGING ; then
$IPTABLES -t filter -A INPUT -j LOG --log-level=4
echo "Pare-feu - Activation des logs : [OK]"
fi

}

fw_save () {
iptables-save > /etc/firewall
echo “\nPare-feu - Sauvegardé dans /etc/firewall”
}

fw_clear () {
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
if [ $k2636 -eq 1 ] ; then
$IPTABLES -t nat -P INPUT ACCEPT
fi
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
$IPTABLES -F
echo “\nPare-feu - Remise à zéro”
}

fw_status () {
$IPTABLES -L --line-numbers
}

-----------------------------------------------------------------------------

case “$1” in
start|restart)
log_daemon_msg "Starting firewall…"
fw_start
log_end_msg $?
;;
save)
log_daemon_msg "Saving firewall…"
fw_save
log_end_msg $?
;;
stop)
log_daemon_msg "Clearing firewall rules…"
fw_clear
log_end_msg $?
;;
status)
log_daemon_msg "Firewall status"
fw_status
;;
*)
log_action_msg "Usage $0 {start|save|restart|stop|status}"
exit 1
;;
esac
exit 0[/code]

Alors si, j’ai encore une point sur lequel j’aimerais travailler:

Si on fait une modification (dans les ports à ne pas bloquer par exemple) et qu’on fait en “parefeu restart”, on perd toutes les règles concernant fail2ban.

Serait-il possible que lors d’un start, ça remette tout à plat;
Et que lors d’un restart, certaines règles ne soient pas “mises à blanc” ?

Re,
Je crois avoir réussi, mais j’aimerais savoir si du point de vie de iptables ça a un sens…
Il s’agirait de ne pas tout vider, mais seulement les tables INPUT, OUTPUT et FORWARD, préservant ainsi les règles de fail2ban.
J’ai fais un test, ça a l’air de fonctionner.

[code]…
fw_clear () {

if [ $keep -eq 1 ] ; then
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
else
$IPTABLES -F
fi

case “$1” in
start)
log_daemon_msg "Starting firewall…"
keep=0
fw_start
log_end_msg $?
;;
restart)
log_daemon_msg "Relaoding firewall…"
keep=1
fw_start
log_end_msg $?
;;
…[/code]

En fait c’est plutôt “$IPTABLES -F” que je voulais que tu supprimes, pas " $IPTABLES -t filter -F".

Est-ce si grave ?
Ce qui serait plus embêtant en revanche, c’est la suppression des chaînes utilisateur (iptables -X) incluant celle de fail2ban elle-même, ce que, je le remarque à l’instant, ce script ne fait pas.
En fait il serait souhaitable de s’interroger sur l’interaction (pour ne pas dire l’interférence) entre ce script et fail2ban.

Salut,

[quote=“PascalHambourg”]En fait c’est plutôt “$IPTABLES -F” que je voulais que tu supprimes, pas " $IPTABLES -t filter -F".[/quote]Je rétabli tout de suite.

[quote=“PascalHambourg”]En fait il serait souhaitable de s’interroger sur l’interaction (pour ne pas dire l’interférence) entre ce script et fail2ban.[/quote]Oui, j’utilise les deux depuis un moment et je n’ai pas remarqué d’interférence particulière. Ce qu’il ne faut pas c’est restaurer les règles avec iptables-restore (auquel cas on se retrouve avec les règles de fail2ban en double).
C’est le gros avantage du script par rapport aux autres façons de faire (iptables-save/iptables-restore) réside d’après mon expérience.

Ce qui me gène, c’est la suppression par le script des DROP de fail2ban. Je subis chaque jour des centaines de tentatives (2500 il y a une dizaine de jours) sur mes administration Wordpress, et j’ai été amené à augmenter la durée des bans; Je pense même mettre en place une règle pour les récidivistes (bannissement d’un mois).

Mais… le script efface tous les DROP de fail2ban à chaque start ou restart, ça m’emmerde! Non pas que je redémarre tous les jours le script évidemment, mais ça m’arrive parfois.

Je me demandais donc si remplacer $IPTABLES -F par $IPTABLES -F INPUT $IPTABLES -F OUTPUT $IPTABLES -F FORWARD était la solution… (en oubliant pas évidemment -t FILTER)

Michel a très gentiment amélioré mon test pour le noyau, je poste ci-après le nouveau script.

Merci!

Le Script modifié:[quote]#!/bin/sh

BEGIN INIT INFO

Provides: parefeu

Required-Start: $local_fs

Should-Start:

Required-Stop: $local_fs

Should-Stop:

X-Start-Before: $network

X-Stop-After: $network

Default-Start: S

Default-Stop: 0 6

Short-description: Configuration du pare-feu

Description: Met en place les règles iptables (IPv4 uniquement)

END INIT INFO

— Explications

Par défaut cette configuration s’applique à toutes les interfaces réseau.

Si vous souhaitez restreindre cela à une interface donnée, dé-commentez la ligne #IFACE=“eth0”

(dans la section variables)

Par défaut, le script autorise tout en sortie. Pour changer ce comportement veuillez indiquer quels sont les ports

autorisés en sortie dans les 2 variables suivantes (Tout sera bloqué sauf les ports inscrits)

$REMOTE_TCP_SERVICES

et/ou $REMOTE_UDP_SERVICES

- Pour configurer une machine qui fasse office de routeur, changez la valeur de la

variable ISROUTERNAT à true, ET configurez les interfaces ethx et ethy selon votre configuration.

=> ethx correspond à l’interface du LAN (reliée à votre Intranet)

=> ethy correspond à l’interface WAN (reliée à Internet ou à la truc-box)

— VARIABLES

. /lib/lsb/init-functions
readonly IPTABLES=/sbin/iptables

Services que le système offrira au réseau, à séparer avec des espaces

Par défaut RIEN n’est autorisé à part le Ping.

TCP_SERVICES="“
UDP_SERVICES=”"

Services que le système utilisera du réseau

(défaut : autorise TOUT en sortie si aucun port n’est précisé)

REMOTE_TCP_SERVICES="“
REMOTE_UDP_SERVICES=”"

Pour une machine faisant office de routeur avec NAT, changez la valeur de la variable ISROUTERNAT à “true”.

ISROUTERNAT=false

ethx correspond à l’interface du LAN

ethy correspond à l’interface reliée à la truc-box (à compléter seulement si vous activez la fonction routeur)

ethx="eth1"
ethy=“eth0”

Ajustez le nom de l’interface pour restreindre le trafic entrant à cette interface particulière.

Par exemple : IFACE=“eth0”

#IFACE=“eth0”

Activation des logs (mettre à “true” pour activer)

LOGGING=false

NE RIEN MODIFIER APRES CETTE LIGNE (à moins de savoir ce que vous faite)

if [ -n “${IFACE}” ] ; then
IFACE="-i ${IFACE}"
fi

Récupération de la version du noyau et test si >= à 2.6.36

version=$(printf ‘%d%.2d%.2d\n’ $(uname -r | sed ‘s/./ /g;s/-.*//’))
if [ “${version}” -lt ‘20636’ ] ; then
k2636=0
else
k2636=1
fi

— FONCTIONS

fw_start () {

Vidage

fw_clear

Parefeu - Suppression des règles

Interdictions

$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP
echo “Pare-feu - interdictions générales établies”

Loopback

$IPTABLES -t filter -A INPUT -i lo -j ACCEPT

Trafic d’entrée :

$IPTABLES -t filter -A INPUT ${IFACE} -m state --state ESTABLISHED,RELATED -j ACCEPT

Limitation de la taille et de la fréquence des pings acceptés

$IPTABLES -A INPUT ${IFACE} -p icmp --icmp-type echo-request -m limit --limit 10/second -m length --length 8:2000 -j ACCEPT

Sortie autorisée, si aucun port autorisé en sortie n’est défini

if [ -z “$REMOTE_TCP_SERVICES”] && [ -z “$REMOTE_UDP_SERVICES” ]; then
$IPTABLES -t filter -A OUTPUT -j ACCEPT
else
$IPTABLES -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Services à autoriser en sortie

for PORT in $REMOTE_TCP_SERVICES; do
$IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $REMOTE_UDP_SERVICES; do
$IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
fi

Services à autoriser en entrée

for PORT in $TCP_SERVICES; do
$IPTABLES -A INPUT ${IFACE} -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $UDP_SERVICES; do
$IPTABLES -A INPUT ${IFACE} -p udp --dport ${PORT} -j ACCEPT
done
echo “Pare-feu - Mise en place des règles”

NAT

if $ISROUTERNAT ; then
$IPTABLES -A INPUT -i $ethx -j ACCEPT
$IPTABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i $ethx -o $ethy -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
echo "Pare-feu - Routeur avec NAT : [OK]"
fi

Toutes les autres connexions sont enregistrées dans syslog (si activé)

if $LOGGING ; then
$IPTABLES -t filter -A INPUT -j LOG --log-level=4
echo "Pare-feu - Activation des logs : [OK]"
fi

}

fw_save () {
iptables-save > /etc/firewall
echo “\nPare-feu - Sauvegardé dans /etc/firewall”
}

fw_clear () {
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
if [ $k2636 -eq 1 ] ; then
$IPTABLES -t nat -P INPUT ACCEPT
fi
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
echo “\nPare-feu - Remise à zéro”
}

fw_status () {
$IPTABLES -L --line-numbers
}

-----------------------------------------------------------------------------

case “$1” in
start|restart)
log_daemon_msg "Starting firewall…"
fw_start
log_end_msg $?
;;
save)
log_daemon_msg "Saving firewall…"
fw_save
log_end_msg $?
;;
stop)
log_daemon_msg "Clearing firewall rules…"
fw_clear
log_end_msg $?
;;
status)
log_daemon_msg "Firewall status"
fw_status
;;
*)
log_action_msg "Usage $0 {start|save|restart|stop|status}"
exit 1
;;
esac
exit 0[/quote]

Salut,
J’ai un moment, je copie/colle le script dans la page de discussion, pour ceux qui auraient encore des remarques à faire.

Ça se passe ICI