## 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. ```shell 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. ```shell 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**: ```shell 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: ```shell 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 ```shell 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](https://blog.nicolargo.com/2013/06/ma-methode-pour-gerer-les-regles-iptables.html) ```shell #! /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: ```shell 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: ```shell 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: ```shell 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) ```shell 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. ```shell 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. ```shell 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. ```shell 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: ```shell 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: ```shell 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: ```shell ufw disable ``` ### Activation du logging des actions de **ufw** ```shell root@atom:/home/ericadmin# ufw logging on Logging enabled root@atom:/home/ericadmin# ``` Vous pouvez voir l'ensemble des commandes de **ufw** en tapant: ```shell 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.