如何在Windows上过滤网络连接以特定域名为目标

8
我想实现一个 Windows Service,它默认情况下将阻止/允许所有网络连接,并白名单/黑名单特定的域名(如google.com)。
我研究了Windows Filtering Platform,但似乎无法过滤域名,只能过滤精确IP。问题在于,对应于域名的IP可能会随着时间而变化,一个域名可能有多个IP。
我该如何对域名进行过滤?
2个回答

4
请注意,如果您仅按DNS名称过滤,则可以使用IP地址轻松规避您的过滤器。因此,通过IP地址进行过滤将更加健壮。您可以执行反向IP查找以获取关联的域名。您可能需要实现反向IP地址查找缓存。当条目超过其DNS TTL时,您将清除缓存中的条目。如果您要仅使用域名(并取决于您要在何处进行过滤),则可以挂钩winsock.dll。请参见SO上的此内容。您的winsock钩子将过滤gethostbyname()和其他解析DNS名称的API。

如果您只有一个白名单,您可以创建一个允许的 IP 地址列表,不用担心反向查找。但是如果您有黑名单,您将收到“未知”的IP地址,这些地址可能不在白名单中,也可能不在黑名单中。必须查找这些地址。谷歌搜索反向IP查找。不知道WFP的详细信息。但是如果回调例程可以阻止,则可以在例程内进行查找-同步执行查找。 - Χpẘ
现在我想起来了,当进行反向IP查找时,你会得到一个资源名称(机器名称),而不是确切的域名。我不确定那样是否可行。 - anotherCode245
我现在正在工作,无法进行ping测试,但是我记得使用ping -a会返回完全限定域名(FQDN)。所以你可以得到资源名称,但是域名是资源名称的一部分。你可以将白名单条目与反向IP查找名称的结尾子字符串匹配。 - Χpẘ
这有保证吗?如果我尝试反向IP查找以下域名rts.ch,其IP为146.159.95.38,我会得到资源名称ns1.p23.dynect.net - anotherCode245
dynect.net是一项动态DNS服务。我对动态DNS协议不是很熟悉,你需要弄清楚它的工作原理并特别处理它。 - Χpẘ
显示剩余3条评论

0

在您的浏览器连接到由域名标识的主机之前,它会发出该域名的DNS查询。您可以创建一个网络过滤驱动程序来拦截DNS响应数据包,甚至修改它们。例如,如果特定的域名被列入黑名单,则可以修改DNS响应并将IP地址更改为具有显示“网站已被阻止”消息的HTTP服务器的IP。

另一种可能的方法是玩弄HTTP GET请求。您可以在数据包中检测到禁止的URL并丢弃会话,或者选择伪造和注入重定向数据包。有一个名为wwwcensor的示例代码演示了如何实现此操作。

更复杂的方法是实现重定向器+http代理,基于数据包过滤驱动程序构建的重定向器可以透明地将传出连接重定向到本地http代理,后者可以决定如何处理特定的会话。示例源代码LAN HTTP Monitor演示了如何实现此操作。虽然此示例应在网关上运行(例如,在启用ICS的Windows主机上),并将连接从局域网重定向到Internet,但可以轻松修改以重定向本地连接。

声明:本文提到的示例代码由我编写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接