Outils personnels

Scripts FIREWALL : Différence entre versions

De wikiGite

(CentOS)
Ligne 247 : Ligne 247 :
  
 
== CentOS ==
 
== 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 UDP_PORTS
 +
# pour filtrer les IP entrantes, ajouter les adresses autorisees dans INGOING
 +
# Attention àien paraméer les noms d'interfaces, les plages réaux...
 +
# TODO :
 +
# - Mettre les variables dans un conf
 +
# --- notamment ajouter une notion de protocole en + des ports
 +
 +
# 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 81"
 +
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"
 +
 +
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
 
  #!/bin/bash
 
  #
 
  #

Version du 7 juillet 2011 à 10:07

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)

  1. !/bin/bash
  2. fichier de configuration IPtables
  3. protection d'un serveur NON PASSERELLE (pas de FORWARD)
  4. (c) 2007-2010 FSo
  5. chkconfig: 2345 61 39
  6. description: Firewall iptables
  7. Pour autoriser un port sur la machine locale, simplement l'ajouter a TCP_PORTS et UDP_PORTS
  8. pour filtrer les IP entrantes, ajouter les adresses autorisees dans INGOING
  9. Attention àien paraméer les noms d'interfaces, les plages réaux...
  10. TODO :
  11. - Mettre les variables dans un conf
  12. --- notamment ajouter une notion de protocole en + des ports
  1. Variables globales
  2. Note : laisser au moins un port dans chaque variable sinon le script peut planter (ex : TCP 22 et UDP 111)
  3. Les ports listes ici seront ouverts

TCP_PORTS="22 20 21 80 443 81" UDP_PORTS=""

  1. INGOING="0.0.0.0/0.0.0.0" si toutes les IP externes sont autorisees (uniquement fermeture des ports non utilises)
  2. sinon y lister seulement les IP autorisees separees par des espaces
  3. pour une plage d'IP ajouter le masque, exemple "192.168.1.0/24"
  4. 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"

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