Description
iblock est un logiciel dont le but est de détecter des connexions TCP, sur des ports précis, afin de bloquer les adresses IP correspondantes par le biais du parefeu Packet Filter, sous OpenBSD.
Le service inetd est chargé de l’écoute active.
- Auteure du projet : Solène Rapenne
- URL du dépôt Git : https://tildegit.org/solene/iblock.git
- liste d’URL bannies : http://perso.pw/blocklist.txt
Installation
iblock fait partie des paquets installables sous OpenBSD !
Néanmoins cette version n’installe pas le fichier rc.d bien utile…
Passons à l’installation depuis le dépôt Git :
Git
Commençons par la copie du dépôt Git :
:$ git clone https://tildegit.org/solene/iblock.git
:$ cd iblock
Compilons le binaire - OpenBSD renferme nativement les outils adéquats - :
:$ doas make
cc -pedantic -Wall -Wextra -Wmissing-prototypes -Werror -Wshadow -Wstrict-overflow -fno-strict-aliasing -Wstrict-prototypes -Wwrite-strings -Os -o iblock main.c
:$ $ doas make install
install -o root -g wheel iblock /usr/local/sbin/
install -o root -g wheel iblock.rc /etc/rc.d/iblock
install -o root -g wheel iblock.8 /usr/local/man/man8/
Si la phase de compilation s’exécute mal, contactez Solène !
Passons maintenant à la phase de configuration !
Configuration
Utilisateur dédié _iblock
Créons en tout premier un utilisateur dédié, nommé _iblock :
:$ doas useradd -s /sbin/nologin _iblock
doas
- Fichier de configuration :
/etc/doas.conf
Ajoutons la règle suivante dans le fichier de configuration de doas pour
autoriser l’utilisateur dédié à utiliser l’outil pfctl :
permit nopass _iblock cmd /sbin/pfctl
shutdown
En premier, créons un fichier de “secours” pour rendre la future table dans PF persistante à l’extinction et au redémarrage du serveur :
:# touch /etc/pf-iblock.txt
Puis créons/modifions le fichier /etc/rc.shutdown pour y ajouter :
pfctl -t iblocked -T show > /etc/pf-iblock.txt
PF
Voici un exemple de règles à ajouter à PF :
-
déclaration d’une variable, ici nommée block_tcp_ports, soit un ensemble de ports à surveiller
-
création d’une table persistante, ici nommée iblocked
-
règle bloquante, portant le label iblock
-
les deux dernières règles analysent le flux TCP, sur les protocoles IPv4 et IPv6, en “écoutant” les ports enregistrés dans la variable block_tcp_ports, puis redirigent sur l’interface locale, à destination du port 2507.
block_tcp_ports = "{ 21 23 111 135 137:139 445 1433 3306 3389 5432 6000:6010 7890 9999 25565 27019 }"
table <iblocked> persist file "/etc/pf-iblock.txt"
### iblock: block all in table
block in quick from <iblocked> label iblock
### iblock: redirect to inetd service on localhost
pass in quick on egress inet proto tcp to port $block_tcp_ports rdr-to 127.0.0.1 port 2507
pass in quick on egress inet6 proto tcp to port $block_tcp_ports rdr-to ::1 port 2507
J’ai rajouté : X11, Goaccess, pfstat ; à vous de rajouter…
(cette remarque vaut pour tout service que vous hébergez !)
Pensez à faire recharger le jeu de règles par PF :
$ doas pfctl -f /etc/pf.conf
Surveillance
⇒ L’activité est enregistrée dans les deux logs ‘daemon’ et ‘messages’.
:$ grep iblock /var/log/messages
May 11 20:06:14 sh1 iblock: listening on 127.0.0.1 port 2507, muahaha :>
May 11 20:06:14 sh1 iblock: listening on ::1 port 2507, muahaha :>
May 11 20:06:14 sh1 iblock: block and kill states for 138.197.101.205
May 11 20:06:50 sh1 iblock: block and kill states for 49.88.193.33
May 11 20:09:39 sh1 iblock: block and kill states for 162.254.116.236
(…)
⇒ De même, l’outil pfctl peut nous montrer les différentes adresses IP
enregistrées dans la table, gérée par PF :
:$ doas pfctl -t iblocked -T show
49.88.193.33
138.197.101.205
162.254.116.236
(…)
2600:3c03::2000:b1ff:fe14:13e5
2604:a880:400:d1:0:3:ef58:7001
(…)
voire de l’utiliser pour connaître les statistiques liées - pour comprendre ces informations, merci de lire le manpage de l’outil pour connaître la signification du colonnage :
:$ doas pfctl -sl | grep iblock
iblock 44666 1188 58504 1188 58504 0 0 0
munin
Si vous souhaitez obtenir des statistiques avec munin , Solène m’a fournit un script, à exécuter avec les droits de l’utilisateur _munin, tel que :
#!/bin/sh
if [ "$1" = "config" ]; then
echo "graph_title Banned IP absolute number"
echo "graph_vlabel gauge"
echo "a1.label value"
exit 0
fi
printf "a1.value "
doas /sbin/pfctl -t iblocked -T show | sort -n -u | awk 'END { print NR }'
Ce qui nécessite de modifier la configuration de doas pour autoriser
l’utilisateur _munin à utiliser l’outil pfctl, tel que :
:# iblock: auth _munin-plugin to use pfctl
permit nopass _munin-plugin cmd /sbin/pfctl args -t blocked_tcp -T show
Ci-dessous, voici une image de statistiques d’adresses IP bloquées, restituée par Solène, en date du 10/04/2022 :
Dépannage
iblock: No such file or directory
Dans les logs ‘daemon’ et ‘messages’, vous retrouvez le message suivant :
: execv /usr/local/sbin/iblock: No such file or directory
Assurez-vous d’avoir compiler puis installer le binaire iblock dans le répertoire en question !