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@aijan:/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@aijan:/home/ericadmin#
Vous noterez que le nom du serveur est différent. J'ai testé mon tutoriel sur un nouveau serveur (aijan.yojik.net.)
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@aijan:/home/ericadmin# systemctl stop netfilter-persistent
root@aijan:/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 aijan systemd[1]: Starting netfilter persistent configuration...
févr. 11 13:42:02 aijan netfilter-persistent[1525]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
févr. 11 13:42:02 aijan netfilter-persistent[1525]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start
févr. 11 13:42:02 aijan systemd[1]: Started netfilter persistent configuration.
févr. 11 13:50:22 aijan systemd[1]: Stopping netfilter persistent configuration...
févr. 11 13:50:22 aijan netfilter-persistent[1629]: Automatic flush disabled; use '/usr/sbin/netfilter-persistent flush'
févr. 11 13:50:22 aijan systemd[1]: netfilter-persistent.service: Control process exited, code=exited status=1
févr. 11 13:50:22 aijan systemd[1]: Stopped netfilter persistent configuration.
févr. 11 13:50:22 aijan systemd[1]: netfilter-persistent.service: Unit entered failed state.
févr. 11 13:50:22 aijan systemd[1]: netfilter-persistent.service: Failed with result 'exit-code'.
root@aijan:/home/ericadmin#
root@aijan:/home/ericadmin# systemctl start netfilter-persistent
root@aijan:/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 aijan systemd[1]: Starting netfilter persistent configuration...
févr. 11 13:51:09 aijan netfilter-persistent[1641]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
févr. 11 13:51:09 aijan netfilter-persistent[1641]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start
févr. 11 13:51:09 aijan systemd[1]: Started netfilter persistent configuration.
root@aijan:/home/ericadmin#
Pour sauver des règles “entrées à la main”, tapez:
service netfilter-persistent save
root@aijan:/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@aijan:/home/ericadmin#
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.
root@aijan:/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@aijan:/etc/iptables# iptables -N TCP
root@aijan:/etc/iptables# iptables -N UDP
root@aijan:/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.
oot@aijan:/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@aijan:/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@aijan:/etc/iptables#
Pour IPV6:
root@aijan:/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@aijan:/etc/iptables#
Test DNS et du serveur de temps (avec iptables actif)
root@aijan:/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@aijan:/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 voiur 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
- Serveur -> extérieur
- Extérieur -> serveur
On peut utiliser l'adresse ipv6.google.com pour vérifier la connexion IPV6 en dehors du réseau local.