« Parefeu Simplifié » : différence entre les versions
m (→Le script) |
|||
Ligne 16 : | Ligne 16 : | ||
<code>#!/bin/sh | <code>#!/bin/sh | ||
### BEGIN INIT INFO | ### BEGIN INIT INFO | ||
# Provides: mon_parefeu | # Provides: mon_parefeu | ||
Ligne 25 : | Ligne 25 : | ||
# X-Start-Before: $network | # X-Start-Before: $network | ||
# X-Stop-After: $network | # X-Stop-After: $network | ||
# Default-Start: | # Default-Start: S | ||
# Default-Stop: 0 | # Default-Stop: 0 6 | ||
# Short-description: Configure le parefeu | # Short-description: Configure le parefeu | ||
# Description: Met en place les règles iptables. | # Description: Met en place les règles iptables. | ||
### END INIT INFO | ### END INIT INFO | ||
# Exemple de configuration de pare-feu | # Exemple de configuration de pare-feu | ||
# | # | ||
Ligne 48 : | Ligne 48 : | ||
# | # | ||
#--------------------------------------------------------------- | #--------------------------------------------------------------- | ||
readonly IPTABLES=/sbin/iptables | |||
# Services que le système offrira au réseau, à séparer avec des espaces | # 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 | # ftp : 21, ssh : 22, serveur web : 80, cups : 631, jabber : 5222 | ||
Ligne 59 : | Ligne 59 : | ||
#REMOTE_TCP_SERVICES="" | #REMOTE_TCP_SERVICES="" | ||
#REMOTE_UDP_SERVICES="" | #REMOTE_UDP_SERVICES="" | ||
if ! [ -x | if ! [ -x $IPTABLES ]; then | ||
exit 0 | exit 0 | ||
fi | fi | ||
fw_start () { | fw_start () { | ||
# Vidage | # Vidage | ||
fw_clear | |||
echo "Parefeu - Suppression des règles : [OK]" | echo "Parefeu - Suppression des règles : [OK]" | ||
# Interdictions | # Interdictions | ||
$IPTABLES -t filter -P INPUT DROP | |||
$IPTABLES -t filter -P FORWARD DROP | |||
$IPTABLES -t filter -P OUTPUT DROP | |||
echo "Parefeu - interdictions générales établies : [OK]" | echo "Parefeu - interdictions générales établies : [OK]" | ||
# Loopback | # Loopback | ||
$IPTABLES -t filter -A INPUT -i lo -j ACCEPT | |||
# Trafic d'entrée : | # Trafic d'entrée : | ||
$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
# Refus du ping | # 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 | |||
# Sortie autorisée, | # Sortie autorisée, | ||
# à commenter si seuls certains services doivent être autorisés en sortie. | # à commenter si seuls certains services doivent être autorisés en sortie. | ||
$IPTABLES -t filter -P OUTPUT ACCEPT | |||
# Services à autoriser en entrée | # Services à autoriser en entrée | ||
for PORT in $TCP_SERVICES; do | |||
$IPTABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT | |||
done | |||
for PORT in $UDP_SERVICES; do | |||
$IPTABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT | |||
done | |||
# Décommenter les lignes suivantes pour n'autoriser que certains | # Décommenter les lignes suivantes pour n'autoriser que certains | ||
# services en sortie | # services en sortie | ||
#for PORT in $REMOTE_TCP_SERVICES; do | |||
# for PORT in $REMOTE_TCP_SERVICES; do | # $IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT | ||
# | #done | ||
# done | #for PORT in $REMOTE_UDP_SERVICES; do | ||
# $IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT | |||
#done | |||
# for PORT in $REMOTE_UDP_SERVICES; do | #echo "Parefeu - Mise en place des règles : [OK]" | ||
# | |||
# done | |||
# | |||
# Décommenter les lignes après les traits | # Décommenter les lignes après les traits | ||
# pour une machine faisant office de routeur avec NAT | # pour une machine faisant office de routeur avec NAT | ||
Ligne 132 : | Ligne 117 : | ||
# ethy correspond à l'interface reliée à la truc-box | # ethy correspond à l'interface reliée à la truc-box | ||
# ------------------------------------------- | # ------------------------------------------- | ||
# | #$IPTABLES -A INPUT -i ethx -j ACCEPT | ||
# | #$IPTABLES -A INPUT -p icmp -j ACCEPT | ||
# | #$IPTABLES -A FORWARD -i ethy -o ethx -m state --state RELATED,ESTABLISHED -j ACCEPT | ||
# | #$IPTABLES -A FORWARD -o ethy -j ACCEPT | ||
# | #$IPTABLES -t nat -A POSTROUTING -o ethy -j MASQUERADE | ||
#echo "Parefeu - Routeur avec NAT : [OK]" | #echo "Parefeu - Routeur avec NAT : [OK]" | ||
# Toutes les autres connexions sont enregistrées dans syslog | # 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 | |||
echo "Parefeu - Logging : [OK]" | echo "Parefeu - Logging : [OK]" | ||
} | } | ||
fw_stop () { | fw_stop () { | ||
$IPTABLES -F | |||
$IPTABLES -t nat -F | |||
$IPTABLES -t mangle -F | |||
$IPTABLES -P INPUT DROP | |||
$IPTABLES -P FORWARD DROP | |||
$IPTABLES -P OUTPUT ACCEPT | |||
} | } | ||
fw_clear () { | 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 | |||
$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 () { | fw_status () { | ||
$IPTABLES -L --line-numbers | |||
} | } | ||
case "$1" in | case "$1" in | ||
start|restart) | start|restart) | ||
Ligne 209 : | Ligne 194 : | ||
esac | esac | ||
exit 0 | exit 0 | ||
</code> | </code> | ||
Version du 28 août 2011 à 16:55
Introduction
La méthode proposée ici pose parfois souci lors d'un changement de version du noyau, qui ne comprend pas les règles enregistrées avec iptables-save comme il faut.
Dans la suite, vous trouverez un script permettant d'établir les règles à chaque démarrage. De plus, ce script ajoute par défaut un enregistrement des erreurs dans les logs, ce qui facilite la surveillance avec logwatch par exemple. Si à l'avenir vous souhaitez ajoutez ou supprimer certaines règles, vous verrez que le script est construit de façon à faciliter ce genre d'opération.
Installation du Pare-feu
Attention, les commandes suivantes sont à éxécuter avec les droits superutilisateur Copiez-collez le script suivant dans /etc/init.d/mon_parefeu. Ensuite, rendez ce script éxécutable :
chmod +x /etc/init.d/mon_parefeu
Puis activer le chargement du script au démarrage :
insserv mon_parefeu
Le script
#!/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
- Exemple de configuration de pare-feu
- Défauts :
- - Cette configuration s'applique à toutes les interfaces réseau.
- Si vous voulez restreindre cela à une interface donnée,
- utilisez '-i INTERFACE' dans les appels iptables.
- - Par défaut, le script autorise tout en sortie. Pour changer ce comportement
- veuillez commenter la ligne /sbin/iptables -t filter -P OUTPUT ACCEPT
- et décommenter les lignes #REMOTE_TCP_SERVICES=""
- #REMOTE_UDP_SERVICES=""
- ainsi que les blocs suivant : #if [ -n "$REMOTE_TCP_SERVICES" ] ; then
- et #if [ -n "$REMOTE_UDP_SERVICES" ] ; then
- description: Active/Désactive le pare-feu au démarrage
- ---------------------------------------------------------------
readonly IPTABLES=/sbin/iptables
- 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écommenter ces lignes pour limiter les services en sortie (défaut : autorise tout en sortie)
- REMOTE_TCP_SERVICES=""
- REMOTE_UDP_SERVICES=""
if ! [ -x $IPTABLES ]; then
exit 0
fi
fw_start () {
- Vidage
fw_clear
echo "Parefeu - Suppression des règles : [OK]"
- Interdictions
$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP
echo "Parefeu - interdictions générales établies : [OK]"
- Loopback
$IPTABLES -t filter -A INPUT -i lo -j ACCEPT
- Trafic d'entrée :
$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 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
- Sortie autorisée,
- à commenter si seuls certains services doivent être autorisés en sortie.
$IPTABLES -t filter -P OUTPUT ACCEPT
- Services à autoriser en entrée
for PORT in $TCP_SERVICES; do
$IPTABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $UDP_SERVICES; do
$IPTABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
- Décommenter les lignes suivantes pour n'autoriser que certains
- services 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
#echo "Parefeu - Mise en place des règles : [OK]"
- Décommenter les lignes après les traits
- pour une machine faisant office de routeur avec NAT
- ethx correspond à l'interface du LAN
- ethy correspond à l'interface reliée à la truc-box
- -------------------------------------------
#$IPTABLES -A INPUT -i ethx -j ACCEPT
#$IPTABLES -A INPUT -p icmp -j ACCEPT
#$IPTABLES -A FORWARD -i ethy -o ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
#$IPTABLES -A FORWARD -o ethy -j ACCEPT
#$IPTABLES -t nat -A POSTROUTING -o ethy -j MASQUERADE
#echo "Parefeu - Routeur avec NAT : [OK]"
- 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
echo "Parefeu - Logging : [OK]"
}
fw_stop () {
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
}
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
$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)
echo "Starting firewall.."
fw_stop
fw_start
echo "done."
;;
stop)
echo "Stopping firewall.."
fw_stop
echo "done."
;;
clean)
echo "Clearing firewall rules.."
fw_clear
echo "done."
;;
status)
echo "Firewall status"
fw_status
;;
*)
echo "Usage: $0 {start|stop|restart|clean|status}"
exit 1
;;
esac
exit 0
Ouvrir des ports
Pour cela, il vous suffit d'ajouter le numéro des ports à ouvrir, séparés par des espaces, entre les guillemets :
TCP_SERVICES=""
S'il s'agit de ports tcp, et dans
UDP_SERVICES=""
Si ce sont des ports UDP Pour trouver le numéro des ports, la commande suivante peut vous être utile :
less /etc/services
Autoriser au cas par cas en sortie
Il faut commenter la ligne :
/sbin/iptables -t filter -P OUTPUT ACCEPT
et décommenter ces lignes :
#REMOTE_TCP_SERVICES="" #REMOTE_UDP_SERVICES=""
Complétez entre les guillements les ports à ouvrir en sortie. Enfin, décommentez ces blocs :
#if [ -n "$REMOTE_TCP_SERVICES" ] ; then # for PORT in $REMOTE_TCP_SERVICES; do # /sbin/iptables -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT # done #fi #if [ -n "$REMOTE_UDP_SERVICES" ] ; then # for PORT in $REMOTE_UDP_SERVICES; do # /sbin/iptables -A OUTPUT -p udp --dport ${PORT} -j ACCEPT # done #fi
Cas d'une machine routeur avec NAT
Il va falloir décommenter ces lignes :
#/sbin/iptables -A INPUT -i ethx -j ACCEPT #/sbin/iptables -A INPUT -p icmp -j ACCEPT #/sbin/iptables -A FORWARD -i ethy -o ethx -m state --state RELATED,ESTABLISHED -j ACCEPT #/sbin/iptables -A FORWARD -o ethy -j ACCEPT #/sbin/iptables -t nat -A POSTROUTING -o ethy -j MASQUERADE #echo "Parefeu - Routeur avec NAT : [OK]"
En remplaçant ethx qui correspond à l'interface du LAN et ethy qui correspond à l'interface reliée à la truc-box