5-cinq.md 26 KB



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.