我想实现一项Windows服务,该服务默认阻止/允许所有网络连接和白名单/黑名单特定域名(如google.com)。
我查看了Windows过滤平台,但似乎我不能过滤域名,只能在确切的IP上过滤。问题是与域名相对应的IP可能会随时间而变化,并且一个域名可能有多个。
如何对域名进行过滤?
答案 0 :(得分:2)
请注意,如果您只按DNS名称进行过滤,则可以使用IP地址轻松规避过滤器。因此,按IP地址过滤将更加强大。
您可以执行反向IP查找以获取关联的域名。您可能希望实现反向IP地址查找缓存。当他们超过DNS TTL时,您将刷新缓存中的条目。
如果您只想坚持使用域名(并且根据您想要进行过滤的位置),您可以挂钩winsock.dll。请参阅SO上的this。您的winsock挂钩将过滤gethostbyname()
和其他解析DNS名称的API。
答案 1 :(得分:0)
在浏览器连接到域名标识的主机之前,它会为该域名发出DNS查询。您可以创建网络过滤器驱动程序来拦截DNS响应数据包甚至修改它们。例如,如果特定域名被列入黑名单,那么您可以修改DNS响应并使用HTTP服务器将IP地址更改为主机的IP,该服务器显示消息,例如&#34;网站被阻止&#34;。< / p>
另一种可能的方法是播放HTTP GET请求。您可以检测数据包中的禁用URL并删除会话,也可以选择伪造和注入重定向数据包。有一个名为wwwcensor的示例代码,演示了如何完成此操作。
更复杂的方法是实现重定向器+ http代理,基于数据包过滤器驱动程序构建的重定向器可以透明地将传出连接重定向到本地http代理,而后者又可以决定如何处理特定会话。示例源代码LAN HTTP Monitor演示了如何实现此功能。虽然此示例应该在网关上运行(例如,在启用了ICS的Windows主机上)并将连接从LAN重定向到Internet,但可以轻松修改它以重定向本地连接。
披露:我撰写了本文中提到的示例代码。