在 Qt/C++ 中,如何在没有 HOSTS 文件的情况下将 x.com 域重定向到 Windows 上的 y.com?

In Qt/C++, How Do I Redirect x.com Domain to y.com on Windows without HOSTS file?

我一直在考虑在 OS 级别运行的广告拦截器的概念,而不是作为浏览器扩展。我知道我可以将 x.com 放在 Windows' %windows%\system32\drivers\etc\hosts 文件中并将其指向 y.com 的 IP,然后在 y.com 我可以提供内容 "This ad blocked by Example Ad Blocker"。但是,我拥有的域列表非常大——实际上有 1000 个域并且还在不断增加,因此这在文件查找中效果不佳。 Windows 是否允许以编程方式(如 Qt/C++)以更快速的方式添加 DNS 重新路由规则?

存在使用 API 进行域拦截和 DLL 挂钩的风险,因为 AV 产品 and/or Microsoft 必须将您列入白名单并对您进行认证,以便您的 activity 看起来不像病毒。他们这样做的可能性不仅很低(除非你是一家价值数百万美元的公司),而且他们也想保护他们的广告营销。

最好的选择是为每个浏览器制作一个浏览器扩展。您甚至可以检查 source code of the AdBlock Chrome extension 以了解它是如何工作的。然而,2017 年的问题在于,目前还没有通用的浏览器扩展平台。它越来越近了,但它仍然没有标准化。新标准使用Chrome标准。 Opera、Firefox、Edge,当然还有 Chrome 在某种程度上支持这个新标准,但它仍然有点不流畅。对于除此之外的任何人,例如 IE11 或更早版本,他们不会拥有您的 Chrome 样式的浏览器扩展,您将不得不走非常艰难的路线来为那些更早的浏览器制作一个或在安装您的广告软件产品时要求客户升级。

如果您想要不需要浏览器扩展的东西,那么您想要的选项是在用户的 DNS 客户端设置中添加另一个 DNS 服务器连接。我还不知道如何通过 C#、Qt/C++ 或 C++ 执行此操作。但是,您可以 shell 从这些语言中退出并使用 "netsh" 命令来创建这些 DNS 连接。可能一个好的策略是找到用户的默认网关 IP。然后,像这样设置 DNS 优先级:

  • 将 x.com 重定向到 y.com 的 DNS 服务器,以便您可以通过网络服务器 y.com 进行广告拦截
  • 用户默认网关IP
  • Google 的 DNS (8.8.8.8),以防用户的默认网关 IP 已更改

所以,这将类似于这 4 个 netsh 命令:

netsh delete dnsserver "Wireless Network Connection" all
netsh interface ip add dns name="Wireless Network Connection" addr=1.1.1.1 index=1
netsh interface ip add dns name="Wireless Network Connection" addr=192.168.254.254 index=2
netsh interface ip add dns name="Wireless Network Connection" addr=8.8.8.8 index=3

如果他们的计算机使用有线而不是无线,请将 "Wireless Network Connection" 更改为 "Local Area Connection"。 (现在很少有人这样做了。)

将 1.1.1.1 更改为您的专用 DNS 服务器的 IP 地址。

将192.168.254.254改成他们默认网关的IP地址。

第三条规则 (8.8.8.8) 告诉计算机在其他所有方法都失败时使用 Google 的 DNS。这很重要,因为他们可以在家里断开笔记本电脑并去咖啡馆或其他地方,我们需要他们的 DNS 东西仍然有效。

现在,一旦您正确设置了 DNS 客户端,您就需要一个便宜的 Linux 云主机来提供 DNS 服务器和 Web 服务器。您甚至可能需要多个,以防一个因维护而停机,并且可能在不同的云区域甚至云托管提供商上。

对于 DNS 产品,如果您有 Linux 技能,您可以很容易地安装和配置 dnsmasq,从而在 Linux 上获得一个便宜且易于管理的 DNS 服务器。或者,如果您搜索 Linux 存储库,您可以找到其他 DNS 服务器,有些比其他的更强大,有些比其他的更难使用。

对于Web产品,您可以在两个DNS服务器上分别安装NGINX或Apache。然后,您可以进行任何域连接都可以访问的配置,它将加载该域的网页。该网页可以用非常小的字体(小到足以填满广告位)说 "Ad Blocked By X Ad Blocker" 或任何您想要的内容。

一切就绪后,您必须重新启动 Win PC 客户端并清除其浏览器缓存和历史记录,以便 DNS 将通过新安排进行路由。

最终结果是,当 Windows PC 上的人上网并加载广告时,他们的 OS 将发出 DNS 请求,将域名转换为 IP 地址。他们将到达的第一个 DNS 服务器将是您的私人 DNS 服务器。然后它可以说 x.com 广告域(作为示例)是您的私有 DNS 服务器的 IP 地址。然后将联系该私人网络服务器并显示广告拦截消息。对于您的 DNS 服务器未提供的所有其他请求,它们将转到其默认网关。如果那没有按需要提供 DNS,那么他们将故障保护到 8.8.8.8 上的 Google DNS。因此,网络浏览将正常运行,减去广告。

至于坏域列表,有一个 community-maintained bad domains list here on Github

您托管的私有 DNS 服务器的问题在于,您现在必须为大量连接支付带宽费用。这可能是不可取的,除非您有适当的方法将其货币化。更好的策略是不在 Web 上使用私有 DNS 服务器,而是使用本地 DNS 服务器和本地 Web 服务器。您必须对这两者进行编码或为此使用某些第三方产品。然而,这里的问题是您可能会遇到一些商业许可问题,或者成本增加,并且它不适用于一些已经在其工作站上使用 Web 服务器的 Web 开发人员。

Therefore, as you can see from the added costs, hassle, and workstation configuration nuance troubles, the best strategy would be to use the browser extension for ad blocking.

然而,即便如此,您如何将您的产品与市面上已经取得轰动效应的免费广告拦截器区分开来?