﻿

## Installation d'un pare-feu

J'ai utilisé depuis toujours iptables "brut". Ayant lu beaucoup de bien de ufw, je vais tenter une installation de ce dernier.

Après usage, il s'avère difficile de configurer fail2ban avec ufw.

Je vais quand même laisser la doc de configuration de ufw, tout en préférant utiliser iptables.

### Installation de iptables

Iptables est installé automatiquement. Nous allons rajouter le paquet iptables-persistent pour assurer le lancement automatique de nos règles à l'allumage de la machine.

    root@atom:/home/ericadmin# apt install iptables-persistent
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances
    Lecture des informations d'état... Fait
    The following additional packages will be installed:
      netfilter-persistent
    Les NOUVEAUX paquets suivants seront installés :
      iptables-persistent netfilter-persistent
    0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour.
    Il est nécessaire de prendre 19,5 ko dans les archives.
    Après cette opération, 79,9 ko d'espace disque supplémentaires seront utilisés.
    Souhaitez-vous continuer ? [O/n] o
    Réception de:1 http://deb.debian.org/debian stretch/main amd64 netfilter-persistent all 1.0.4+nmu2 [8 792 B]
    Réception de:2 http://deb.debian.org/debian stretch/main amd64 iptables-persistent all 1.0.4+nmu2 [10,7 kB]
    19,5 ko réceptionnés en 0s (198 ko/s)
    Préconfiguration des paquets...
    Sélection du paquet netfilter-persistent précédemment désélectionné.
    (Lecture de la base de données... 36713 fichiers et répertoires déjà installés.)
    Préparation du dépaquetage de .../netfilter-persistent_1.0.4+nmu2_all.deb ...
    Dépaquetage de netfilter-persistent (1.0.4+nmu2) ...
    Sélection du paquet iptables-persistent précédemment désélectionné.
    Préparation du dépaquetage de .../iptables-persistent_1.0.4+nmu2_all.deb ...
    Dépaquetage de iptables-persistent (1.0.4+nmu2) ...
    Paramétrage de netfilter-persistent (1.0.4+nmu2) ...
    Created symlink /etc/systemd/system/multi-user.target.wants/netfilter-persistent.service → /lib/systemd/system/netfilter-persistent.service.
    update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
    Traitement des actions différées (« triggers ») pour systemd (232-25+deb9u1) ...
    Traitement des actions différées (« triggers ») pour man-db (2.7.6.1-2) ...
    Paramétrage de iptables-persistent (1.0.4+nmu2) ...
    root@atom:/home/ericadmin#

Nous obtenons donc 2 fichiers de configuration, /etc/iptables/rules.v4 et /etc/iptables/rules.v6.

En listant ces fichiers, aucune règle n'est encore enregistrée: tout passe, en entrée et en sortie.

Ces fichiers sont mis à jour grâce aux commandes suivantes.

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

Les commandes disponibles pour netfilter-persistent sont les suivantes:

- systemctl start netfilter-persistent
- systemctl stop netfilter-persistent
- systemctl restart netfilter-persistent
- systemctl stop netfilter-persistent
- systemctl status netfilter-persistent

Exemples d'utilisation suivant l'état de netfilter-persistent:

    root@atom:/home/ericadmin# systemctl stop netfilter-persistent
    root@atom:/home/ericadmin# systemctl status netfilter-persistent
    ● (**point en rouge**) netfilter-persistent.service - netfilter persistent configuration
       Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled)
       Active: failed (Result: exit-code) since Sun 2018-02-11 13:50:22 CET; 13s ago
      Process: 1629 ExecStop=/usr/sbin/netfilter-persistent stop (code=exited, status=1/FAILURE)
      Process: 1525 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=0/SUCCESS)
     Main PID: 1525 (code=exited, status=0/SUCCESS)

    févr. 11 13:42:02 atom systemd[1]: Starting netfilter persistent configuration...
    févr. 11 13:42:02 atom netfilter-persistent[1525]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
    févr. 11 13:42:02 atom netfilter-persistent[1525]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start
    févr. 11 13:42:02 atom systemd[1]: Started netfilter persistent configuration.
    févr. 11 13:50:22 atom systemd[1]: Stopping netfilter persistent configuration...
    févr. 11 13:50:22 atom netfilter-persistent[1629]: Automatic flush disabled; use '/usr/sbin/netfilter-persistent flush'
    févr. 11 13:50:22 atom systemd[1]: netfilter-persistent.service: Control process exited, code=exited status=1
    févr. 11 13:50:22 atom systemd[1]: Stopped netfilter persistent configuration.
    févr. 11 13:50:22 atom systemd[1]: netfilter-persistent.service: Unit entered failed state.
    févr. 11 13:50:22 atom systemd[1]: netfilter-persistent.service: Failed with result 'exit-code'.
    root@atom:/home/ericadmin#

    root@atom:/home/ericadmin# systemctl start netfilter-persistent
    root@atom:/home/ericadmin# systemctl status netfilter-persistent
    ● (**point en vert**) netfilter-persistent.service - netfilter persistent configuration
       Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled)
       Active: active (exited) since Sun 2018-02-11 13:51:09 CET; 2s ago
      Process: 1629 ExecStop=/usr/sbin/netfilter-persistent stop (code=exited, status=1/FAILURE)
      Process: 1641 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=0/SUCCESS)
     Main PID: 1641 (code=exited, status=0/SUCCESS)

    févr. 11 13:51:09 atom systemd[1]: Starting netfilter persistent configuration...
    févr. 11 13:51:09 atom netfilter-persistent[1641]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
    févr. 11 13:51:09 atom netfilter-persistent[1641]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start
    févr. 11 13:51:09 atom systemd[1]: Started netfilter persistent configuration.
    root@atom:/home/ericadmin#

Pour sauver des règles “entrées à la main”, tapez:

    root@atom:/home/ericadmin# service netfilter-persistent save
    [....] Saving netfilter rules...run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
    run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
    done.
    root@atom:/home/ericadmin#

ou

    root@atom:/home/ericadmin# iptables-save > /etc/iptables/rules.v4
    root@atom:/home/ericadmin# ip6tables-save > /etc/iptables/rules.v6

### Configuration des règles iptables

Nous allons les configurer avec un script donné par Nicolargo: Site de NicoLargo

    #! /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

    # Les IPs
    IPMAISON=192.168.111.150
    IP6MAISON=fe80::1e6f:65ff:fe92:dd1f

    # 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 -F INPUT
        $IP6T -F FORWARD
        $IP6T -X

        # 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

        # ICMP
        $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
        $IPT -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

        # Permettre à une connexion ouverte de recevoir du trafic en entrée
        $IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        #
        $IP6T -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IP6T -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
        $IP6T -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
        $IP6T -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
        $IP6T -A INPUT -j ACCEPT
        $IP6T -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
        $IP6T -P INPUT DROP
        $IP6T -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
        $IP6T -A FORWARD -p icmpv6 --icmpv6-type echo-request -j ACCEPT
        $IP6T -A FORWARD -i br0 -j ACCEPT
        $IP6T -A FORWARD -i br1 -o sit_sixxs -j ACCEPT
        $IP6T -P FORWARD DROP

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

        # DNS:53
        $IP6T -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
        $IP6T -t filter -A INPUT -p udp --dport 53 -j ACCEPT

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

        # accepte tout d'une ip en TCP (de la maison)
        $IPT -t filter -A INPUT -p tcp -s $IPMAISON -j ACCEPT
        $IP6T -t filter -A INPUT -p tcp -s $IP6MAISON -j ACCEPT

        # ssh
        $IPT -t filter -A INPUT -p tcp --dport 22  -j ACCEPT
        $IPT -t filter -A OUTPUT -p tcp --dport 22  -j ACCEPT
        #
        $IP6T -t filter -A INPUT -p tcp --dport 22  -j ACCEPT
        $IP6T -t filter -A OUTPUT -p tcp --dport 22  -j ACCEPT

       #NTP out
        $IPT -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
        $IP6T -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

    #    # HTTP + HTTPS Out
    #     $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 OUTPUT -p tcp --dport 80 -j ACCEPT
    #     $IP6T -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

    #     # HTTP + HTTPS In
    #     $IPT -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
    #     $IPT -t filter -A INPUT -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

    #    # Mail SMTP:25
    #    $IPT -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
    #    $IPT -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

    #    $IP6T -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
    #    $IP6T -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

    #    # Mail SMTP:587
    #    $IPT -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
    #    $IPT -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #    $IP6T -t filter -A INPUT -p tcp --dport 597 -j ACCEPT
    #    $IP6T -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #    # Mail IMAP:143
    #    $IPT -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
    #    $IPT -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

    #    $IP6T -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
    #    $IP6T -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

    #    # Mail IMAPS:993
    #    $IPT -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
    #    $IPT -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
    #    $IP6T -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
    #    $IP6T -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT

    #    # Mail 465
    #    $IPT -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
    #    $IPT -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT

    #    $IP6T -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
    #    $IP6T -t filter -A OUTPUT -p tcp --dport 465 -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

Explications:

    Création de 4 chaînes pour faciliter les opérations:

    # iptables -N TCP
    # iptables -N UDP

    # ip6tables -N TCP
    # ip6tables -N UDP

    On est sur un serveur, pas un routeur, donc, on interdit la règle FORWARD:

    # iptables -P FORWARD DROP

    # ip6tables -P FORWARD DROP

    On autorise tout en sortie:

    # iptables -P OUTPUT ACCEPT

    # ip6tables -P OUTPUT ACCEPT

    Nous allons accepter les connexions déjà établies:

    # iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

    # ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

    En entrée, on commence par interdire tout; on ouvrira les ports suivantles besoins:

    # iptables -P INPUT DROP

    # ip6tables -P INPUT DROP

    Aoristaion des connexions **loopback** (internes):

    # iptables -A INPUT -i lo -j ACCEPT

    # ip6tables -A INPUT -i lo -j ACCEPT

    Nous allons interdire les paquets marqués **INVALID**; il faudra auparavant accepter les paquets **ICMPv6 Neighbor Discovery** qui apparaissent invalides:

    #iptables -A INPUT -p 41 -j ACCEPT

    #ip6tables -A INPUT -p 41 -j ACCEPT

    # iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

    # ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP

    Pour IPV6, il faut rajouter la règle suivante qui permet de faire passer le protocol de découverte des ordinateurs sur le même réseau:

    # ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT

    L'adresse fe80:: est l'adresse ipv6 valable uniquement sur le réseau local.

    On accepte les paquets **ping**:

    # iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

    # ip6tables -A INPUT -p icmpv6 -m conntrack --ctstate NEW -j ACCEPT

    On peut maintenant accepter les nouveaux paquets entrants. Les connexions entrantes doivent commencer avec un paquet **SYNC**. Elles seront rejetées si ce n'est pas le cas:

    # iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
    # iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP

    # ip6tables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
    # ip6tables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP

    On rejette les paquets du protocole **icmp unreachable**

    # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable

    # iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

    # ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT

    # ip6tables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

    Pour IPV6, nous pouvons rajouter un filtrage pour le "kernel reverse path filter":

    # ip6tables -t raw -A PREROUTING -m rpfilter -j ACCEPT
    # ip6tables -t raw -A PREROUTING -j DROP

    On accepte les paquets **ssh** sur le port 22 (changez ce port si vous avez configuré vos ports différemment)

    # iptables -A TCP -p tcp --dport 22 -j ACCEPT

    # ip6tables -A TCP -p tcp --dport 22 -j ACCEPT

    Règles pour le DNS et NTP (ports 53 et 41)

    # iptables -A INPUT  -p udp -m state --state ESTABLISHED --sport 53 -j ACCEPT
    # iptables -A OUTPUT  -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
    # iptables -A INPUT  -p tcp -m state --state ESTABLISHED --sport 53 -j ACCEPT
    # iptables -A OUTPUT  -p tcp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT

    # iptables -A INPUT  -p udp -m state --state ESTABLISHED --sport 123 -j ACCEPT
    # iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED --dport 123 -j ACCEPT

    La même chose pour IPV6:

    # ip6tables -A INPUT  -p udp -m state --state ESTABLISHED --sport 53 -j ACCEPT
    # ip6tables -A OUTPUT  -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
    # ip6tables -A INPUT  -p tcp -m state --state ESTABLISHED --sport 53 -j ACCEPT
    # ip6tables -A OUTPUT  -p tcp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT

    # ip6tables -A INPUT  -p udp -m state --state ESTABLISHED --sport 123 -j ACCEPT
    # ip6tables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED --dport 123 -j ACCEPT

    Nous pouvons maintenant lister nos règles. Nous allons commencer par IPV4:

    Listons les règles actuelles, ensuite ajoutons 2 règles et sauvons celles-ci, puis listons le résultat. Vous pouvez faire de même pour toutes les règles.

    ```shell
    root@atom:/etc/iptables# cat rules.v4
    # Generated by iptables-save v1.6.0 on Sun Feb 11 14:27:32 2018
    *filter
    :INPUT ACCEPT [491:50774]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [267:23983]
    COMMIT
    # Completed on Sun Feb 11 14:27:32 2018

    root@atom:/etc/iptables# iptables -N TCP
    root@atom:/etc/iptables# iptables -N UDP

    root@atom:/etc/iptables# service netfilter-persistent save
    [....] Saving netfilter rules...run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
    run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
    done.

    root@atom:/etc/iptables# cat rules.v4
    # Generated by iptables-save v1.6.0 on Sun Feb 11 14:28:24 2018
    *filter
    :INPUT ACCEPT [13:888]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [8:944]
    :TCP - [0:0]
    :UDP - [0:0]
    COMMIT
    # Completed on Sun Feb 11 14:28:24 2018

Ne pas oublier de valider la règle d'acceptation des connexions existantes AVANT d'entrer la règle INPUT DROP sinon, vous perdez toute connexion avec votre serveur :)

Il suffit de répéter pour les autres règles puis pour IPV6.

Nous obtenons donc les règles suivantes:

Pour IPV4:

    root@atom:/etc/iptables# cat rules.v4
    # Generated by iptables-save v1.6.0 on Sun Feb 11 15:33:41 2018
    *filter
    :INPUT DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [105:27592]
    :TCP - [0:0]
    :UDP - [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m conntrack --ctstate INVALID -j DROP
    -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
    -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
    -A INPUT -j REJECT --reject-with icmp-proto-unreachable
    -A INPUT -p tcp -j REJECT --reject-with tcp-reset
    -A TCP -p tcp -m tcp --dport 22 -j ACCEPT
    COMMIT
    # Completed on Sun Feb 11 15:33:41 2018
    root@atom:/etc/iptables#

Pour IPV6:

    root@atom:/etc/iptables# cat rules.v6
    # Generated by ip6tables-save v1.6.0 on Sun Feb 11 15:33:41 2018
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -m rpfilter -j ACCEPT
    -A PREROUTING -j DROP
    COMMIT
    # Completed on Sun Feb 11 15:33:41 2018
    # Generated by ip6tables-save v1.6.0 on Sun Feb 11 15:33:41 2018
    *filter
    :INPUT DROP [1:144]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    :TCP - [0:0]
    :UDP - [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p ipv6 -j ACCEPT
    -A INPUT -m conntrack --ctstate INVALID -j DROP
    -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
    -A INPUT -p tcp -j REJECT --reject-with tcp-reset
    -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT
    -A OUTPUT -p ipv6-icmp -j ACCEPT
    -A TCP -p tcp -m tcp --dport 22 -j ACCEPT
    COMMIT
    # Completed on Sun Feb 11 15:33:41 2018
    root@atom:/etc/iptables#

### Test DNS et du serveur de temps (avec iptables actif)

    root@atom:/home/ericadmin# nslookup www.gnome.org
    Server:        192.168.111.254
    Address:    192.168.111.254#53

    Non-authoritative answer:
    www.gnome.org    canonical name = proxy.gnome.org.
    Name:    proxy.gnome.org
    Address: 209.132.180.168
    Name:    proxy.gnome.org
    Address: 209.132.180.180

    root@atom:/home/ericadmin# timedatectl status
          Local time: dim. 2018-04-01 12:26:57 CEST
      Universal time: dim. 2018-04-01 10:26:57 UTC
            RTC time: dim. 2018-04-01 10:26:58
           Time zone: Europe/Paris (CEST, +0200)
     Network time on: yes
    NTP synchronized: yes
     RTC in local TZ: no

Ça fonctionne.

### Installation de ufw

J'avais (ai) choisi ufw; je ne l'ai encore jamais utilisé, donc, c'est l'occasion! Finalement, pas un très bon plan, même si cela a l'air très facile en premier lieu ... je vais rester sur du iptables brut avec iptables-persistent.

Son installation est détaillée dans le paragraphe ci-dessus.

    root@atom:/home/ericadmin# apt install ufw
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances
    Lecture des informations d'état... Fait
    Les NOUVEAUX paquets suivants seront installés :
      ufw
    0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
    Il est nécessaire de prendre 164 ko dans les archives.
    Après cette opération, 848 ko d'espace disque supplémentaires seront utilisés.
    Réception de:1 http://deb.debian.org/debian stretch/main i386 ufw all 0.35-4 [164 kB]
    164 ko réceptionnés en 0s (1 239 ko/s)
    Préconfiguration des paquets...
    Sélection du paquet ufw précédemment désélectionné.
    (Lecture de la base de données... 31776 fichiers et répertoires déjà installés.)
    Préparation du dépaquetage de .../archives/ufw_0.35-4_all.deb ...
    Dépaquetage de ufw (0.35-4) ...
    Paramétrage de ufw (0.35-4) ...

    Creating config file /etc/ufw/before.rules with new version

    Creating config file /etc/ufw/before6.rules with new version

    Creating config file /etc/ufw/after.rules with new version

    Creating config file /etc/ufw/after6.rules with new version
    Created symlink /etc/systemd/system/multi-user.target.wants/ufw.service → /lib/systemd/system/ufw.service.
    Traitement des actions différées (« triggers ») pour systemd (232-25+deb9u1) ...
    Traitement des actions différées (« triggers ») pour man-db (2.7.6.1-2) ...
    Traitement des actions différées (« triggers ») pour rsyslog (8.24.0-1) ...

### Configuration de ufw

Après installation, le pare-feu est inactif.

    root@atom:/home/ericadmin# ufw status
    Status: inactive
    root@atom:/home/ericadmin#

Nous allons autoriser les connexions ssh et ntp, seuls services en place pour l'instant.

    root@atom:/home/ericadmin# ufw allow 22
    Rules updated
    Rules updated (v6)
    root@atom:/home/ericadmin#

    root@atom:/etc/fail2ban# ufw allow ntp
    Rule added
    Rule added (v6)

### Activation du pare-feu:

    root@atom:/home/ericadmin# ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    root@atom:/home/ericadmin#

### Vérification:

    root@atom:/home/ericadmin# ufw status
    Status: active

    To                         Action      From
    --                               -
    22                         ALLOW       Anywhere
    123                        ALLOW       Anywhere
    22 (v6)                    ALLOW       Anywhere (v6)
    123 (v6)                   ALLOW       Anywhere (v6)

    root@atom:/home/ericadmin#

Les connexions ssh et ntp sont autorisées, en IPV4 et IPV6.

Nous ajouterons des règles en fonction des services utilisés.

### Pour désactiver le pare-feu:

    ufw disable

### Activation du logging des actions de ufw

    root@atom:/home/ericadmin# ufw logging on
    Logging enabled
    root@atom:/home/ericadmin#

Vous pouvez voir l'ensemble des commandes de ufw en tapant:

    root@atom:/home/ericadmin# ufw --help

    Usage: ufw COMMAND

    Commands:
     enable                          enables the firewall
     disable                         disables the firewall
     default ARG                     set default policy
     logging LEVEL                   set logging to LEVEL
     allow ARGS                      add allow rule
     deny ARGS                       add deny rule
     reject ARGS                     add reject rule
     limit ARGS                      add limit rule
     delete RULE|NUM                 delete RULE
     insert NUM RULE                 insert RULE at NUM
     route RULE                      add route RULE
     route delete RULE|NUM           delete route RULE
     route insert NUM RULE           insert route RULE at NUM
     reload                          reload firewall
     reset                           reset firewall
     status                          show firewall status
     status numbered                 show firewall status as numbered list of RULES
     status verbose                  show verbose firewall status
     show ARG                        show firewall report
     version                         display version information

    Application profile commands:
     app list                        list application profiles
     app info PROFILE                show information on PROFILE
     app update PROFILE              update PROFILE
     app default ARG                 set default application policy

    root@atom:/home/ericadmin#

Il faut re-tester la connectivité en IPV4 et IPV6

1. Serveur -> extérieur
2. Extérieur -> serveur

On peut utiliser l'adresse ipv6.google.com pour vérifier la connexion IPV6 en dehors du réseau local.