Discussion:Parefeu Simplifié
Je propose les modifications suivantes sur le script IPv4.
- éxécutable -> exécutable
# - Cette configuration s'applique à toutes les interfaces réseau. # Si vous voulez restreindre cela à une interface donnée, # utilisez '-i INTERFACE' dans la variables $IPTABLES.
- mauvaise façon de faire ; il vaudrait mieux définir une autre variable insérée dans les règles.
- ça ferait échouer le test [ -x $IPTABLES ]
- ça provoquerait une erreur avec les commandes qui n'attendent pas d'option -i (-P, -A OUTPUT...) ou qui ont déjà une option -i (loopback, routeur NAT)
# changer la valeur de la variable ISROUTERNAT à 1.
plutôt à "true", sinon le test "if $ISROUTERNAT" provoquera une erreur ("1" n'est pas une commande)
# Refus du ping pour éviter de répondre aux scans des éventuels vilains $IPTABLES -t filter -A INPUT -p icmp -j LOG $IPTABLES -t filter -A INPUT -p icmp -j DROP
- ping != icmp
- ping = icmp type 8
- le ping, ça peut être utile. En plus, franchement, les scans...
# 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 -P OUTPUT ACCEPT fi
- AMA il serait plus propre de créer une règle plutôt que modifier la politique par défaut
- utiliser else pour l'exécution conditionnelle du bloc qui suit
# 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
et ajouter une règle pour le suivi de connexion des paquets sortants comme dans INPUT, sinon les réponses aux paquets entrants sont bloquées.
$IPTABLES -A INPUT -p icmp -j ACCEPT
pourquoi cette règle, quel rapport avec la fonction routeur NAT ?
$IPTABLES -A FORWARD -o $ethy -j ACCEPT
ajouter "-i $ethx" sinon le routeur laisse passer les paquets venant de n'importe où et pas seulement du LAN
fw_stop () {
cette fonction ne fait pas ce que son nom dit : elle enregistre le jeu de règles actif dans un fichier au lieu d'arrêter quoi que ce soit.
$IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT
ajouter la nouvelle chaîne INPUT si noyau >= 2.6.36
PascalHambourg (discussion) 14 août 2013 à 10:59 (CEST)
Proposition de script modifié
Salut, Voici le script après intégration des remarques de PascalHambourg:
- !/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
Lol (discussion) 5 septembre 2013 à 09:33 (CEST)