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