iptables: bloquer l'accès à un domaine et à certaines heures


Lorsque la pédagogie échoue il est parfois nécessaire d’imposer une décision par une solution technique.

Enfin de préserver la tranquillité familiale, l’objectif est de bloquer l’usage d’un site de vidéos connu entre 6 et 10h du matin.

Sur une machine Linux la solution simple se fait avec une ligne de commande.




Nous allons utiliser iptables sur les machines clientes et rejeter les requêtes dns pour youtube.com. Voici la commande :


$ iptables -A OUTPUT -p udp -m udp —dport 53 -m string —hex-string ‘|07|youtube|03|com’ —algo bm -j DROP

La machine cliente va essayer d’obtenir l’adresse IP à joindre pour le service youtube.com. Elle utilise le protocole DNS pour interroger un serveur. Le protocole DNS est un protocole UDP qui interroge un serveur sur le port 53. C’est ici que la plupart des tutoriels en ligne se trompent ou ne donnent pas de solution : la requête ne contient pas de ‘.’ ceux-ci sont remplacés par le nombre de caractères suivants. On identifie et on rejette alors les requêtes DNS contenant la chaîne hexadécimale |07|youtube|03|com ou autre exemple : |06|google|03|com.

Pour que cette règle soit active entre 8 et 10h, on utilise le module time de iptables et on ajoute les options suivantes à notre commande :
-m time --timestart 06:00 --timestop 10:00 --kerneltz
par défaut iptables utilise le temps UTC. L’option --kerneltz permet d’indiquer l’usage de l’heure locale.

On peut vérifier que cette règle est appliquée avec :

$ iptables -L
...
Chain OUTPUT (policy ACCEPT)
target     prot opt source     destination         
DROP       udp  --  anywhere   anywhere    udp dpt:domain STRING match  "|07796f757475626503636f6d|" \ 
                                    ALGO name bm  TO 65535 TIME from 06:00:00 to 10:00:00

Notre chaîne hexa décrivant la requête vers youtube est ici complètement enregistrée en hexadécimal.

La commande $ iptables -L -nvx affichera le nombre de requêtes traitées.

Il ne reste plus qu’à enregistrer cette configuration pour quelle s’applique dès le démarrage :

$ iptables-save > /etc/iptables.rules

On vérifie que ces règles sont bien injectées au démarrage. Par exemple dans /etc/rc.local on doit trouver iptables-restore /etc/iptables.rules

Notez bien qu’il s’agit d’une solution individuelle et qui n’est pas industrialisable. Il faudrait plutôt renvoyer sur une page qui explique les raisons de ce blocage.