Introduction

Confronté au sujet de contrôle parental, je me suis demandé s’il était possible de limiter l’accès réseau d’un utilisateur. La configuration doit être persistante, active dès le démarrage, et accessible en tant que super utilisateur seulement.

Firewall

C’est au niveau du firewall que la solution est la plus intuitive, mes recherches en ligne proposent presque toutes le même raisonnement :

  • Ajouter une règle spécifique pour bloquer les flux,
  • Spécifier le nom d’utilisateur,
  • DROP toutes les connexions sauf pour l’interface loopback lo.

Ce qui donne, pour un système basé sur Debian équipé d’ iptables :

 $ iptables -A OUTPUT ! -o lo -m owner --uid-owner $USER -j DROP

La partie ! -o lo exclut l’interface lo. Le résultat est le suivant :

$ iptables -vL
[...]

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  any    !lo     anywhere             anywhere             owner UID match antoine

[...]

Pour revenir à la normale, on supprime simplement la règle. Attention, dans mon cas cette règle était la seule de la chain OUTPUT.

 $ iptables -D OUTPUT 1

Persistence

Pour que la persistence soit effective sur une machine Debian, une solution consiste en l’installation du package iptables-persistent, et de copier les règles souhaitées dans le répertoire /etc/iptables/, en suivant le nommage rules.v4 et rules.v6 pour les règles ipv4 et ipv6. On lancera donc, pour sauvegarder les règles actuelles, les commandes suivantes :

# save ipv4 rules
$ iptables-save > /etc/iptables/rules.v4

# save ipv6 rules
$ ip6tables-save > /etc/iptables/rules.v6

Conclusion

La solution proposée semble binaire, mais on bénéficie toutefois de la granularité du firewall pour définir finement les accès réseaux, et donc les accès extérieurs vers internet.

Et pour aller un peu plus loin, on pourrait se conformer à l’utilisation de nftables, successeur d’iptables.