dnsmasq 源码解析--dns缓存部分

1.首先要知道dns协议的流程

dns只有两种报文:查询报文,相应报文

client查询的流程大致如下:

client 发查询报文 给nameserver
nameserver查询()
{
      if(本地资源记录host文件 成功) return 响应报文
      if(查询本地缓存 cache 成功) return 相应报文
      发送查询报文给上级 nameserver   
}

因此使用dnsmasq作为本地nameserver的情况如下

本地client 指向  dnsmasq nameserver
dnsmasq nameserver 指向 上游dns(如8.8.8.8

因此需要将/etc/resolv.conf 中 nameserver 设置为 127.0.0.1.

而/etc/resolv.dnsmasq.conf 中 nameserver 设置上游dns 8.8.8.8

此外dns协议使用UDP 53port,可以使用一下命令查看

netstat 
netstat命令各个参数说明如下:
  -t : 指明显示TCP端口
  -u : 指明显示UDP端口
  -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)
  -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。
  -n : 不进行DNS轮询,显示IP(可以加速操作) 

由于port 53是被防火墙默认允许的,所以不需要设置防火墙。

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

猜你喜欢

转载自www.cnblogs.com/yangxinrui/p/11736670.html