Salut,
Suite aux remarques de PascalHambourg, j’ai (péniblement) fais quelques modifications sur le script de pare-feu simplifié qui se trouve sur le Wiki.
#!/bin/sh
### BEGIN INIT INFO
# Provides: mon_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: Configure le parefeu
# Description: Met en place les règles iptables.
### END INIT INFO
#------------------------Explications----------------------------------#
#
# Défauts :
# - Cette configuration s'applique à toutes les interfaces réseau.
# Si vous voulez restreindre cela à une interface donnée,
# décommentez la ligne suivante #IFACE="-i eth0"
#
# - Par défaut, le script autorise tout en sortie.
# Pour changer ce comportement veuillez indiquer les numéros
# de port en question dans les variables
# $REMOTE_TCP_SERVICES
# et/ou $REMOTE_UDP_SERVICES
#
# - Pour configurer une machine routeur,
# changez la valeur de la variable
# ISROUTERNAT à true, ainsi que
# les interfaces ethx et ethy selon votre configuration
# ethx correspond à l'interface du LAN
# ethy correspond à l'interface reliée à la truc-box
#
# description: Active/Désactive le pare-feu au démarrage
#
#------------------------VARIABLES-------------------------------------#
readonly IPTABLES=/sbin/iptables
. /lib/lsb/init-functions
# Services que le système offrira au réseau, à séparer avec des espaces
# ftp : 21, ssh : 22, serveur web : 80, cups : 631, jabber : 5222
TCP_SERVICES=""
UDP_SERVICES=""
# Services que le système utilisera du réseau
# (défaut : autorise tout en sortie)
REMOTE_TCP_SERVICES=""
REMOTE_UDP_SERVICES=""
# Pour une machine faisant office de routeur avec NAT, changer la valeur de la variable ISROUTERNAT à "true".
ISROUTERNAT=false
# ethx correspond à l'interface du LAN
# ethy correspond à l'interface reliée à la truc-box
ethx="eth1"
ethy="eth0"
# Décommentez la ligne suivante et ajustez le nom de l'interface pour restreindre le trafic entrant à cette interface particulière.
#IFACE="-i eth0"
#----------------------------------------------------------------------#
if ! [ -x $IPTABLES ]; then
exit 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
# Parefeu - 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
# 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
# Parefeu - Routeur avec NAT
fi
# Toutes les autres connexions sont enregistrées dans syslog
#$IPTABLES -t filter -A OUTPUT -j LOG
$IPTABLES -t filter -A INPUT -j LOG --log-level=4
# Parefeu - Logging
}
fw_save () {
#$IPTABLES -F
#$IPTABLES -t nat -F
#$IPTABLES -t mangle -F
#$IPTABLES -P INPUT DROP
#$IPTABLES -P FORWARD DROP
#$IPTABLES -P OUTPUT ACCEPT
iptables-save > /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
# Décommentez si votre noyau est > à 2.6.36
# $IPTABLES -t nat -P INTPUT ACCEPT
$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
}
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 $?
;;
clean)
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|clean|status}"
exit 1
;;
esac
exit 0
Il reste au moins 2 choses que je n’arrive pas à faire:
- Tester la version du noyau (si c’est > 2.6.36 appliquer la règle suivante: $IPTABLES -t nat -P INTPUT ACCEPT
Mais je ne m’en sors pas… Je n’arrive à sortir que les 3 premier chiffres de la version du noyau…
kver=$(uname -r|cut -d\- -f1|tr -d '.'| tr -d '[A-Z][a-z]')
if [ 263 -ge $kver ] ; then
echo "Kernel < 2.6.36"
else
echo "Kernel > 2.6.36"
fi
- ici:
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
$IPTABLES -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
PascalHambourg me propose d’utiliser else, mais je ne vois pas ou…
En passant je proposerais bien de supprimer le “logging” (ou au moins le commenter par défaut) ça remplit des lignes et des lignes pour pas grand chose… Qui regarde ses logs iptables en permanence?