1.首先要知道dns协议的流程
dns只有两种报文:查询报文,相应报文
client查询的流程大致如下:
client 发查询报文 给nameserver nameserver查询() { if(本地资源记录host文件 成功) return 响应报文 if(查询本地缓存 cache 成功) return 相应报文 发送查询报文给上级 nameserver }
此外dns协议使用UDP 53port,可以使用一下命令查看
netstat netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序) -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。 -n : 不进行DNS轮询,显示IP(可以加速操作)
2.dnsmasq的配置文件
/etc/hosts // host文件 /etc/dnsmasq.d/*.conf /etc/dnsmasq.conf // dns配置文件 resolv.dnsmasq.conf // 记录上游dns
dnsmasq会在程序初始化时,读一次这些配置文件,之后就不会读了。
3.查看过的源码
reload_servers
作用:从resolv.dnsmasq.conf中加载上级dns 调用时机:当resolv.dnsmasq.conf被修改后 大致流程: (1) 读resolv.conf文件 (2) 构造源地址(IP = anyaddr, Port = daemon->query_port) 构造目的地址(IP = nameserver, Port = 53) (3) 构造 struct server *serv (4) 加入链表 daemon->servers (5) 清空以前的链表节点
answer_request
作用:响应client 流程: if (cache_find_by_name) 通过header返回查询结果 else failed to answer a question
cache_find_by_name
作用:输入name,从cache中查询addr 流程 (1) hash_buct(name) 得到ans,指向name相关addr的链表 (2) 删除链表中超时的节点 (3) 确认ans的名字正确 (4) 返回ans
extract_addresses
作用:通过上游nameserver查询得到 addr
dns cache相关的数据结构
cache.c中定义,是一个hash表加链表的结构。
节点为:struct crec