%

iblock : bloqueur de connexions TCP indésirables, sous OpenBSD

iblock est un outil pour bloquer des connexions TCP indésirables, conjointement au parefeu d'OpenBSD, Packet-Filter, utilisant le service inetd.

Détails relatifs à l'article

Article publié, le
et modifié le
4 minutes de lecture

Cet article contient 818 mots.

Identifiant de l'article : tag:doc.huc.fr.eu.org,2022-04-10:/fr/monitor/iblock-openbsd


Source brute de l'article :
Commit version : 9bf3d7b


Cet article est aussi disponible sur le protocole Gemini :
gemini://gmi.it-log.fr.eu.org/fr/monitor/iblock-openbsd.gmi


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.

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 :

  1. déclaration d’une variable, ici nommée block_tcp_ports, soit un ensemble de ports à surveiller

  2. création d’une table persistante, ici nommée iblocked

  3. règle bloquante, portant le label iblock

  4. 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
Info
Attention

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 :

Statistiques d'adresses IP bloquées grâce à iblock
Statistiques d'adresses IP bloquées grâce à iblock

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 !



Enjoy-ID!
Enjoy-IT!