【问题标题】:How to filter network connections to specific domain names on Windows如何在 Windows 上过滤特定域名的网络连接
【发布时间】:2016-07-11 02:36:12
【问题描述】:

我想实现一个默认阻止/允许所有网络连接和白名单/黑名单特定域名(如 google.com)的 Windows 服务。

我查看了 Windows 过滤平台,但似乎我无法过滤域名,只能过滤确切的 IP。问题是域名对应的IP可能会随时间变化,一个域名可能有多个。

如何对域名进行过滤?

【问题讨论】:

    标签: c# .net windows winapi wfp


    【解决方案1】:

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

    另一种可能的方法是围绕 HTTP GET 请求进行处理。您可以检测数据包中的禁止 URL 并丢弃会话,或者可以选择伪造并注入重定向数据包。有一个名为wwwcensor 的示例代码演示了如何做到这一点。

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

    披露:我编写了这篇文章中提到的示例代码。

    【讨论】:

      【解决方案2】:

      请注意,如果您仅按 DNS 名称进行过滤,则可以通过使用 IP 地址轻松绕过您的过滤器。所以按IP地址过滤会更健壮。

      您可以进行反向 IP 查找以获取关联的域名。您可能希望实现反向 IP 地址查找缓存。当条目超过其 DNS TTL 时,您将刷新缓存中的条目。

      如果您只想坚持使用域名(并且取决于您想要在哪里进行过滤),您可以挂钩 winsock.dll。请参阅 SO 上的this。您的 winsock 挂钩将过滤 gethostbyname() 和其他解析 DNS 名称的 API。

      【讨论】:

      • 我确实需要这个过滤器是健壮的,这样就不能通过直接使用 IP 地址来规避它。我真的需要将域名列入{白名单、黑名单},因为我无法提前知道 IP 地址,而且它们可能会改变。我不确定我是否得到了反向 IP 查找的想法。如果我将 DNS 查询返回的 IP 列入白名单(并在 DNS TTL 之后刷新它),那么 DNS 查找实际上不是更有用吗?
      • 另外,您将在哪里实施反向 IP 查找检查?您需要一个自定义回调例程。我不确定在 WFP 中是否可行。
      • 如果您只有一个白名单,您可以创建所有允许的 IP 地址的列表,而不必担心反向查找。但是,如果您有黑名单,您将收到“未知”IP 地址,这些地址可能不在白名单中,也可能不在黑名单中。这些将不得不查。谷歌进行反向 IP 查找。不知道粮食计划署的细节。但是如果回调例程可以阻塞,那么您可以在例程中进行查找 - 同步执行查找。
      • 现在我想起来了,在进行反向 IP 查找时,您会得到一个资源名称(机器名称),而不是域名。我不确定那是否可行。
      • 我现在在工作,无法 ping 通,但我记得使用 ping -a 会导致获得 FQDN。所以是的,你得到一个资源名称,但域名是资源名称的一部分。您可以将白名单条目与反向 IP 查找名称的结束子字符串进行匹配。
      猜你喜欢
      • 2019-11-05
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2011-04-19
      • 2012-07-18
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多