如何在 Windows 上过滤特定域名的网络连接
How to filter network connections to specific domain names on Windows
我想实现一个 Windows 服务,默认情况下 block/allow 所有网络连接和 whitelist/blacklist 特定域名(如 google.com)。
我查看了 Windows 过滤平台,但我似乎无法过滤域名,只能过滤精确的 IP。问题是域名对应的IP可能会随着时间的推移而变化,一个域名可能有多个。
我如何对域名进行此过滤?
请注意,如果您仅按 DNS 名称进行过滤,则可以使用 IP 地址轻松绕过您的过滤器。所以按 IP 地址过滤会更健壮。
您可以进行反向 IP 查找以获取关联的域名。您可能希望实现反向 IP 地址查找缓存。当它们超过其 DNS TTL 时,您将刷新缓存中的条目。
如果您只想使用域名(并取决于您要在何处进行过滤),您可以挂钩 winsock.dll。请参阅 this 上的内容。您的 winsock 挂钩将过滤 gethostbyname()
和解析 DNS 名称的其他 API。
在您的浏览器连接到由域名标识的主机之前,它会针对该域名发出 DNS 查询。您可以创建网络过滤器驱动程序来拦截 DNS 响应数据包,甚至修改它们。例如,如果特定域名被列入黑名单,那么您可以修改 DNS 响应并将 IP 地址更改为带有 HTTP-server 的主机的 IP,显示 "Web-site is blocked".
等消息
另一种可能的方法是使用 HTTP GET 请求。您可以检测数据包中的禁止 URL 并丢弃会话,或者选择伪造并注入重定向数据包。有一个名为 wwwcensor 的示例代码演示了如何完成此操作。
更复杂的方法是实现重定向器 + http 代理,基于数据包过滤器驱动程序构建的重定向器可以透明地将传出连接重定向到本地 http 代理,而本地 http 代理又可以决定如何处理特定会话。示例源代码 LAN HTTP Monitor 演示了如何实现。尽管此示例应该在网关上 运行(例如,在启用了 ICS 的 Windows 主机上)并将连接从 LAN 重定向到 Internet,但它可以很容易地修改为重定向本地连接。
披露:我编写了本文 post 中提到的示例代码。
我想实现一个 Windows 服务,默认情况下 block/allow 所有网络连接和 whitelist/blacklist 特定域名(如 google.com)。
我查看了 Windows 过滤平台,但我似乎无法过滤域名,只能过滤精确的 IP。问题是域名对应的IP可能会随着时间的推移而变化,一个域名可能有多个。
我如何对域名进行此过滤?
请注意,如果您仅按 DNS 名称进行过滤,则可以使用 IP 地址轻松绕过您的过滤器。所以按 IP 地址过滤会更健壮。
您可以进行反向 IP 查找以获取关联的域名。您可能希望实现反向 IP 地址查找缓存。当它们超过其 DNS TTL 时,您将刷新缓存中的条目。
如果您只想使用域名(并取决于您要在何处进行过滤),您可以挂钩 winsock.dll。请参阅 this 上的内容。您的 winsock 挂钩将过滤 gethostbyname()
和解析 DNS 名称的其他 API。
在您的浏览器连接到由域名标识的主机之前,它会针对该域名发出 DNS 查询。您可以创建网络过滤器驱动程序来拦截 DNS 响应数据包,甚至修改它们。例如,如果特定域名被列入黑名单,那么您可以修改 DNS 响应并将 IP 地址更改为带有 HTTP-server 的主机的 IP,显示 "Web-site is blocked".
等消息另一种可能的方法是使用 HTTP GET 请求。您可以检测数据包中的禁止 URL 并丢弃会话,或者选择伪造并注入重定向数据包。有一个名为 wwwcensor 的示例代码演示了如何完成此操作。
更复杂的方法是实现重定向器 + http 代理,基于数据包过滤器驱动程序构建的重定向器可以透明地将传出连接重定向到本地 http 代理,而本地 http 代理又可以决定如何处理特定会话。示例源代码 LAN HTTP Monitor 演示了如何实现。尽管此示例应该在网关上 运行(例如,在启用了 ICS 的 Windows 主机上)并将连接从 LAN 重定向到 Internet,但它可以很容易地修改为重定向本地连接。
披露:我编写了本文 post 中提到的示例代码。