Comment bloquer un site Internet

Dans le cadre d’un petit réseau privé ou même d’une unique machine, empêcher l’accès à certains sites pour échapper à ces sites, par soucis de confidentialité, ou encore tout simplement pour bloquer des publicités, peut devenir utile.

Je vous présente aujourd’hui deux techniques pour bloquer l’accès à certains sites. On va même s’amuser à bloquer google.fr parce qu’on est des crypto cyberpunks anarcho-communisme complètement dingues.

Première technique : le proxy

Un serveur proxy est un serveur (matériel ou logiciel) s’intercalant entre deux machines. En l’occurrence, nous allons installer l’un des plus célèbres, Squid, sur une Debian. L’installation est on ne peut plus simple :

apt-get install squid

On édite le fichier de configuration :

nano /etc/squid/squid.conf

Vous devriez avoir trois lignes relatives à la déclaration du réseau local :

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

Décommentez celle(s) qui s’applique(nt) à votre configuration. En dessous, on rajoute les domaines à bloquer :

acl blocked_domains dst google.fr
acl blocked_domains dst adsense.com
[...]

Puis, plus loin, juste avant la ligne :

http_access deny all

Rajoutez :

http_access allow localnet
http_access deny blocked_domains

Il suffit maintenant de configurer votre navigateur pour qu’il utilise le proxy ainsi installé (par défaut, sur le port 3128).

Pour aller plus loin, on pourrait en faire un proxy transparent : si la machine sur laquelle vous avez installé Squid est aussi la machine qui partage votre connexion Internet, mettre en place une règle iptables pour intercepter tout paquet qui cherche à atteindre le port 80 en sortie, et le rediriger vers l’hôte local, port 3128 :

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

On pourrait également déplacer la liste des domaines à bloquer dans un fichier distinct. Pour ce faire, au lieu des directives « acl blocked_domains […]« , on créé celle-ci :

acl blocked_domains dst "/etc/squid/blocked_domains"

Puis on créé le fichier spécifié, et on le remplit avec les domaines souhaités (un par ligne).

Une fois les modifications effectuées, n’oubliez pas de relancer Squid :

/etc/init.d/squid restart

Deuxième technique : invalidation DNS

sites-blocked

La deuxième technique fait appel à un serveur DNS présent sur votre réseau. Pour l’occasion, j’explique la technique avec bind, mais le principe est valable quel que soit votre serveur DNS. Commencez par éditer le fichier de configuration principal de bind :

nano /etc/bind/named.conf

Rajoutez-y la ligne suivante :

include "/etc/bind/named.conf.blocked";

Créez le fichier named.conf.blocked, et mettez-y les informations suivantes :

zone "google.fr" { type master; file "dummy-block"; };

Cette ligne bloque tout trafic vers google.fr. Si ce n’est pas ce que vous voulez, pensez à changer cette ligne pour mettre le domaine à bloquer. Cette technique a ceci de contraignant que le fichier named.conf.blocked doit contenir une ligne de ce type par domaine à bloquer, ce qui peut être pénible à maintenir, d’autant qu’il faut relancer bind après chaque modification. Nous verrons plus loin comment se faciliter un peu la vie. En attendant, il faut encore créer le fichier /etc/bind/dummy-block :

$TTL 24h

@ IN SOA yourdomain.com. hostmaster.yourdomain.com. (
2003052800 86400 300 604800 3600 )

@ IN NS yourdomain.com.
@ IN A 127.0.0.1
* IN A 127.0.0.1

Pensez juste à changer yourdomain.com et le faire pointer sur votre propre machine par exemple, puis redémarrez bind :

/etc/init.d/bind9 restart

Cette technique, encore une fois, est contraignante si vous souhaitez bloquer un nombre conséquent de sites. Pour une dizaine de domaines, c’est gérable, mais quand on cherche à en bloquer une centaine (par exemple, tous les serveurs de publicités) c’est une autre paire de manche. Je vais donc vous livrer un petit script qui va bosser pour vous.

En ce qui concerne la configuration de bind, si vous avez créé le fichier named.conf.blocked, supprimez-le. Créez un fichier blocked_domains, et comme pour Squid, remplissez-le avec les domaines à bloquer, un par ligne. Créez ensuite un fichier nommé par exemple build_conf, et rendez-le exécutable avant de l’éditer :

touch build_conf && chmod +x build_conf && nano build_conf

Mettez-y le code suivant :

#!/bin/bash

# Script permettant de générer un fichier de configuration bind
# visant à bloquer les domaines contenus dans un fichier à part
# Auteur : Metrogeek `francois@metrogeek.fr`
# Licence : GNU/GPL dans sa dernière version

# Configuration générale

# Fichier contenant la liste des domaines
domains_file="blocked_domains"

# Fichier à générer
blocked_conf="named.conf.blocked"

# Fichier de définition du domaine
dummy_block="dummy-block"

# Maintenant on peut bosser

# On formate un peu la liste des domaines

echo "Suppression des lignes vides et espaces superflus..."
sed '/^$/d' ` "${domains_file}" ` "${domains_file}_temp"
sed '/./!d' ` "${domains_file}_temp" ` "${domains_file}_temp2"
sed 's/^[ \t]*//' ` "${domains_file}_temp2" ` "${domains_file}"

rm "${domains_file}_temp" "${domains_file}_temp2"

echo "Suppression des doublons..."
sort -u "${domains_file}" ` "${domains_file}_temp"
mv "${domains_file}_temp" "${domains_file}"

echo "Génération du fichier de configuration..."
rm "${blocked_conf}"
touch "${blocked_conf}"

while read line
do
echo "zone \"${line}\" { type master; file \"${dummy_block}\"; };" `` "${blocked_conf}"
done ` "${domains_file}"

echo "Terminé, redémarrage de bind"
/etc/init.d/bind9 restart

Chaque fois que vous ajouterez un ou plusieurs domaines au fichier blocked_domains, il suffira de lancer ce script.  Cela sortirait du cadre de cet article, mais on pourrait aussi faire appel à inotify par exemple, pour relancer automatiquement ce script dès que le fichier blocked_domains est modifié.

metrogeek

Laisser un commentaire