我想实现一个 Windows 服务,默认情况下会阻止/允许所有网络连接和白名单/黑名单特定域名(如 google.com)。
我查看了 Windows 过滤平台,但似乎我无法过滤域名,只能过滤确切的 IP。问题是域名对应的IP可能会随着时间的推移而变化,一个域名可能有多个。
如何对域名进行此过滤?
请注意,如果您仅按 DNS 名称进行过滤,则可以通过使用 IP 地址轻松绕过您的过滤器。所以按IP地址过滤会更健壮。
您可以进行反向 IP 查找以获取关联的域名。您可能希望实现反向 IP 地址查找缓存。当条目超过其 DNS TTL 时,您将刷新缓存中的条目。
如果您只想坚持使用域名(并且取决于您想要在哪里进行过滤),您可以挂钩 winsock.dll。在 SO 上看到这个。您的 winsock 挂钩将过滤gethostbyname()
和解析 DNS 名称的其他 API。
在您的浏览器连接到由域名标识的主机之前,它会针对该域名发出 DNS 查询。您可以创建网络过滤器驱动程序来拦截 DNS 响应数据包,甚至修改它们。例如,如果特定域名被列入黑名单,那么您可以修改 DNS 响应并将 IP 地址更改为具有 HTTP-server 的主机的 IP,显示类似“网站被阻止”的消息。
另一种可能的方法是围绕 HTTP GET 请求进行处理。您可以检测数据包中的禁止 URL 并丢弃会话,或者可以选择伪造并注入重定向数据包。有一个名为wwwcensor的示例代码演示了如何做到这一点。
更复杂的方法是实现重定向器 + http 代理,构建在数据包过滤驱动程序上的重定向器可以透明地将传出连接重定向到本地 http 代理,而本地 http 代理又可以决定如何处理特定会话。示例源代码LAN HTTP Monitor演示了如何实现这一点。虽然这个示例应该在网关上运行(例如,在启用 ICS 的 Windows 主机上)并将连接从 LAN 重定向到 Internet,但可以轻松修改它以重定向本地连接。
披露:我编写了这篇文章中提到的示例代码。