C# - 全局拦截和修改 DNS 解析响应

C# - Globally intercept and modify DNS resolution responses

有一个类似的问题 (Can I temporarily override DNS resolution within a .NET application?),但我只是想不通,那里的回复很少。


背景资料

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

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

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


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

我已经查看了 easyhook、dllimport、msdn 页面等内容,但我仍然无法弄清楚从哪里开始,我需要访问哪些类,等等。对于这个特定问题,我基本上没有预先存在的代码。

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

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

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

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

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

Public 与私有 IP 地址是路由器的责任。路由器配置为执行 NAT(网络地址转换)。这允许私人服务器拥有 unroutable 地址,如 10.10.1.100 等。但是路由器将响应 public 地址的 ARP,使 public 网络认为路由器是 public 地址。因此,您的解决方案之一可能是将您的服务器转换为私有地址,并使用可以执行 NAT 的 "real" 路由器。端口转发并不是真正的路由,而是一种将发往一个端口号的数据包 "trick" 转发到该应用程序专用的另一个端口的方法。

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

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

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

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