=============== Facebook Filter HOWTO (c) Nicolas Kovacs =============== Dernière révision : 29 mai 2015 * Problématique * Identifier les IP de Facebook * Intégrer les IP dans le pare-feu * Bloquer Facebook pendant les heures de travail Problématique ------------- J'utilise une combinaison de Squid et SquidGuard pour configurer un filtrage Internet pour les écoles, les médiathèques et les entreprises. La solution fonctionne très bien, à la seule exception de Facebook. Depuis quelque temps déjà, Facebook n'est plus disponible qu'en HTTPS, ce qui est louable en soi. Malheureusement, il est à peu près impossible de gérer les connexions sécurisées avec Squid sans sauter à travers des cerceaux en feu. Il fallait donc trouver une autre solution. En règle générale, les entreprises aussi bien que les écoles souhaitent un blocage total des réseaux sociaux, pour des raisons plus ou moins évidentes. Dans ce cas, on peut songer à configurer le blocage au niveau du pare-feu. Identifier les IP de Facebook ----------------------------- Bloquer une ou plusieurs adresses IP avec iptables, rien de plus simple. Le souci, c'est que Facebook est un géant qui dispose d'une quantité impressionnante de serveurs et d'adresses IP associées dans le monde, et que ces adresses sont susceptibles d'évoluer. Bref, c'est une cible mouvante. Pour savoir quelles sont les adresses IP diverses et variées de Facebook, on peut utiliser la commande suivante : $ whois -h whois.radb.net '!gAS32934' A953 204.15.20.0/22 69.63.176.0/20 66.220.144.0/20 66.220.144.0/21 69.63.184.0/21 69.63.176.0/21 74.119.76.0/22 69.171.255.0/24 173.252.64.0/18 69.171.224.0/19 69.171.224.0/20 103.4.96.0/22 69.63.176.0/24 173.252.64.0/19 173.252.70.0/24 31.13.64.0/18 31.13.24.0/21 66.220.152.0/21 66.220.159.0/24 69.171.239.0/24 69.171.240.0/20 31.13.64.0/19 31.13.64.0/24 31.13.65.0/24 31.13.67.0/24 31.13.68.0/24 31.13.69.0/24 31.13.70.0/24 31.13.71.0/24 31.13.72.0/24 31.13.73.0/24 31.13.74.0/24 31.13.75.0/24 31.13.76.0/24 31.13.77.0/24 31.13.96.0/19 31.13.66.0/24 173.252.96.0/19 69.63.178.0/24 31.13.78.0/24 31.13.79.0/24 31.13.80.0/24 31.13.82.0/24 31.13.83.0/24 31.13.84.0/24 31.13.85.0/24 31.13.86.0/24 31.13.87.0/24 31.13.88.0/24 31.13.89.0/24 31.13.90.0/24 31.13.91.0/24 31.13.92.0/24 31.13.93.0/24 31.13.94.0/24 31.13.95.0/24 69.171.253.0/24 69.63.186.0/24 31.13.81.0/24 204.15.20.0/22 69.63.176.0/20 69.63.176.0/21 69.63.184.0/21 66.220.144.0/20 69.63.176.0/20 Comment transforrmer ce potage numérique en quelque chose de lisible que l'on puisse servir à iptables ? $ whois -h whois.radb.net '!gAS32934' | tr ' ' '\n' A953 204.15.20.0/22 69.63.176.0/20 66.220.144.0/20 66.220.144.0/21 69.63.184.0/21 69.63.176.0/21 74.119.76.0/22 69.171.255.0/24 ... On va mettre un peu d'ordre dans tout ça : $ whois -h whois.radb.net '!gAS32934' | tr ' ' '\n' \ | sort -n -k1,1 -k2,2 -k3,3 -k4,4 A953 C 31.13.24.0/21 31.13.64.0/18 31.13.64.0/19 31.13.64.0/24 31.13.65.0/24 31.13.66.0/24 31.13.67.0/24 31.13.68.0/24 31.13.69.0/24 ... Débarrassons-nous des deux entrées initiales : $ whois -h whois.radb.net '!gAS32934' | tr ' ' '\n' \ | sort -n -k1,1 -k2,2 -k3,3 -k4,4 | tail -n+3 31.13.24.0/21 31.13.64.0/18 31.13.64.0/19 31.13.64.0/24 31.13.65.0/24 31.13.66.0/24 31.13.67.0/24 31.13.68.0/24 31.13.69.0/24 ... Intégrer les IP dans le pare-feu -------------------------------- À présent, nous pouvons intégrer ce résultat dans un script : --8<---------- /usr/local/sbin/facebook-block.sh ----------------------------- #!/bin/bash /etc/rc.d/rc.firewall restart /usr/bin/whois -h whois.radb.net '!gAS32934' | tr ' ' '\n' \ | sort -n -k1,1 -k2,2 -k3,3 -k4,4 | tail -n+3 > /tmp/fbips.txt FBIPS=$(egrep -v '(^\s+$)' /tmp/fbips.txt) for FBIP in $FBIPS; do /usr/sbin/iptables -A FORWARD -p tcp -s $FBIP -j DROP done --8<-------------------------------------------------------------------------- Essayons de lancer le script : # chmod +x /usr/local/sbin/facebook-block.sh # /usr/local/sbin/facebook-block.sh Toutes les connexions aux serveurs de Facebook sont désormais bloquées : # iptables -L -v -n ... Chain FORWARD (policy ACCEPT 12 packets, 651 bytes) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- * * 31.13.24.0/21 0.0.0.0/0 0 0 DROP tcp -- * * 31.13.64.0/18 0.0.0.0/0 0 0 DROP tcp -- * * 31.13.64.0/19 0.0.0.0/0 0 0 DROP tcp -- * * 31.13.64.0/24 0.0.0.0/0 0 0 DROP tcp -- * * 31.13.65.0/24 0.0.0.0/0 0 0 DROP tcp -- * * 31.13.66.0/24 0.0.0.0/0 ... Éditer un deuxième script pour débloquer Facebook : --8<---------- /usr/local/sbin/facebook-allow.sh ----------------------------- #!/bin/bash /etc/rc.d/rc.firewall restart /usr/bin/whois -h whois.radb.net '!gAS32934' | tr ' ' '\n' \ | sort -n -k1,1 -k2,2 -k3,3 -k4,4 | tail -n+3 > /tmp/fbips.txt FBIPS=$(egrep -v '(^\s+$)' /tmp/fbips.txt) for FBIP in $FBIPS; do /usr/sbin/iptables -A FORWARD -p tcp -s $FBIP -j ACCEPT done --8<-------------------------------------------------------------------------- Bloquer Facebook pendant les heures de travail ---------------------------------------------- À partir de là, on peut définir une série de cronjobs pour autoriser ou refuser l'accès à Facebook selon l'heure de la journée. Dans l'exemple ci-dessous, on bloque Facebook du lundi au vendredi de 8h00 à 18h00 : # crontab -e ... # Activer le blocage du lundi au vendredi à 8h00 00 8 * * 1-5 /usr/local/sbin/facebook-block.sh 1> /dev/null # Désactiver le blocage le soir à 18h00 00 18 * * * /usr/local/sbin/facebook-allow.sh 1> /dev/null ------------------------------------------------------------------------------ # vim: syntax=txt