域名解析应用相关知识

域名解析应用相关知识

 

一般使用gethostbyname系统函数来解析域名得到IP地址,但在linux,gethostbyname是多线程不安全的,该函数使用了内部的静态变量,因此在多个线程中使用该函数将导致无法预知问题发生(如Crash或则解析失败),推荐使用gethostbyname_rgethostbyaddr,这两个函数的功能与gethostbyname一样,除了是多线程安全而已。

       Linuxgethostbyname系统函数的工作原理为:该函数的实现是从Bind中抽出来的,进行了简化,以及按照RFC标准执行。

       网络服务模块首先进行初始化,进行下面的(1),(2)初始化

       1:读取RESOLV_HOST_CONF环境变量指定的解析配置文件,缺省是没有该环境变量的。若没有则读取/etc/host.conf (该文件的含义见下)配置文件为域名解析顺序配置文件,设定解析顺序方式。该文件更改要重起服务才能生效,不能即时生效。

       2:读取/etc/resolv.conf配置文件,该文件用于指定解析的DNS服务器,以及DNS Bind解析时的相关参数,如重试次数,超时时间等。该文件的更改是立即生效的。

Gethostbyname函数执行:

       3:读取/etc/nsswitch.conf,若是先读hosts文件,则根据名字在hosts文件中查找,若找到,则返回,hosts文件不做Cache,因此hosts文件中的更改是立即生效的;若找不到,则使用DNS  Bind客户端进行域名解析处理

       4:使用DNS Bind客户端进行域名解析时,会采用/etc/resolv.conf配置文件进行域名解析,解析的方式由resolve.conf文件决定,另外解析的选项参数也可以通过环境变量RES_OPTIONS指定

 

 

附几个LinuxDNS相关配置文件

 

1、   /etc/host.conf

当系统中同时存在DNS域名解析和/etc/hosts主机表机制时,由该/etc/host.conf确定主机名解释顺序,如

order hosts,bind    #名称解释顺序 
multi on            #允许主机拥有多个IP地址 
nospoof on          #禁止IP地址欺骗 

order是关键字,定义先用本机hosts主机表进行名称解释,如果不能解释,再搜索bind名称服务器(DNS)

Multi 文档上是指/etc/hosts中,一个域名可以配置多个IP,但好象无法实现

Nospoof 防止IP地址欺骗

 

2、   /etc/resolv.conf

配置DNS客户端,它包含了主机的域名搜索顺序和DNS服务器的地址,每一行应包含一个关键字和一个或多个的由空格隔开的参数。下面是一个例子文件:

    search dns.alisoft.com
  nameserver 172.16.22.128

nameserver 60.190.232.99

options  ndots:5 timeout:1 attempts:1  
合法的参数及其意义如下:
    nameserver
 表明DNS服务器的IP地址。可以有很多行的nameserver,每一个带一个IP地址。在查询时就按nameserver在本文件中的顺序进行,且只有当第一个nameserver没有反应时才查询下面的nameserver
  domain   声明主机的域名。很多程序用到它,如邮件系统;当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,删除所有在第一个点( .)前面的内容。
  search   它的多个参数指明域名查询顺序。当要查询没有域名的主机,主机将在由search声明的域中分别查找。domainsearch不能共存;如果同时存在,后面出现的将会被使用。
  sortlist  允许将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序。

options  这个参数一般很少有人设置,它可以设置多个选项值,以“Key:Val” 对的方式出现,可以有多个”Key:Val” 对,如上面例子。可以设置的Key有:

ndots timeout attempts debug inet6 ip6-bytestring no-ip6-dotint ip6-dotint rotate no-check-names edns0

最重要的是: timeoutattempts参数,指定了解析的超时时间和重试次数。

3、 /etc/nsswitch.conf

名字服务开关,一个常用的功能是可以动态切换域名解析的顺序,是先根据/etc/hosts文件还是DNS,默认是先读/etc/hosts文件的名字解析

 

4、  /etc/ssh/sshd_config
若发现ssh某台服务器很慢,那有可能是DNS问题,可以查看/etc/ssh/sshd_config文件,/etc/ssh/sshd_config,把UseDNS yes改为UseDNS no, 同时编辑/etc/nsswitch.conf 找到hosts那行,改成hosts: files dns [NOTFOUND=return]

 

你可能感兴趣的:(多线程,linux,服务器,search,domain,DNS服务器)