摘要
- 一、How DNS Works
- 二、How Route Works
- 三、How ARP Works
How DNS Works
域名系统(Domain Name System,DNS)将域名和 IP 地址相互映射,能够使人更方便地访问互联网。DNS 最早于 1983 年由保罗·莫卡派乔斯(Paul Mockapetris)发明(RFC 882,RFC 883),1987年发布了修正(RFC 1034,RFC 1035),在此之后 DNS 技术基本上没有改动。
DNS 协议使用端口 53 ,同时兼容 TCP (RFC-793) 和 UDP(RFC-768) ,但是考虑到更低的开销及性能,DNS 查询通常使用 UDP 协议。DNS 消息包括请求和响应两部分, 所有报文包含标题和其他片断 (例如 question 和 RR ,取决于报文类型)。
- DNS Message - Header: 给出语义的上下文,包括查询个数、结果个数、 会话 ID 等
- DNS Message - Question: 包含要针对 nameserver 执行的查询
- DNS Message - RR: 包装格式相同, 可以根据类型分析字段 (RDATA)
The DNS assumes that messages will be transmitted as datagrams or in a byte stream carried by a virtual circuit. While virtual circuits can be used for any DNS activity, datagrams are preferred for queries due to their lower overhead and better performance. — 《RFC-1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION》
1 | $ping baidu.com | head -1 |
unknown host
strace 是 Linux 环境下的一款程序调试工具,用来监视一个应用程序所使用的系统调用及它所接收的系统信息。借助 strace 我们可以更好地理解 DNS 工作原理。
1 | $ping baidu.com |
hosts - static table lookup for hostnames
/etc/hosts 主机名查询静态表;主要用于IP地址与计算机主机名之间的转换。与 /etc/resolv.conf 的区别是,用户可以直接对 hosts 文件进行控制。一般情况下,我们主要通过 DNS 自动提供动态的主机名解析。不过 hosts 文件仍然是一个可以作为备用手段。
- 【IPv4】 127.0.0.1 localhost
- 【FQDN】 192.168.1.10 foo.mydomain.org foo
- 【FQDN】 209.237.226.90 www.opensource.org
- 【IPv6】 ::1 localhost ip6-localhost ip6-loopback
- 【IPv6】 ff02::1 ip6-allnodes
- 【IPv6】 ff02::2 ip6-allrouters
/etc/resolv.conf
/etc/resolv.conf DNS 客户机配置文件,用于设置 DNS 服务器的 IP 地址及 DNS 域名,还包含了主机的域名搜索顺序。
值得注意的是,许多程序能够覆盖 /etc/resolv.conf 里的内容(例如 dhcpcd, NetworkManager ),但是有些时候我们希望能够手动设定 DNS 设置(比如使用静态IP时),可以参考以下几种方法:
- 修改 dhcpcd 配置,echo “nohook resolv.conf” > /etc/dhcpcd.conf
- 创建 resolv.conf.head ,dhcpcd将把这个文件插入到 /etc/resolv.conf 文件头.
- 写保护 /etc/resolv.conf,chattr +i /etc/resolv.conf
1 | # vi /etc/resolv.conf |
1 |
|
NSSwitch
nsswitch.conf(name services switch)是 SUN 公司开发的一种扩展。每一行都标识特定类型的网络信息(如主机、口令和组)以及信息源(如 NIS+ 表、NIS 映射、DNS 主机表或本地 /etc)。
NSSwitch is not just for DNS lookups. It’s also used for passwords and user lookup information.
1 | # more /etc/nsswitch.conf |
dig | Domain Information Groper
dig(Domain Information Groper,域信息搜索器)命令是一个用于查询 DNS 的工具。dig 总共有42个查询选项,涉及到 DNS 信息的方方面面,在 DNS 问题诊断时可以将整个过程信息输出。
1 | dig +nocmd google.com 输出过滤版本信息 |
1 | # dig +short google.com |
DNS Coding API
1 | package main |
案例
重点案例:ARP 与网关欺骗攻击
hyperfox:HTTP/HTTPs MITM proxy and traffic recorder with on-the-fly TLS cert generation.
Tips
DNS Tools
chrome DNS Cache
1
2
3
4# 浏览器
chrome://net-internals/#dns
# 清空缓存
“clean host cache”Windows DNS Cache
1
2
3
4# 查看缓存
ipconfig /displaydns
# 清空缓存
ipconfig /flushd nsMac OS X
1
$ sudo killall -HUP mDNSResponder
Linux
1 | # 清空DNS缓存,重启 nscd 进程 |
- 网卡流量 nLoad
1
2
3
4
5
6wget http://www.roland-riegel.de/nload/nload-0.7.2.tar.gz
tar zxvf nload-0.7.2.tar.gz
cd nload-0.7.2
./configure
make -j4
make install
bond
1 | # modinfo bonding |
拓展阅读
电子书《Linux Perf Master》
性能诊断指南
How Linux Works
- How Linux Works:The Big Picture
- How Linux Works:BASIC Commands
- How Linux Works:BASIC Commands Extension
- How Linux Works:Device and FileSystem
- How Linux Works:Boots
- How Linux Works:用户空间
- How Linux Works:内存管理
- How Linux Works:网络管理
- PreviewHow Linux Works:路由管理
动态追踪技术
- 动态追踪技术(一):DTrace 导论
- 动态追踪技术(二):strace+gdb 溯源 Nginx 内存溢出异常
- 动态追踪技术(三):Tracing Your Kernel Function!
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- 动态追踪技术(五):Welcome DTrace for Linux
案例与实务
- 最佳工程实践:Stack Overflow 架构 - 2016 Edition
- 最佳工程实践:Oracle 数据库迁移割接实践
- 最佳工程实践:基于LVS的AAA负载均衡架构实践
- VIPServer | Facebook Open-sourcing Katran, a scalable network load balancer
扩展阅读
参考文献
- RFC-1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION
- Writing DNS messages from scratch using Go
- hosts - static table lookup for hostnames | Linux Programmer’s Manual
- strace 跟踪进程中的系统调用
- Anatomy of a Linux DNS Lookup – Part I
- Anatomy of a Linux DNS Lookup – Part II
- Find DNS records programmatically
- Build a DNS server in Golang
- 网卡收包流程 | 原创 2017-03-16 信鸽工程师Henry 腾讯大数据
- Linux下进程/程序网络带宽占用情况查看工具 – NetHogs
- 每天一个linux命令(53):route命令