« Parefeu Simplifié » : différence entre les versions

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Ligne 9 : Ligne 9 :
''' Attention, les commandes suivantes sont à exécuter avec les droits superutilisateur'''
''' Attention, les commandes suivantes sont à exécuter avec les droits superutilisateur'''
Copiez-collez le script suivant dans /etc/init.d/mon_parefeu.
Copiez-collez le script suivant dans /etc/init.d/mon_parefeu.
Ensuite, rendez ce script éxécutable :  
Ensuite, rendez ce script exécutable :  
  chmod +x /etc/init.d/mon_parefeu
  chmod +x /etc/init.d/mon_parefeu
Puis activer le chargement du script au démarrage :  
Puis activer le chargement du script au démarrage :  
Ligne 71 : Ligne 71 :


# Pour une machine faisant office de routeur avec NAT,
# Pour une machine faisant office de routeur avec NAT,
# changer la valeur de la variable ISROUTERNAT à 1.
# changer la valeur de la variable ISROUTERNAT à true.
ISROUTERNAT=false
ISROUTERNAT=false
# ethx correspond à l'interface du LAN
# ethx correspond à l'interface du LAN
Ligne 296 : Ligne 296 :
      
      
     # Pour une machine faisant office de routeur avec NAT,
     # Pour une machine faisant office de routeur avec NAT,
     # changer la valeur de la variable ISROUTERNAT à 1.
     # changer la valeur de la variable ISROUTERNAT à true.
     ISROUTERNAT=false
     ISROUTERNAT=false
     # ethx correspond à l'interface du LAN
     # ethx correspond à l'interface du LAN

Version du 28 août 2013 à 14:39

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 à exécuter avec les droits superutilisateur Copiez-collez le script suivant dans /etc/init.d/mon_parefeu. Ensuite, rendez ce script exécutable :

chmod +x /etc/init.d/mon_parefeu

Puis activer le chargement du script au démarrage :

insserv mon_parefeu

Le script

#!/bin/sh

      1. BEGIN INIT INFO
  1. Provides: mon_parefeu
  2. Required-Start: $local_fs
  3. Should-Start:
  4. Required-Stop: $local_fs
  5. Should-Stop:
  6. X-Start-Before: $network
  7. X-Stop-After: $network
  8. Default-Start: S
  9. Default-Stop: 0 6
  10. Short-description: Configure le parefeu
  11. Description: Met en place les règles iptables.
      1. END INIT INFO
  1. ------------------------Explications----------------------------------#
  2. Défauts :
  3. - Cette configuration s'applique à toutes les interfaces réseau.
  4. Si vous voulez restreindre cela à une interface donnée,
  5. utilisez '-i INTERFACE' dans la variables $IPTABLES.
  6. - Par défaut, le script autorise tout en sortie.
  7. Pour changer ce comportement veuillez indiquer les numéros
  8. de port en question dans les variables
  9. $REMOTE_TCP_SERVICES
  10. et/ou $REMOTE_UDP_SERVICES
  11. - Pour configurer une machine routeur,
  12. changez la valeur de la variable
  13. ISROUTERNAT à true, ainsi que
  14. les interfaces ethx et ethy selon votre configuration
  15. ethx correspond à l'interface du LAN
  16. ethy correspond à l'interface reliée à la truc-box
  17. description: Active/Désactive le pare-feu au démarrage
  18. ----------------------------------------------------------------------#
  1. ------------------------VARIABLES-------------------------------------#

readonly IPTABLES=/sbin/iptables

. /lib/lsb/init-functions

  1. Services que le système offrira au réseau, à séparer avec des espaces
  2. ftp : 21, ssh : 22, serveur web : 80, cups : 631, jabber : 5222

TCP_SERVICES="" UDP_SERVICES=""

  1. Services que le système utilisera du réseau
  2. (défaut : autorise tout en sortie)

REMOTE_TCP_SERVICES="" REMOTE_UDP_SERVICES=""

  1. Pour une machine faisant office de routeur avec NAT,
  2. changer la valeur de la variable ISROUTERNAT à true.

ISROUTERNAT=false

  1. ethx correspond à l'interface du LAN
  2. ethy correspond à l'interface reliée à la truc-box

ethx="eth1" ethy="eth0"

  1. ----------------------------------------------------------------------#

if ! [ -x $IPTABLES ]; then exit 0 fi

  1. ----------------------------FONCTIONS---------------------------------#

fw_start () {

  1. Vidage

fw_clear # Parefeu - Suppression des règles

  1. 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

  1. Loopback

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

  1. Trafic d'entrée :

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

  1. 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

  1. 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

  1. 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

  1. 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 # Parefeu - Mise en place des règles

if $ISROUTERNAT ; then $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

		# Parefeu - Routeur avec NAT

fi

  1. 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_stop () { #$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 $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 }

  1. ----------------------------------------------------------------------#

case "$1" in start|restart) log_daemon_msg "Starting firewall.."

		fw_start

log_end_msg $?

	;;

stop) log_daemon_msg "Stopping firewall.."

		fw_stop

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|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

Complétez entre les guillemets les ports à ouvrir en sortie :

REMOTE_TCP_SERVICES="" 
REMOTE_UDP_SERVICES=""

Cas d'une machine routeur avec NAT

Il va falloir décommenter ces lignes : (OBSOLETE voir ISROUTERNAT)

#/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

Le script (avec support ipv6)

Attention, la version de ce script est encore en travaux, tant qu'elle n'est pas validée par personne compétente.

   #!/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,
   #   utilisez '-i INTERFACE' dans la variables $IPTABLES.
   #
   # - 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
   #
   #----------------------------------------------------------------------#
   
   . /lib/lsb/init-functions
   
   #------------------------VARIABLES-------------------------------------#
   # Mettre à 1 si vous utilisez IPV6 : 
   IPV6=0
   # 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"
   
   # Chemins vers iptables
   readonly IPTABLES=/sbin/iptables
   readonly IP6TABLES=/sbin/ip6tables
   #----------------------------------------------------------------------#
   
   if ! [ -x $IPTABLES ]; then
       exit 0
   fi
   
   if [ $IPV6 -eq 1 ]; then
       if ! [ -x $IP6TABLES ]; then
           exit 0
       fi
   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 -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, 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
        
   # 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
        
   # 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
       # Parefeu - Mise en place des règles
        
       if $ISROUTERNAT ; then
           $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
           # Parefeu - Routeur avec NAT
       fi
        
   # Toutes les autres connexions sont enregistrées dans syslog
       $IPTABLES -t filter -A INPUT -j LOG --log-level=4
   
   # Configuration IPV6 
       if [ $IPV6 -eq 1 ]; then
       # Interdictions
           $IP6TABLES -t filter -P INPUT DROP
           $IP6TABLES -t filter -P FORWARD DROP
           $IP6TABLES -t filter -P OUTPUT DROP
            
       # Loopback
           $IP6TABLES -t filter -A INPUT -i lo -j ACCEPT
            
       # Trafic d'entrée :
           $IP6TABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
            
       # Refus du ping pour éviter de répondre aux scans des éventuels vilains
           $IP6TABLES -t filter -A INPUT -p icmp -j LOG
           $IP6TABLES -t filter -A INPUT -p icmp -j DROP
            
       # Sortie autorisée, si aucun port autorisé en sortie n'est défini
               if [ -z "$REMOTE_TCP_SERVICES"] && [ -z "$REMOTE_UDP_SERVICES" ]; then
                   $IP6TABLES -t filter -P OUTPUT ACCEPT
               fi
            
       # Services à autoriser en entrée
           for PORT in $TCP_SERVICES; do
               $IP6TABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT
           done
            
           for PORT in $UDP_SERVICES; do
               $IP6TABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT
           done
            
       # Services à autoriser en sortie
        
           for PORT in $REMOTE_TCP_SERVICES; do
               $IP6TABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
           done
           for PORT in $REMOTE_UDP_SERVICES; do
               $IP6TABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
           done
           # Parefeu - Mise en place des règles
        
           if $ISROUTERNAT ; then
               $IP6TABLES -A INPUT -i $ethx -j ACCEPT
               $IP6TABLES -A INPUT -p icmp -j ACCEPT
               $IP6TABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
               $IP6TABLES -A FORWARD -o $ethy -j ACCEPT
               $IP6TABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
               $IP6TABLES -A INPUT -p icmpv6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT
               $IP6TABLES -A OUTPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
           fi
            
           # Pour toute interface de type broadcast
           $IP6TABLES -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT
           $IP6TABLES -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT
           $IP6TABLES -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
           $IP6TABLES -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
   
   
       # Toutes les autres connexions sont enregistrées dans syslog
           $IP6TABLES -t filter -A INPUT -j LOG --log-level=4
       fi
   }
   
   fw_stop () {
       #$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
       $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
       if [ $IPV6 -eq 1 ]; then
           $IP6TABLES -t filter -F
           $IP6TABLES -t nat -F
           $IP6TABLES -t mangle -F
           $IP6TABLES -t raw -F
           $IP6TABLES -t filter -P INPUT ACCEPT
           $IP6TABLES -t filter -P OUTPUT ACCEPT
           $IP6TABLES -t filter -P FORWARD ACCEPT
           $IP6TABLES -t nat -P PREROUTING ACCEPT
           $IP6TABLES -t nat -P POSTROUTING ACCEPT
           $IP6TABLES -t nat -P OUTPUT ACCEPT
           $IP6TABLES -t mangle -P PREROUTING ACCEPT
           $IP6TABLES -t mangle -P OUTPUT ACCEPT
           $IP6TABLES -t mangle -P POSTROUTING ACCEPT
           $IP6TABLES -t mangle -P FORWARD ACCEPT
           $IP6TABLES -t mangle -P INPUT ACCEPT
           $IP6TABLES -t raw -P OUTPUT ACCEPT
           $IP6TABLES -t raw -P PREROUTING ACCEPT
           $IP6TABLES -F
       fi
   }
   
   fw_status () {
       $IPTABLES -L --line-numbers
       if [ $IPV6 -eq 1 ]; then
           $IP6TABLES -L --line-numbers
       fi
   }
   
   #----------------------------------------------------------------------#
   
   case "$1" in
       start|restart)
           log_daemon_msg "Starting firewall.."
           fw_start
           log_end_msg $?
       ;;
       stop)
           log_daemon_msg "Stopping firewall.."
           fw_stop
           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|stop|restart|clean|status}"
           exit 1
       ;;
   esac
   exit 0

Ressources