Discussion:Parefeu Simplifié

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

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:

  1. !/bin/sh
      1. BEGIN INIT INFO
  1. Provides: 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: Configuration du pare-feu
  11. Description: Met en place les règles iptables (IPv4 uniquement)
      1. END INIT INFO
      1. --- Explications
  1. Par défaut cette configuration s'applique à toutes les interfaces réseau.
  2. Si vous souhaitez restreindre cela à une interface donnée, dé-commentez la ligne #IFACE="eth0"
  3. (dans la section variables)
  4. Par défaut, le script autorise tout en sortie. Pour changer ce comportement veuillez indiquer quels sont les ports
  5. autorisés en sortie dans les 2 variables suivantes (Tout sera bloqué sauf les ports inscrits)
  6. $REMOTE_TCP_SERVICES
  7. et/ou $REMOTE_UDP_SERVICES
  8. - Pour configurer une machine qui fasse office de routeur, changez la valeur de la
  9. variable ISROUTERNAT à true, ET configurez les interfaces ethx et ethy selon votre configuration.
  10. => ethx correspond à l'interface du LAN (reliée à votre Intranet)
  11. => ethy correspond à l'interface WAN (reliée à Internet ou à la truc-box)
      1. --- VARIABLES

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

  1. Services que le système offrira au réseau, à séparer avec des espaces
  2. Par défaut RIEN n'est autorisé à part le Ping.

TCP_SERVICES="" UDP_SERVICES=""

  1. Services que le système utilisera du réseau
  2. (défaut : autorise TOUT en sortie si aucun port n'est précisé)

REMOTE_TCP_SERVICES="" REMOTE_UDP_SERVICES=""

  1. Pour une machine faisant office de routeur avec NAT, changez 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 (à compléter seulement si vous activez la fonction routeur)

ethx="eth1" ethy="eth0"

  1. Ajustez le nom de l'interface pour restreindre le trafic entrant à cette interface particulière.
  2. Par exemple : IFACE="eth0"
  3. IFACE="eth0"
  4. Activation des logs (mettre à "true" pour activer)

LOGGING=false

      1. NE RIEN MODIFIER APRES CETTE LIGNE (à moins de savoir ce que vous faite)
  if [ -n "${IFACE}" ] ; then
  IFACE="-i ${IFACE}"
  fi
  1. 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

      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
  echo "Pare-feu - 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 ${IFACE} -m state --state ESTABLISHED,RELATED -j ACCEPT
  1. 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
  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 -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
  1. 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"
  1. 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
  1. 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

}

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

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)