Scripts FIREWALL : Différence entre versions
De wikiGite
(Page créée avec « == Debian == == CentOS == #!/bin/bash # # chkconfig: 2345 20 80 # description: firewall local # # fichier de configuration IPtables # protection d'un serveur NON PA... ») |
|||
Ligne 1 : | Ligne 1 : | ||
== Debian == | == 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 == | == CentOS == |
Version du 30 mars 2010 à 21:34
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
#!/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