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

时间:2015-01-06 00:40:19

标签: c# .net windows dns intercept

还有一个类似的问题(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,多年相对简单的编程经验以及对不熟悉的代码和其他所有内容的良好理解,只是不知道如何开始或寻找什么。

非常感谢能让我前进的任何事情。

2 个答案:

答案 0 :(得分:1)

一些指针,DNS正如您在某处知道如何将域名解析为IP地址的某个服务器所提到的那样。有两种类型的响应1)域的确定性和2)域的不确定性。显然任何明确的回应都会赢。

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

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

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

我的建议是遵循上面的建议或将您想要的域名添加到服务器上的本地主机表。这将为您提供您想要的。更好的解决方案是将您自己的服务器配置为域的DNS服务器,这样您就可以控制所有内容。

答案 1 :(得分:0)

我最终解决了这个问题(正如少数人所建议的那样)。

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

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