确定主机是解析 DNS 名称还是 IP

Posted

技术标签:

【中文标题】确定主机是解析 DNS 名称还是 IP【英文标题】:Determine if Host Is Resolved DNS Name Or IP 【发布时间】:2016-01-08 08:26:53 【问题描述】:

如果从HttpContextHttpRequestHeaders 集合中提取HOST 值,有没有办法确定返回的值是DNS 解析名称还是直接IP 地址?

示例用法

 string host = HttpContext.Current.Request.Headers["HOST"]; 

 if (host.IsIPAddress()) ... /// Something like this ?
     or
    (host.IsDNSResolved()) // Or this?

总结

很明显,可以对结果进行正则表达式模式测试以查找 IP 模式,但HttpContext 或更可能是HttpRequest 上是否有属性,甚至是来自助手的外部静态方法哪个类可以代替?

【问题讨论】:

也许一个辅助问题是,.Net 中如何获得 DNS 列表?虽然很大...... Host 标头由客户端 (en.wikipedia.org/wiki/List_of_HTTP_header_fields) 发送。从服务器端,您可以使用 Request.UserHostName 和/或 Request.UserHostAddress 而不是使用客户端标头? 我不明白读取 HOST 值的目的,因为它将与您的服务器的部署位置相同,除非它位于与处理请求的服务器不同的服务器上的负载均衡器后面。您可以做的一种方法是使用 Dns.GetHostName() 获取执行此语句的机器的主机名,以与您从 HOST 标头读取的值进行比较 @Gururaj 代码最初是在某些东西背后,我不记得那是一年半前,但是是的,它需要了解有关已解析名称 vs正确路由的 IP。 @OmegaMan - 您可以使用 Dns.GetHostName() 来获取 HostName 并将其与标头中的 Host 值进行比较。我希望它能解决您的问题 【参考方案1】:

Uri.CheckHostName()怎么样?

这会返回一个System.UriHostNameType

例子:

Uri.CheckHostName("127.0.0.1"); //=> IPv4
Uri.CheckHostName("www.google.com"); //=> Dns
Uri.CheckHostName("localhost"); //=> Dns
Uri.CheckHostName("2000:2000:2000:2000::"); //=> IPv6

当然,要使用您建议的方式,最简单的方法是创建一个扩展,如下所示:

    public static class UriExtension 
        public static bool IsIPAddress(this string input) 
            var hostNameType = Uri.CheckHostName(input);

            return hostNameType == UriHostNameType.IPv4 || hostNameType == UriHostNameType.IPv6;
        
    

结果如下:

"127.0.0.1".IsIPAddress(); //true
"2000:2000:2000:2000::".IsIPAddress(); //true
"www.google.com".IsIPAddress(); //false

【讨论】:

仅供大家参考 - Uri.CheckHostName("10"); //=> IPv4。所以,它不可靠。【参考方案2】:

您可以利用System.Net.IPAddress.TryParse Method (String, IPAddress) 并创建一个扩展方法来执行所需的功能。

public static class IpAddressExtension 
    public static bool IsIPAddress(this string ipAddress) 
        System.Net.IPAddress address = null;
        return System.Net.IPAddress.TryParse(ipAddress, out address);
    

现在允许以下操作

string host = System.Web.HttpContext.Current.Request.Headers["HOST"];

if (host.IsIPAddress()) 
    //...valid ip address

【讨论】:

【参考方案3】:

您可以做的一种方法是使用 Dns.GetHostName() 获取执行此语句的机器的主机名,以与您从 HOST 标头读取的值进行比较 - 类似这样

var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();

if(host.ToLower().Equals(machineHostName.ToLower()))

    // Perform your action here.

【讨论】:

以上是关于确定主机是解析 DNS 名称还是 IP的主要内容,如果未能解决你的问题,请参考以下文章

DNS代理的作用

DNS域名解析协议

DNS域名记录

虚拟机安装的ubuntu 12.04 版本只能ping ip地址,ping不了域名。宿主机是win7,校园网+寝室路由器。

DNS服务器介绍——创建DNS正反解析区域

网络介绍