Comment filtrer les connexions réseau vers des noms de domaine spécifiques sous Windows

Je souhaite implémenter un service Windows qui bloquera / autorisera par défaut toutes les connexions réseau et les noms de domaines spécifiques à la liste blanche / liste noire (comme google.com).

J’ai regardé Windows Filtering Platform mais il ne semble pas que je puisse filtrer sur les noms de domaine, uniquement sur les adresses IP exactes. Le problème est que les adresses IP correspondant aux noms de domaine peuvent changer au fil du temps et qu’il peut y en avoir plusieurs pour un nom de domaine.

Comment puis-je effectuer ce filtrage sur les noms de domaine?

Notez que si vous filtrez uniquement par nom DNS, votre filtre peut facilement être contourné en utilisant une adresse IP. Le filtrage par adresse IP sera donc plus robuste.

Vous pouvez effectuer des recherches IP inversées pour obtenir des noms de domaine associés. Vous voudrez probablement implémenter un cache de recherche d’adresse IP inverse. Vous devez vider les entrées dans le cache lorsqu’elles ont dépassé leur TTL DNS.

Si vous souhaitez restr uniquement avec les noms de domaine (et selon l’endroit où vous voulez effectuer le filtrage), vous pouvez connecter winsock.dll. Voir ceci sur SO. Votre hook winsock filtrerait gethostbyname() et les autres API qui résolvent les noms DNS.

Avant que votre navigateur se connecte à l’hôte identifié par le nom de domaine, il émet une requête DNS pour ce nom de domaine. Vous pouvez créer un pilote de filtre réseau pour intercepter les paquets de réponse DNS et même les modifier. Par exemple, si le nom de domaine spécifique est mis sur liste noire, vous pouvez modifier la réponse DNS et changer l’adresse IP en adresse IP de l’hôte avec HTTP-server, ce qui indique que le message “Le site Web est bloqué”.

Une autre approche possible consiste à jouer autour de la requête HTTP GET. Vous pouvez détecter l’URL interdite dans le paquet et supprimer la session ou éventuellement forger et injecter un paquet de redirection. Il y a un exemple de code nommé wwwcensor qui montre comment cela peut être fait.

Une approche plus complexe consiste à implémenter un proxy redirecteur + http, le redirecteur basé sur le pilote de filtre de paquets peut redirect de manière transparente les connexions sortantes vers un proxy http local, qui à son tour peut décider quoi faire de la session particulière. L’exemple de code source LAN Monitor HTTP montre comment cela peut être implémenté. Bien que cet exemple soit censé s’exécuter sur la passerelle (par exemple, sur l’hôte Windows avec ICS activé) et redirect les connexions du réseau local vers Internet, il peut être facilement modifié pour redirect les connexions locales.

DIVULGATION: J’ai rédigé l’exemple de code mentionné dans cet article.