【问题标题】:C# - Globally intercept and modify DNS resolution responsesC# - 全局拦截和修改 DNS 解析响应
【发布时间】:2015-01-06 00:40:19
【问题描述】:

有一个类似的问题 (Can I temporarily override DNS resolution within a .NET application?),但我无法通过那里的微薄回应来解决这个问题。


背景资料

我在我的家庭网络中设置了一台服务器,一台旧电脑。我们的路由器转发了正确的端口,服务器运行用于 http、svn、游戏等的服务器软件。我注册了一个始终指向我们的外部 IP 地址的域名。出于所有意图和目的,我已经设置了一个典型的网络服务器。我的朋友可以通过域名连接在我的服务器上游戏,我可以推拉svn项目等。

唯一的问题是当我连接到我的家庭网络(与服务器相同的网络)时,我还需要使用我的服务器。使用域名会导致 Windows 将其解析为我们自己的 IP 地址,而我的路由器太迟钝了,无法意识到它只需要像往常一样将它转发回我们的网络到服务器。我已经进行了一些环顾、配置、远程登录和 DNS 覆盖,但我有充分的权威表明,我们的 ISP 显然削弱了他们路由器的 DNS 覆盖功能,以防止出现这种情况。显然他们不喜欢内部环回。

我现在基本上必须为我的每个服务器服务保留 2 个配置:一个配置指定我在国外时的域名,第二个配置指定我在家时的服务器内部 IP。这令人沮丧,因为它并不总是可能的。


我想实例化一个全局 DNS 解析请求/响应侦听器,它将执行以下操作:如果请求的域名与给定字符串匹配,则使用我的选择覆盖响应中的 IP。

我查过easyhook、dllimport、msdn pages等,但我仍然不知道从哪里开始,我需要访问哪些类等等。对于这个特定问题,我基本上没有预先存在的代码。

我有 Visual Studio,多年相对简单的编程经验,对不熟悉的代码和其他一切都有很好的理解,只是不知道如何开始或寻找什么。

非常感谢任何能让我前进的东西。

【问题讨论】:

  • 如果您可以使用现有工具 - Fiddler 可能会这样做(让您的客户端机器重写服务器的 IP)。
  • 不要尝试编写应用层 DNS Trickery,它只是不适合这样做的层,您将始终与内置的 TCP 堆栈支持作斗争。
  • 您可以使用\Windows\System32\drivers\etc文件夹中的hosts文件来覆盖DNS查找
  • Slava:不,这使它只在我在家而不是在国外时才有效。我对每次更改位置时都更新主机文件不感兴趣。
  • 约翰:不确定你的意思? TCP 数据包有一个标头来替换单独的 DNS 请求什么的?

标签: c# .net windows dns intercept


【解决方案1】:

几个指针,DNS 就像您提到的某个服务器,它知道如何将域名解析为 IP 地址。有两种类型的响应 1) 域的确定性和 2) 域的非确定性。显然,任何明确的回应都会获胜。

DNS 不在 TCP/IP 层运行,它使用 UDP(端口 53)在下一层运行。因此,DNS 绑定到 TCP/IP 堆栈,堆栈首先在本地查找本地主机表并查看名称是否存在,如果找不到它,堆栈将在会话开始之前发送 DNS 请求或SYN 数据包飞行。为此,DNS 服务器必须解析地址。

我不完全理解您的问题,因为大多数 Windows 服务器只有 1 个 IP 地址和一个关联的域名。除非他们当然使用 DHCP,这仅意味着服务器在启动时使用多个地址,并且 DNS 服务器接收到这些新地址的更新。

公共 IP 地址与私有 IP 地址是路由器的责任。路由器配置为执行 NAT(网络地址转换)。这允许私有服务器具有不可路由的地址,如 10.10.1.100 等。但路由器将回答公共地址的 ARP,使公共网络认为路由器是公共地址。因此,您的解决方案之一可能是将您的服务器转换为私有地址并使用可以执行 NAT 的“真实”路由器。端口转发并不是真正的路由,而是一种“欺骗”将发往一个端口号的数据包转发到专用于该应用程序的另一个端口的方法。

我的建议是按照上面的建议或将您想要的域名添加到服务器上的本地主机表中。这会让你得到你想要的。更好的解决方案是将您自己的服务器配置为您的域的 DNS 服务器,这样您就可以控制一切。

【讨论】:

  • 这有点矫枉过正......我认为你也没有完全找到问题的根源。我称楼下的机器为路由器,但如果我知道它实际上是什么,那就见鬼了。这是我们的 ISP 安装的东西,用于接收电视、互联网等,并通过 wifi、以太网、电视电缆等在房子周围传输。我说的服务器只是我在这里设置的一台电脑。它有一个内部 IP(192.168.1.9),只能从我们的家庭网络中访问,楼下的机器拥有我们的外部 IP(这是动态的)。继续...
  • 续:我注册的域名解析为我们的外部 IP,服务器运行脚本以使用我们当前的外部 IP 更新域的 DNS 条目。当有人通过我的域名连接时,如果在配置中转发了该端口,楼下的盒子会接收数据包并将它们转发到我的“服务器”。最后两段中的所有内容都超出了我的想象或不适用,因为我不能在这里安装一些新硬件。
  • 只要我的笔记本电脑连接到我的家庭网络(我在 C# 中有代码),我唯一需要做的就是用我的服务器的内部 IP 替换我的域名。这样我就可以在任何地方使用我的域名。如果我现在在家里使用它,我的路由器基本上必须将数据包转发给自己,然后无法确定它们的目的地就在我们的家庭网络中。
  • 我想我明白了你想要什么,当你在家时你想要私人地址,而在别处你想要公共地址。但是,当您在本地连接时,您应该与 PC 在同一个网络中(私人地址明智)。如果事情不正常,那么它是因为外部 DNS 服务器正在返回公共地址(这应该可以工作,但您报告它没有)。您有两个选择:1)在您的本地笔记本电脑上设置 DNS 以提供您想要的地址或 2)在您的笔记本电脑上设置主机表。
【解决方案2】:

毕竟,我最终通过(正如一些人建议的那样)hosts 文件解决了这个问题。

我首先使用 ManagedWifi 来设置网络连接监视器。它检测到我的连接状态的变化并报告网络名称。

然后我编写了一个控制台应用程序,它保持打开状态(使用 Hidden Start 允许我隐藏窗口)并安全地修改主机文件,然后刷新 DNS 缓存。这似乎几乎可以实时工作。 :)

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多