Vendredi 23 novembre 2018

Parefeu iptables

https://www.alsacreations.com/tuto/lire/622-Securite-firewall-iptables.html
https://www.memoinfo.fr/tutoriels-linux/configurer-firewall-linux-iptables/
Pare-feu IPv4/IPv6, versions bureau et serveur

Alternative script /etc/init.d/firewall

#! /bin/sh
### BEGIN INIT INFO
# Provides:          PersonalFirewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Personal Firewall
# Description:
### END INIT INFO

# programme iptables IPV4 et IPV6
IPT=/sbin/iptables
IP6T=/sbin/ip6tables

# fonction qui démarre le firewall
do_start() {

    # Efface toutes les règles en cours. -F toutes. -X utilisateurs
    $IPT -t filter -F
    $IPT -t filter -X
    $IPT -t nat -F
    $IPT -t nat -X
    $IPT -t mangle -F
    $IPT -t mangle -X
    #
    $IP6T -t filter -F
    $IP6T -t filter -X
    # Il n'y a pas de NAT en IPV6
    #$IP6T -t nat -F
    #$IP6T -t nat -X
    $IP6T -t mangle -F
    $IP6T -t mangle -X

    # stratégie (-P) par défaut : bloc tout l'entrant le forward et autorise le sortant
    $IPT -t filter -P INPUT DROP
    $IPT -t filter -P FORWARD DROP
    $IPT -t filter -P OUTPUT ACCEPT
    #
    $IP6T -t filter -P INPUT DROP
    $IP6T -t filter -P FORWARD DROP
    $IP6T -t filter -P OUTPUT ACCEPT

    # Ne pas casser les connexions etablies
    $IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    #
    $IP6T -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    # Autoriser Loopback
    $IPT -t filter -A INPUT -i lo -j ACCEPT
    $IPT -t filter -A OUTPUT -o lo -j ACCEPT
    #
    $IP6T -t filter -A INPUT -i lo -j ACCEPT
    $IP6T -t filter -A OUTPUT -o lo -j ACCEPT

    # SSH 
    $IPT -t filter -A INPUT -p tcp --dport 55026 -j ACCEPT
    $IPT -t filter -A OUTPUT -p tcp --dport 55026 -j ACCEPT
    #
    $IP6T -t filter -A INPUT -p tcp --dport 55026 -j ACCEPT
    $IP6T -t filter -A OUTPUT -p tcp --dport 55026 -j ACCEPT


    # DNS in/out
    # /!\ Il faut autoriser le DNS AVANT de déclarer des hosts sinon pas de résolution de nom possible
    $IPT -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
    $IPT -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
    $IPT -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
    $IPT -t filter -A INPUT -p udp --dport 53 -j ACCEPT
    #
    $IP6T -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
    $IP6T -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
    $IP6T -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
    $IP6T -t filter -A INPUT -p udp --dport 53 -j ACCEPT

    # HTTP + HTTPS 
    $IPT -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
    $IPT -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
    $IPT -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
    $IPT -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

    $IP6T -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
    $IP6T -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
    $IP6T -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
    $IP6T -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

    #
    echo "firewall started [OK]"
}

# fonction qui arrête le firewall
do_stop() {

    # Efface toutes les règles
    $IPT -t filter -F
    $IPT -t filter -X
    $IPT -t nat -F
    $IPT -t nat -X
    $IPT -t mangle -F
    $IPT -t mangle -X
    #
    $IP6T -t filter -F
    $IP6T -t filter -X
    #$IP6T -t nat -F
    #$IP6T -t nat -X
    $IP6T -t mangle -F
    $IP6T -t mangle -X

    # remet la stratégie
    $IPT -t filter -P INPUT ACCEPT
    $IPT -t filter -P OUTPUT ACCEPT
    $IPT -t filter -P FORWARD ACCEPT
    #
    $IP6T -t filter -P INPUT ACCEPT
    $IP6T -t filter -P OUTPUT ACCEPT
    $IP6T -t filter -P FORWARD ACCEPT

    #
    echo "firewall stopped [OK]"
}

# fonction status firewall
do_status() {

    # affiche les règles en cours
    clear
    echo Status IPV4
    echo -----------------------------------------------
    $IPT -L -n -v
    echo
    echo -----------------------------------------------
    echo
    echo status IPV6
    echo -----------------------------------------------
    $IP6T -L -n -v
    echo
}

case "$1" in
    start)
        do_start
        # quitte sans erreur
        exit 0
    ;;

    stop)
        do_stop
        # quitte sans erreur
        exit 0
    ;;

    restart)
        do_stop
        do_start
        # quitte sans erreur
        exit 0
    ;;

    status)
        do_status
        # quitte sans erreurs
        exit 0
    ;;

    *)
        # Si on ne tape ni "start" ni "stop"... on affiche une erreur
        echo "Usage: /etc/init.d/firewall {start|stop|restart|status}"
        # quitte le script avec un etat "en erreur"
        exit 1
    ;;

esac

Ensuite on rend le fichier exécutable :

chmod +x /etc/init.d/firewall

Maintenant on peut le tester :

/etc/init.d/firewall start

Pour regarder les règles en cours :

/etc/init.d/firewall status

Afin de l’ajouter aux scripts appelés au démarrage :

update-rc.d firewall defaults

Pour le retirer, vous pouvez utiliser la commande suivante :

update-rc.d -f firewall remove

Alternative iptables-persistent

Créer un script pour mettre en place des règles de base.
sudo nano parefeu

#!/bin/sh

# Règles de base
iptables -t filter -F -m comment --comment "Vider les règles table filter"
iptables -t nat -F -m comment --comment "Vider les règles table nat"
iptables -t filter -X -m comment --comment "Vider les règles personnelles table filter"
iptables -t nat -X -m comment --comment "Vider les règles personnelles table nat"
iptables -t filter -P INPUT ACCEPT -m comment --comment "Autoriser toute connexion entrante"
iptables -t filter -P FORWARD ACCEPT -m comment --comment "Autoriser toute redirection"
iptables -t filter -P OUTPUT ACCEPT -m comment --comment "Autoriser toute connexion sortante"
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Ne pas casser les connexions en cours"
iptables -t filter -A INPUT -i lo -j ACCEPT -m comment --comment "Autoriser loopback"
iptables -t filter -A INPUT -p icmp -j ACCEPT -m comment --comment "Autoriser ICMP (Ping)"
iptables -t filter -A INPUT -p tcp --dport 55029 -j ACCEPT -m comment --comment "Port SSH Input"
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT -m comment --comment "DNS tcp Input"
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT -m comment --comment "DNS udp Input"
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT -m comment --comment "HTTP Input"
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT -m comment --comment "HTTPS Input"

# Règles NFS
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m multiport --ports 111,2049,32764:32769 -j ACCEPT -m comment --comment "NFS Server"
iptables -A INPUT -s 192.168.0.0/24 -p udp -m multiport --ports 111,2049,32764:32769 -j ACCEPT -m comment --comment "NFS Server"
# Règle port http subsonic
iptables -t filter -A INPUT -p tcp --dport 8090 -j ACCEPT -m comment --comment "Subsonic port http"
# Règles spécifiques
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE -m comment --comment "Activer MASQUERADE sur tunnel vpn tun0 "
iptables -A FORWARD -s 10.10.11.0/24 -i wlan0 -o tun0 -m conntrack --ctstate NEW -j REJECT -m comment --comment "VPN : Bloquer le trafic des clients wlan0 vers tun0"  
iptables -A FORWARD -s 10.10.12.0/24 -i wlan0_0 -o tun0 -m conntrack --ctstate NEW -j ACCEPT -m comment --comment "VPN : Autoriser uniquement le trafic des clients wlan0_0 vers tun0" 

fichier exécutable :
sudo chmod +x parefeu

Vous pourrez le tester en l’exécutant directement en ligne de commande.
sudo -s
./parefeu
En cas d’erreur, redémarrez le serveur, les règles seront oubliées et vous permettront de reprendre la main.
En revanche, si les tests s’avèrent concluants, ajoutez le lancement des règles iptables au démarrage.
Après avoir exécuté le script précédent,vérifier la présence des règles
iptables -L

Lancement du parefeu au démarrage
apt install iptables-persistent
Faut-il enregistrer les règles IPv4 actuelles ? OUI
Faut-il enregistrer les règles IPv6 actuelles ? NON
Les tables sont enregistrés sous /etc/iptables/ , rules.v4 pour IPv4 et rules.v6 pour IPv6
Sauvegarde/Restauration manuelle des régles iptables
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4

Bash pour effacer les tables “iptables”

#!/bin/sh

# RAZ tables
iptables -t filter -F -m comment --comment "Vider les règles table filter"
iptables -t nat -F -m comment --comment "Vider les règles table nat"
iptables -t filter -X -m comment --comment "Vider les règles personnelles table filter"
iptables -t nat -X -m comment --comment "Vider les règles personnelles table nat"
iptables -t filter -P INPUT ACCEPT 
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT 

Autre parefeu

Créer un script pour mettre en place des règles de base.

cd ~
sudo nano parefeu
#!/bin/sh

# Efface toutes les règles en cours. -F toutes. -X utilisateurs
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
#
ip6tables -t filter -F
ip6tables -t filter -X

ip6tables -t mangle -F
ip6tables -t mangle -X

# stratégie (-P) par défaut : bloc tout l'entrant le forward et autorise le sortant
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT
#
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P FORWARD DROP
ip6tables -t filter -P OUTPUT ACCEPT

# Ne pas casser les connexions etablies
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
ip6tables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Autoriser Loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
#
ip6tables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A OUTPUT -o lo -j ACCEPT

# Autoriser icmp
iptables -t filter -A INPUT -p icmp -j ACCEPT
ip6tables -t filter -A INPUT -p icmp -j ACCEPT

# SSH 
iptables -t filter -A INPUT -p tcp --dport 55026 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 55026 -j ACCEPT
#
ip6tables -t filter -A INPUT -p tcp --dport 55026 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 55026 -j ACCEPT

# DNS in/out
# /!\ Il faut autoriser le DNS AVANT de déclarer des hosts sinon pas de résolution de nom possible
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
#
ip6tables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
ip6tables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
ip6tables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# HTTP + HTTPS 
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

ip6tables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

# IMAP SMTP
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

ip6tables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

fichier exécutable :

sudo chmod +x parefeu

Vous pourrez le tester en l’exécutant directement en ligne de commande.

sudo -s
./parefeu

En cas d’erreur, redémarrez le serveur, les règles seront oubliées et vous permettront de reprendre la main.
En revanche, si les tests s’avèrent concluants, ajoutez le lancement des règles iptables au démarrage.
Après avoir exécuté le script précédent,vérifier la présence des règles

iptables -L
ip6tables -L

Lancement du parefeu au démarrage

apt install iptables-persistent

Faut-il enregistrer les règles IPv4 actuelles ? OUI
Faut-il enregistrer les règles IPv6 actuelles ? OUI
Les tables sont enregistrés sous /etc/iptables/ , rules.v4 pour IPv4 et rules.v6 pour IPv6
Sauvegarde/Restauration manuelle des régles iptables

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6