Filtrage DNS enfants
Publié : 19 janv. 2018, 14:45
Hello,
Pas vraiment de la domotique, mais quand on a un PI ou autre tournant 24/7 pour des fonctionnalités domotique, autant faire en sorte qu'il ne s'ennuie pas.
Les enfants ayant désormais un ordi dans la chambre, histoire que les URL de sites cul/violents qui s'échangent dans les cours de récré (comme autrefois les magazines Lui/Playboy de papa) n'aient pas cours chez soi, il est possible de mettre en place un filtrage DNS pour leurs machines.
C'est pas une garantie à 100% (il resterait possible de résoudre les noms à la main et taper des IP dans le navigateur par exemple) mais pour les plus jeunes ça fait l'affaire.
Pour ce faire, il faut installer dnsmasq (et dnsutils, pour avoir la commande "dig" qui aide au debug pour lancer des résolutions de nom à la main):
Et le configurer pour n'offrir qu'un relais DNS (il est capable de plein de chose inutiles ici: DHCP, TFTP, PXE...), y'a plein de tutos en ligne mais niveau fichier /etc/dnsmasq.conf ca devrait donner d'ajouter ces lignes afin de configurer le log des résolutions DNS (pour voir ou nos chères têtes blondes se balladent) et un fichier de config qui va contenir les domaines DNS à filtrer:
Pour le chargement/formatage au format dnsmasq du fichier de filtrage (dnsmasq.more.conf), ce script à mettre sous la racine du compte root, nommé pour ma part update_blacklist_shalla.sh
Car le fournisseur des blacklists est shallalist.de qui m'a paru fournir une liste de qualité correcte et surtout pas encombrée de vieux domaines n'ayant plus cours (comme une autre liste dispo en ligne issue de l'université de Toulouse), qui vont rendre les premières résolutions (avant mise en cache par dnsmasq) longues. Je ne récupère pour ma part que les listes cul/violence mais il y en a d'autres (voir au besoin l'archive chargée par le script et el modifier en conséquence pour les extraires/intégrer, c'est trivial).
Ensuite, reste a rendre cela executable (chmod +x update_blacklist_shalla.sh) lancer cela à la main (de /root ; ./update_blacklist_shalla.sh) une première fois pour tester (jeter un oeuil au fichier de log /tmp/pdate_blacklist_shalla.sh.log), puis ensuite via un cron sous root: Editer sa table via crontab -e et ajouter les lignes suivantes:
Cela va rincer le fichier de log des résolutions DNS des enfants tous les lundi minuit histoire de pas saturer le tmp et lancer le script d'upgrade à 8h00 du matin les mercredi et vendredi matin (3 et 5ème jour de la semaine).
Pour tester sur le PI:
On récupère la ligne "google.fr. 228 IN A 216.58.209.227" montrant que google.fr est bien résolu (vers l'adresse externe 216.58.209.227)
Si on essaye un domaine interdit:
Là, tukif.com (attention, pas ouvrir cette page avec du monde, c'est du lourd... mais un des domaines circulant dans les cours de récré de collège, pour info et motivation sur la nécessité de ce petit tuto) se retrouve résolu en 127.0.0.1 = localhost, l'adresse externe n'est pas résolue et sur un navigateur, ce sera une page vide...
A noter que la 1ère résolution (ensuite c'est en cache) peut être un peu longue, genre 1 ou 2s... Il doit y avoir quand même 800k noms de domaines filtrés (la liste université Toulouse c'était le double). Mais ce n'est que le 1er coup et si on se limite aux comptes/machines des enfants c'est acceptable pour leur usage. En cas de souci, dnsmasq permet de configurer le nb d'entrée pouvant être mises en cache et pour quelle durée...
Quand tout fonctionne sur le PI, il faut aller sur les comptes/ordis des enfants (paramètres réseau ; attention, c'est en général dépendant de l'interface et il peut y avoir à faire la config en wifi ET filaire) afin de mettre en DNS l'adresse IP du raspberry (a la place de celle mise à la main ou fournie par DHCP par la box, qui sera souvent 192.168.1.1), qui devra au passage être mise en IP fixe (ou se voir allouer toujours la même adresse via une config DHCP statique par la box).
A noter que pour ma part, le tmpfs utilisé par /tmp est configuré ainsi dans /etc/fstab:
50MB, c'est sans doute plus que la config Raspbian. Y'a sans doute pas besoin d'autant juste pour le besoin de ce filtrage DNS (ce /tmp me sert pas mal pour d'autres choses, genre créer les archives de captures de caméras IP avant envoi mail etc... afin de limiter l'usage de la SD et ne pas la rinçer trop vite!) mais en cas de besoin c'est là que cela se règle (effectife après un reboot: "sudo shutdown -r now").
Pas vraiment de la domotique, mais quand on a un PI ou autre tournant 24/7 pour des fonctionnalités domotique, autant faire en sorte qu'il ne s'ennuie pas.
Les enfants ayant désormais un ordi dans la chambre, histoire que les URL de sites cul/violents qui s'échangent dans les cours de récré (comme autrefois les magazines Lui/Playboy de papa) n'aient pas cours chez soi, il est possible de mettre en place un filtrage DNS pour leurs machines.
C'est pas une garantie à 100% (il resterait possible de résoudre les noms à la main et taper des IP dans le navigateur par exemple) mais pour les plus jeunes ça fait l'affaire.
Pour ce faire, il faut installer dnsmasq (et dnsutils, pour avoir la commande "dig" qui aide au debug pour lancer des résolutions de nom à la main):
Code : Tout sélectionner
sudo apt-get install dnsmasq dnsutilsCode : Tout sélectionner
log-queries
log-facility=/tmp/dnsmasq.log
conf-file=/etc/dnsmasq.more.confCar le fournisseur des blacklists est shallalist.de qui m'a paru fournir une liste de qualité correcte et surtout pas encombrée de vieux domaines n'ayant plus cours (comme une autre liste dispo en ligne issue de l'université de Toulouse), qui vont rendre les premières résolutions (avant mise en cache par dnsmasq) longues. Je ne récupère pour ma part que les listes cul/violence mais il y en a d'autres (voir au besoin l'archive chargée par le script et el modifier en conséquence pour les extraires/intégrer, c'est trivial).
Code : Tout sélectionner
#!/bin/bash
#PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
LOGFILE=$(basename $0)
LOGFILE="/tmp/${LOGFILE=}.log"
LOGSIZE=0
LOGMAXB=4096
function err
{
echo "ERREUR : $1" >> ${LOGFILE}
exit 1
}
function prt
{
echo "$1" >> ${LOGFILE}
}
echo "Will log to ${LOGFILE}"
mkdir -p blacklist
cd blacklist
[ -f ${LOGFILE} ] && LOGSIZE=`wc -c ${LOGFILE}`
LOGSIZE=${LOGSIZE%% *}
prt "${LOGFILE} size = ${LOGSIZE}."
[ ${LOGSIZE} > ${LOGMAXB} ] && truncate -s 0 ${LOGFILE} && prt "${LOGFILE} truncated !"
DATE=$(date)
prt "** DEBUT : ${DATE} **"
prt "Chargement des blacklists..."
wget -N -q http://www.shallalist.de/Downloads/shallalist.tar.gz
[ $? -ne 0 ] && err "FTP shallalist.tar.gz"
wget -N -q http://www.shallalist.de/Downloads/shallalist.tar.gz.md5
[ $? -ne 0 ] && err "FTP shallalist.tar.gz.md5"
DATE=$(date)
prt "Blacklists+md5sum chargées / ${DATE}"
md5sum -c shallalist.tar.gz.md5 >> ${LOGFILE}
[ $? -ne 0 ] && err "md5sum check" || prt "md5sum OK !"
tar -xvf shallalist.tar.gz BL/violence/domains BL/porn/domains >> ${LOGFILE}
[ $? -ne 0 ] && err "Extraction required subpathes from shallalist.tar.gz"
mv BL/porn/domains adult_domains >> ${LOGFILE}
[ $? -ne 0 ] && err "No domains in porn"
mv BL/violence/domains violence_domains >> ${LOGFILE}
[ $? -ne 0 ] && err "No domains in violence"
\rm -rf BL >> ${LOGFILE}
prt "Formate adult_domains et crée dnsmasq.filter.conf..."
sed -e 's/.*/address=\/&\/127.0.0.1/' adult_domains > dnsmasq.filter.conf
[ $? -ne 0 ] && err "sed returned $?" || prt "OK !"
prt "Formate violence_domains et l'ajoute à dnsmasq.filter.conf..."
sed -e 's/.*/address=\/&\/127.0.0.1/' violence_domains >> dnsmasq.filter.conf
[ $? -ne 0 ] && err "sed returned $?" || prt "OK !"
prt "Efface les fichiers temporaires..."
\rm -rf adult_domains violence_domains >> ${LOGFILE}
prt "Remplace /etc/dnsmasq.more.conf et relance dnsmasq"
cp dnsmasq.filter.conf /etc/dnsmasq.more.conf >> ${LOGFILE}
service dnsmasq restart >> ${LOGFILE}
DATE=$(date)
prt "** FINI : ${DATE} **"
exit $?
Code : Tout sélectionner
# m h dom mon dow command
0 0 * * 1 truncate -s 0 /tmp/dnsmasq.log
0 8 * * 3,5 /root/update_blacklist_shalla.sh
Pour tester sur le PI:
Code : Tout sélectionner
# dig google.fr
; <<>> DiG 9.10.3-P4-Raspbian <<>> google.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61122
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1460
;; QUESTION SECTION:
;google.fr. IN A
;; ANSWER SECTION:
google.fr. 228 IN A 216.58.209.227
;; Query time: 449 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Jan 19 14:35:29 CET 2018
;; MSG SIZE rcvd: 54
Si on essaye un domaine interdit:
Code : Tout sélectionner
# dig tukif.com
; <<>> DiG 9.10.3-P4-Raspbian <<>> tukif.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43505
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;tukif.com. IN A
;; ANSWER SECTION:
tukif.com. 0 IN A 127.0.0.1
;; Query time: 164 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Jan 19 14:37:42 CET 2018
;; MSG SIZE rcvd: 43
A noter que la 1ère résolution (ensuite c'est en cache) peut être un peu longue, genre 1 ou 2s... Il doit y avoir quand même 800k noms de domaines filtrés (la liste université Toulouse c'était le double). Mais ce n'est que le 1er coup et si on se limite aux comptes/machines des enfants c'est acceptable pour leur usage. En cas de souci, dnsmasq permet de configurer le nb d'entrée pouvant être mises en cache et pour quelle durée...
Quand tout fonctionne sur le PI, il faut aller sur les comptes/ordis des enfants (paramètres réseau ; attention, c'est en général dépendant de l'interface et il peut y avoir à faire la config en wifi ET filaire) afin de mettre en DNS l'adresse IP du raspberry (a la place de celle mise à la main ou fournie par DHCP par la box, qui sera souvent 192.168.1.1), qui devra au passage être mise en IP fixe (ou se voir allouer toujours la même adresse via une config DHCP statique par la box).
A noter que pour ma part, le tmpfs utilisé par /tmp est configuré ainsi dans /etc/fstab:
Code : Tout sélectionner
tmpfs /tmp tmpfs defaults,noatime,nosuid,size=50m 0 0