Outils personnels

Scripts FIREWALL : Différence entre versions

De wikiGite

(Script simple (une seule interface, sécurisation d'un serveur sur internet par exemple))
(Script simple (une seule interface, sécurisation d'un serveur sur internet par exemple))
Ligne 263 : Ligne 263 :
 
  # --- notamment ajouter une notion de protocole en + des ports
 
  # --- notamment ajouter une notion de protocole en + des ports
 
   
 
   
 +
# --------------------- VARIABLES -----------------------------
 
  # Variables globales
 
  # Variables globales
 
  # Note : laisser au moins un port dans chaque variable sinon le script peut planter (ex : TCP 22 et UDP 111)
 
  # Note : laisser au moins un port dans chaque variable sinon le script peut planter (ex : TCP 22 et UDP 111)
Ligne 286 : Ligne 287 :
 
  UNPRIVPORTS="1024:65535"
 
  UNPRIVPORTS="1024:65535"
 
   
 
   
 +
# ---------------- DEBUT DU SCRIPT -----------------------------
 
  fw_start() {
 
  fw_start() {
 
  # Quelques ajustements néssaires
 
  # Quelques ajustements néssaires

Version du 7 juillet 2011 à 10:10

Debian

ATTENTION : exemple paramétré pour 2 interfaces, et avec des règles additionnelles

#!/bin/bash

# fichier de configuration IPtables
# protection d'un serveur NON PASSERELLE (pas de FORWARD)
# (c) 2007 Frank SOYER

# Pour autoriser un port sur la machine locale, simplement l'ajouter aux deux
# premières variables globales
# Attention à bien paramétrer les noms d'interfaces, les plages réseaux...
# ET VISITER LA SECTION "AUTORISATION SPECIALES"

# Variables globales
TCP_PORTS="22 53 8333 902 443"
UDP_PORTS="53 123"
IFEXT=eth0
EXTERNAL_IP="82.138.98.132"
EXTERNAL_NET=""
# Laisser IFINT vide ("IFINT=") s'il n'y a qu'une interface
IFINT=eth1
INTERNAL_IP="192.168.1.252"
INTERNAL_NET="192.168.1.0/24"
IPTABLES=/sbin/iptables
LOGLEVEL="warning"

# Quelques variables qui peuvent etre utiles
ANYWHERE="0.0.0.0/0"
PRIVPORTS="0:1023"
UNPRIVPORTS="1024:65535"

fw_start() {
# Quelques ajustements nécessaires
# Use rp_filter values to drop connections from non-routable IPs
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > $i
done
# les ICMP echo request sont gérées par netfilter
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Add synflood protection (mettre à 0 si le serveur est très chargé niveau réseau)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Log martians (martian = packet with invalide source or destination address)
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# Don't accept ICMP redirect messages (pas nécessaire si réseau bien paramétré)
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Disable ICMP send_redirect
for interface in /proc/sys/net/ipv4/conf/*/send_redirects; do
    echo 0 > $interface
done
# Don't accept source routed packets
for interface in /proc/sys/net/ipv4/conf/*/accept_source_route; do
    echo 0 > $interface
done
# ICMP Broadcasting protection (smurf amplifier protection)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# ICMP Dead Error Messages protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Increase the default queuelength. (Kernel Default: 1024)
if [ -e /proc/sys/net/ipv4/ip_queue_maxlen ]
then
   echo 2048 > /proc/sys/net/ipv4/ip_queue_maxlen
fi

# Les règles elles-mêmes
# Nous vidons toutes les chaines
$IPTABLES -F
# Nous supprimons les chaines non standards
$IPTABLES -X
# Par defaut tout est mis a la poubelle
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Creation d'une chaine vérifiant la validité des paquets
$IPTABLES -N VALID_CHK

# Creation d'une chaine pour les LOG
$IPTABLES -N LOGDROP

# L'interface locale est sure
$IPTABLES -A INPUT  -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# Enregistrement des stats IP pour Munin
iptables -A INPUT -d $INTERNAL_IP
iptables -A OUTPUT -s $INTERNAL_IP
iptables -A INPUT -d $EXTERNAL_IP
iptables -A OUTPUT -s $EXTERNAL_IP

# On accepte les liaisons Internet->localhost deja etablies
$IPTABLES -A  INPUT -i $IFEXT -m state --state ESTABLISHED,RELATED -j ACCEPT
# On accepte TOUTES les liaisons reseau interne->localhost s'il y a une interface dédiée LAN
if [ -n $IFINT ]
then
   $IPTABLES -A  INPUT -i $IFINT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
fi
# On autorise toutes les liaisons locahost->Internet (on ouvre tout en sortie)
$IPTABLES -A OUTPUT -o $IFEXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
if [ -n $IFINT ]
then
   $IPTABLES -A OUTPUT -o $IFINT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
fi

# AUTORISATIONS SPECIALES
# Autorise la surveillance du serveur par ping à partir d'un adresse définie
# (dupliquer cette ligne si plusieurs adresses doivent être autorisées sur une ou plusieurs interfaces)
$IPTABLES -A INPUT -i $IFEXT -p icmp -j ACCEPT
$IPTABLES -A INPUT -i $IFINT -p icmp -j ACCEPT
$IPTABLES -A INPUT -i $IFINT -m state --state NEW -p tcp --source 192.168.1.250 --dport 22 -j ACCEPT
# Autorise la connexion a munin-node à partir d'un serveur munin central
$IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p tcp --source 82.138.98.130 --dport 4949 -j ACCEPT

# Maintenant on protège !
#
# Ignore les paquets provenant de l'extérieur avec une adresse non routable sur Internet (spoofing)
# Déjà pris en charge par rp_filter, mais pourquoi pas une ceinture en plus des bretelles ?
$IPTABLES -A INPUT -i $IFEXT -s 10.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 172.16.0.0/12 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 192.168.0.0/16 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 224.0.0.0/4 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 240.0.0.0/5 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 169.254.0.0/16 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 127.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 0.0.0.0 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 255.255.255.255 -j DROP

# Drop (NMAP) scan packets:
# (NMAP) FIN/URG/PSH
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN,URG,PSH \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# SYN/RST/ACK/FIN/URG
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS-PSH scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# ALL/ALL
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL ALL \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS-ALL scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL ALL -j DROP
# NMAP FIN Stealth
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth FIN scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN -j DROP
# SYN/RST
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,RST SYN,RST \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth SYN/RST scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN/FIN (probably)
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,FIN SYN,FIN \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth SYN/FIN scan(?): "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Null scan
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL NONE \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth Null scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL NONE -j DROP
# Drop packets with bad tcp flags
$IPTABLES -A VALID_CHK -p tcp --tcp-option 64 \
-m limit --limit 3/m --limit-burst 1 -j LOG --log-level $LOGLEVEL --log-prefix "Bad TCP flag(64): "
$IPTABLES -A VALID_CHK -p tcp --tcp-option 64 -j DROP
$IPTABLES -A VALID_CHK -p tcp --tcp-option 128 \
-m limit --limit 3/m --limit-burst 1 -j LOG --log-level $LOGLEVEL --log-prefix "Bad TCP flag(128): "
$IPTABLES -A VALID_CHK -p tcp --tcp-option 128 -j DROP
# Drop invalid packets
$IPTABLES -A VALID_CHK -p tcp -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID TCP: "
$IPTABLES -A VALID_CHK -p udp -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID UDP: "
$IPTABLES -A VALID_CHK -p icmp --icmp-type echo-request -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID ICMP-request: "
$IPTABLES -A VALID_CHK -p icmp ! --icmp-type echo-request -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID ICMP-other: "
$IPTABLES -A VALID_CHK -m state --state INVALID -j DROP
# Drop fragmented packets
$IPTABLES -A VALID_CHK -f -m limit --limit 3/m --limit-burst 1 -j LOG --log-prefix "Fragmented packet: "
$IPTABLES -A VALID_CHK -f -j DROP
# Drop uncluan packets
#$IPTABLES -A VALID_CHK -m unclean -m limit --limit 10/minute -j LOG --log-prefix "UNCLEAN: "
#$IPTABLES -A VALID_CHK -m unclean -j DROP

# Finalement, on passe le paquet à VALID_CHK à partir d'INPUT, qui le récupèrera s'il n'est pas jeté
$IPTABLES -A INPUT -j VALID_CHK

# OUVERTURE DE PORTS (EXTERIEUR -> LOCALHOST)
for tcp_port in $TCP_PORTS
do
   $IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p tcp --dport $tcp_port -j ACCEPT
done

for udp_port in $UDP_PORTS
do
   $IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p udp --dport $udp_port -j ACCEPT
done

# Log les paquets rejetes. Niveau par defaut : warning
# $IPTABLES -A INPUT -j LOG --log-level emerg --log-prefix='[FW] '
$IPTABLES -A LOGDROP -j LOG --log-prefix='[FW] '
$IPTABLES -A INPUT -j LOGDROP

}

fw_stop() {
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -P INPUT ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT ACCEPT

  $IPTABLES -t nat -F
  $IPTABLES -t nat -X

  $IPTABLES -t mangle -F
  $IPTABLES -t mangle -X

echo " ATTENTION! Firewall désactivé..."

}

fw_restart() {
  fw_stop
  sleep 2
  fw_start

}

case "$1" in
   'start')
      fw_start
      ;;
   'stop')
      fw_stop
      ;;
   'restart')
      fw_restart
      ;;
   'status')
      echo ">>> filter table"
      $IPTABLES -L
      echo -e "\n>>> nat table"
      $IPTABLES -t nat -L
      echo -e "\n>>>mangle table"
      $IPTABLES -t mangle -L
      ;;
   *)
      echo "Usage: firewall {start|stop|restart|status}"
esac
# Fin du fichier

CentOS

Script simple (une seule interface, sécurisation d'un serveur sur internet par exemple)

#!/bin/bash
#
# fichier de configuration IPtables
# protection d'un serveur NON PASSERELLE (pas de FORWARD)
# (c) 2007-2010 FSo
# chkconfig: 2345 61 39
# description: Firewall iptables
#
# Pour autoriser un port sur la machine locale, simplement l'ajouter a TCP_PORTS et/ou UDP_PORTS
# pour filtrer les IP entrantes, ajouter les adresses autorisees dans INGOING
# Attention a bien parametrer les noms d'interfaces, les plages reseaux...
# TODO :
# - Mettre les variables dans un conf
# --- notamment ajouter une notion de protocole en + des ports

# --------------------- VARIABLES -----------------------------
# Variables globales
# Note : laisser au moins un port dans chaque variable sinon le script peut planter (ex : TCP 22 et UDP 111)
# Les ports listes ici seront ouverts
TCP_PORTS="22 20 21 80 443"
UDP_PORTS=""
# INGOING="0.0.0.0/0.0.0.0"  si toutes les IP externes sont autorisees (uniquement fermeture des ports non utilises)
# sinon y lister seulement les IP autorisees separees par des espaces
# pour une plage d'IP ajouter le masque, exemple "192.168.1.0/24"
# INGOING="192.168.1.112 10.0.0.1 172.16.0.0/16"
INGOING="0.0.0.0/0.0.0.0"
#
IFEXT=eth0
EXTERNAL_IP="87.98.154.124"
EXTERNAL_NET="87.98.154.0"
#
IPTABLES=/sbin/iptables
LOGLEVEL="warning"

# Quelques variables qui peuvent etre utiles
ANYWHERE="0.0.0.0/0"
PRIVPORTS="0:1023"
UNPRIVPORTS="1024:65535"

# ---------------- DEBUT DU SCRIPT -----------------------------
fw_start() {
# Quelques ajustements néssaires
# Use rp_filter values to drop connections from non-routable IPs
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > $i
done
# les ICMP echo request sont gées par netfilter
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Add synflood protection (mettre à si le serveur est trèchargéiveau réau)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Log martians (martian = packet with invalide source or destination address)
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# Don't accept ICMP redirect messages (pas néssaire si réau bien paramééecho 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Disable ICMP send_redirect
for interface in /proc/sys/net/ipv4/conf/*/send_redirects; do
    echo 0 > $interface
done
# Don't accept source routed packets
for interface in /proc/sys/net/ipv4/conf/*/accept_source_route; do
    echo 0 > $interface
done
# ICMP Broadcasting protection (smurf amplifier protection)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# ICMP Dead Error Messages protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Increase the default queuelength. (Kernel Default: 1024)
if [ -e /proc/sys/net/ipv4/ip_queue_maxlen ]
then
    echo 2048 > /proc/sys/net/ipv4/ip_queue_maxlen
fi

# Les rèes elles-mês
# Nous vidons toutes les chaines
$IPTABLES -F
# Nous supprimons les chaines non standards
$IPTABLES -X
# Par defaut tout est mis a la poubelle
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Creation d'une chaine véfiant la validitées paquets
$IPTABLES -N VALID_CHK

# Creation d'une chaine pour les LOGs
$IPTABLES -N LOGDROP

# L'interface locale est sure
$IPTABLES -A INPUT  -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# On accepte les liaisons Internet->localhost deja etablies
$IPTABLES -A INPUT -i $IFEXT -m state --state ESTABLISHED,RELATED -j ACCEPT
# On autorise toutes les liaisons locahost->Internet (on ouvre tout en sortie)
$IPTABLES -A OUTPUT -o $IFEXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# AUTORISATIONS SPECIALES
# Autorise la surveillance du serveur par ping àartir d'un adresse dénie
# (dupliquer cette ligne si plusieurs adresses doivent êe autorisé sur une ou plusieurs interfaces)
for ip_addr in $INGOING
do
   $IPTABLES -A INPUT -i $IFEXT -p icmp --source $ip_addr -j ACCEPT
done

# Maintenant on protè !
#
# Ignore les paquets provenant de l'extéeur avec une adresse non routable sur Internet (spoofing)
# Deja pris en charge par rp_filter, mais pourquoi pas une ceinture en plus des bretelles ?
$IPTABLES -A INPUT -i $IFEXT -s 10.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 172.16.0.0/12 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 192.168.0.0/16 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 224.0.0.0/4 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 240.0.0.0/5 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 169.254.0.0/16 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 127.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 0.0.0.0 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 255.255.255.255 -j DROP

# Drop (NMAP) scan packets:
# (NMAP) FIN/URG/PSH
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# SYN/RST/ACK/FIN/URG
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS-PSH scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# ALL/ALL
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL ALL -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS-ALL scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL ALL -j DROP
# NMAP FIN Stealth
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth FIN scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN -j DROP
# SYN/RST
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth SYN/RST scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN/FIN (probably)
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth SYN/FIN scan(?): "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Null scan
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL NONE -m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth Null scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL NONE -j DROP
# Drop packets with bad tcp flags
$IPTABLES -A VALID_CHK -p tcp --tcp-option 64 -m limit --limit 3/m --limit-burst 1 -j LOG --log-level $LOGLEVEL --log-prefix "Bad TCP flag(64): "
$IPTABLES -A VALID_CHK -p tcp --tcp-option 64 -j DROP
$IPTABLES -A VALID_CHK -p tcp --tcp-option 128 -m limit --limit 3/m --limit-burst 1 -j LOG --log-level $LOGLEVEL --log-prefix "Bad TCP flag(128): "
$IPTABLES -A VALID_CHK -p tcp --tcp-option 128 -j DROP
# Drop invalid packets
$IPTABLES -A VALID_CHK -p tcp -m state --state INVALID -m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID TCP: "
$IPTABLES -A VALID_CHK -p udp -m state --state INVALID -m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID UDP: "
$IPTABLES -A VALID_CHK -p icmp --icmp-type echo-request -m state --state INVALID -m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID ICMP-request: "
$IPTABLES -A VALID_CHK -p icmp ! --icmp-type echo-request -m state --state INVALID -m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID ICMP-other: "
$IPTABLES -A VALID_CHK -m state --state INVALID -j DROP
# Drop fragmented packets
$IPTABLES -A VALID_CHK -f -m limit --limit 3/m --limit-burst 1 -j LOG --log-prefix "Fragmented packet: "
$IPTABLES -A VALID_CHK -f -j DROP

# Finalement, on passe le paquet àALID_CHK àartir d'INPUT, qui le répèra s'il n'est pas jetéIPTABLES -A INPUT -j VALID_CHK

# OUVERTURE DE PORTS (EXTERIEUR -> LOCALHOST)
for tcp_port in $TCP_PORTS
do
   for ip_addr in $INGOING
   do
      $IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p tcp --source $ip_addr --dport $tcp_port -j ACCEPT
   done
done

for udp_port in $UDP_PORTS
do
   for ip_addr in $INGOING
   do
      $IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p udp --source $ip_addr --dport $udp_port -j ACCEPT
   done
done

# Log les paquets rejetes.Niveau par defaut : warning
# $IPTABLES -A INPUT -j LOG --log-level emerg --log-prefix='[FW] '
$IPTABLES -A LOGDROP -j LOG --log-prefix='[FW] '
$IPTABLES -A INPUT -j LOGDROP

# BlueOnyx specific : admserv restart iptables with its own config (/etc/sysconfig/iptables)
# Force the actual rules to this file
/etc/init.d/iptables save

logger "Firewall started..."
}

fw_stop() {
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -P INPUT ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT ACCEPT

  $IPTABLES -t nat -F
  $IPTABLES -t nat -X
 
  $IPTABLES -t mangle -F
  $IPTABLES -t mangle -X

 logger "Firewall stopped..."
}

fw_restart() {
  fw_stop
  sleep 2
  fw_start

}

case "$1" in
   'start')
      fw_start
      ;;
   'stop')
      fw_stop
      ;;
   'restart')
      fw_restart
      ;;
   'status')
      echo ">>> filter table"
      $IPTABLES -L
      echo -e "\n>>> nat table"
      $IPTABLES -t nat -L
      echo -e "\n>>>mangle table"
      $IPTABLES -t mangle -L
      ;;
   *)
      echo "Usage: firewall {start|stop|restart|status}"
esac
# Fin du fichier

Script pour 2 interfaces (type routeur)

#!/bin/bash
#
# chkconfig: 2345 20 80
# description: firewall local
#

# fichier de configuration IPtables
# protection d'un serveur NON PASSERELLE (pas de FORWARD)
# (c) 2007 Frank SOYER

# Pour autoriser un port sur la machine locale, simplement l'ajouter aux deux
# premières variables globales
# Attention à bien paramétrer les noms d'interfaces, les plages réseaux...
# ET VISITER LA SECTION "AUTORISATION SPECIALES"

# Variables globales
TCP_PORTS="22 80 81 444 20 21"
UDP_PORTS=""
IFEXT=eth0
EXTERNAL_IP="87.98.154.138"
EXTERNAL_NET=""
# Laisser IFINT vide ("IFINT=") s'il n'y a qu'une interface
IFINT=
INTERNAL_IP=""
INTERNAL_NET=""
IPTABLES=/sbin/iptables
LOGLEVEL="warning"

# Quelques variables qui peuvent etre utiles
ANYWHERE="0.0.0.0/0"
PRIVPORTS="0:1023"
UNPRIVPORTS="1024:65535"

fw_start() {
# Quelques ajustements nécessaires
# Use rp_filter values to drop connections from non-routable IPs
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > $i
done
# les ICMP echo request sont gérées par netfilter
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Add synflood protection (mettre à 0 si le serveur est très chargé niveau réseau)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Log martians (martian = packet with invalide source or destination address)
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# Don't accept ICMP redirect messages (pas nécessaire si réseau bien paramétré)
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Disable ICMP send_redirect
for interface in /proc/sys/net/ipv4/conf/*/send_redirects; do
    echo 0 > $interface
done
# Don't accept source routed packets
for interface in /proc/sys/net/ipv4/conf/*/accept_source_route; do
    echo 0 > $interface
done
# ICMP Broadcasting protection (smurf amplifier protection)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# ICMP Dead Error Messages protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Increase the default queuelength. (Kernel Default: 1024)
if [ -e /proc/sys/net/ipv4/ip_queue_maxlen ]
then
   echo 2048 > /proc/sys/net/ipv4/ip_queue_maxlen
fi

# Les règles elles-mêmes
# Nous vidons toutes les chaines
$IPTABLES -F
# Nous supprimons les chaines non standards
$IPTABLES -X
# Par defaut tout est mis a la poubelle
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Creation d'une chaine vérifiant la validité des paquets
$IPTABLES -N VALID_CHK

# Creation d'une chaine pour les LOG
$IPTABLES -N LOGDROP

# L'interface locale est sure
$IPTABLES -A INPUT  -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# Enregistrement des stats IP pour Munin
iptables -A INPUT -d $EXTERNAL_IP
iptables -A OUTPUT -s $EXTERNAL_IP

# On accepte les liaisons Internet->localhost deja etablies
$IPTABLES -A  INPUT -i $IFEXT -m state --state ESTABLISHED,RELATED -j ACCEPT
# On accepte TOUTES les liaisons reseau interne->localhost s'il y a une interface dédiée LAN
if [ -n "$IFINT" ]
then
   $IPTABLES -A  INPUT -i $IFINT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
fi
# On autorise toutes les liaisons locahost->Internet (on ouvre tout en sortie)
$IPTABLES -A OUTPUT -o $IFEXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
if [ -n "$IFINT" ]
then
   $IPTABLES -A OUTPUT -o $IFINT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
fi

# AUTORISATIONS SPECIALES
$IPTABLES -A INPUT -i $IFEXT -p icmp -j ACCEPT

# Maintenant on protège !
#
# Ignore les paquets provenant de l'extérieur avec une adresse non routable sur Internet (spoofing)
# Déjà pris en charge par rp_filter, mais pourquoi pas une ceinture en plus des bretelles ?
$IPTABLES -A INPUT -i $IFEXT -s 10.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 172.16.0.0/12 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 192.168.0.0/16 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 224.0.0.0/4 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 240.0.0.0/5 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 169.254.0.0/16 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 127.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 0.0.0.0 -j DROP
$IPTABLES -A INPUT -i $IFEXT -s 255.255.255.255 -j DROP

# Drop (NMAP) scan packets:
# (NMAP) FIN/URG/PSH
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN,URG,PSH \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# SYN/RST/ACK/FIN/URG
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS-PSH scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# ALL/ALL
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL ALL \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth XMAS-ALL scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL ALL -j DROP
# NMAP FIN Stealth
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth FIN scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL FIN -j DROP
# SYN/RST
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,RST SYN,RST \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth SYN/RST scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN/FIN (probably)
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,FIN SYN,FIN \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth SYN/FIN scan(?): "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Null scan
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL NONE \
-m limit --limit 3/m --limit-burst 5 -j LOG --log-level $LOGLEVEL --log-prefix "Stealth Null scan: "
$IPTABLES -A VALID_CHK -p tcp --tcp-flags ALL NONE -j DROP
# Drop packets with bad tcp flags
$IPTABLES -A VALID_CHK -p tcp --tcp-option 64 \
-m limit --limit 3/m --limit-burst 1 -j LOG --log-level $LOGLEVEL --log-prefix "Bad TCP flag(64): "
$IPTABLES -A VALID_CHK -p tcp --tcp-option 64 -j DROP
$IPTABLES -A VALID_CHK -p tcp --tcp-option 128 \
-m limit --limit 3/m --limit-burst 1 -j LOG --log-level $LOGLEVEL --log-prefix "Bad TCP flag(128): "
$IPTABLES -A VALID_CHK -p tcp --tcp-option 128 -j DROP
# Drop invalid packets
$IPTABLES -A VALID_CHK -p tcp -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID TCP: "
$IPTABLES -A VALID_CHK -p udp -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID UDP: "
$IPTABLES -A VALID_CHK -p icmp --icmp-type echo-request -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID ICMP-request: "
$IPTABLES -A VALID_CHK -p icmp ! --icmp-type echo-request -m state --state INVALID \
-m limit --limit 1/m --limit-burst 2 -j LOG --log-level $LOGLEVEL --log-prefix "INVALID ICMP-other: "
$IPTABLES -A VALID_CHK -m state --state INVALID -j DROP
# Drop fragmented packets
$IPTABLES -A VALID_CHK -f -m limit --limit 3/m --limit-burst 1 -j LOG --log-prefix "Fragmented packet: "
$IPTABLES -A VALID_CHK -f -j DROP
# Drop uncluan packets
#$IPTABLES -A VALID_CHK -m unclean -m limit --limit 10/minute -j LOG --log-prefix "UNCLEAN: "
#$IPTABLES -A VALID_CHK -m unclean -j DROP

# Finalement, on passe le paquet à VALID_CHK à partir d'INPUT, qui le récupèrera s'il n'est pas jeté
$IPTABLES -A INPUT -j VALID_CHK

# OUVERTURE DE PORTS (EXTERIEUR -> LOCALHOST)
for tcp_port in $TCP_PORTS
do
   $IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p tcp --dport $tcp_port -j ACCEPT
done

for udp_port in $UDP_PORTS
do
   $IPTABLES -A INPUT -i $IFEXT -m state --state NEW -p udp --dport $udp_port -j ACCEPT
done

# Log les paquets rejetes. Niveau par defaut : warning
# $IPTABLES -A INPUT -j LOG --log-level emerg --log-prefix='[FW] '
$IPTABLES -A LOGDROP -j LOG --log-prefix='[FW] '
$IPTABLES -A INPUT -j LOGDROP

}

fw_stop() {
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -P INPUT ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT ACCEPT

  $IPTABLES -t nat -F
  $IPTABLES -t nat -X

  $IPTABLES -t mangle -F
  $IPTABLES -t mangle -X

echo " ATTENTION! Firewall désactivé..."

}

fw_restart() {
  fw_stop
  sleep 2
  fw_start

}

case "$1" in
   'start')
      fw_start
      ;;
   'stop')
      fw_stop
      ;;
   'restart')
      fw_restart
      ;;
   'status')
      echo ">>> filter table"
      $IPTABLES -L
      echo -e "\n>>> nat table"
      $IPTABLES -t nat -L
      echo -e "\n>>>mangle table"
      $IPTABLES -t mangle -L
      ;;
   *)
      echo "Usage: firewall {start|stop|restart|status}"
esac
# Fin du fichier