linux的dns解析

linux的dns解析

dns是我们最常用的功能,他就是实现一个目的,域名转换成ip,在linux系统中如何配置最好呢。

最简单的dns

系统默认会查找 /etc/resolv.conf 文件查找dns,所以我只要修改该文件就能改变系统使用的dns,像下面这样

1
2
3
[root@www ~]# vim /etc/resolv.conf
nameserver 168.95.1.1
nameserver 139.175.10.20

但是这种做法非常的不灵活。而且基本没法做动态管理, 因此 systemd-resolved.service出来了


systemd-resolved.service

看他的名字就能看出来,这是一个比较官方的实现,且很多系统预先已经安装了,它实现的功能很简单。

如果有些系统没有的话可以使用命令安装:

1
sudo apt install systemd-resolved

他做了这么几件事

  1. 在本地53端口搭建一个dns服务器,将接收到的dns请求转发给配置的上游dns
  2. 修改resolv.conf文件指向127.0.0.1,也就是将系统dns指向systemd-resolved.service
  3. 提供了一些命令行,支持通过命令改dns之类的能力

使用这个命令也能看到53已经被systemd-recolved监听了

1
2
3
4
root@armbian:/$ sudo lsof -i:53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 1461065 systemd-resolve 17u IPv4 5663216 0t0 UDP localhost:domain
systemd-r 1461065 systemd-resolve 18u IPv4 5663217 0t0 TCP localhost:domain (LISTEN)

有了他的代理就可以做一些灵活的事情了.
下面是他的配置文件,DNS字段用空格分隔多个上游dns,DNSOverTLS参数可以指定使用ssh协议加密dns数据,支持缓存啦等能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$  cat /etc/systemd/resolved.conf

[Resolve]
# Some examples of DNS servers which may be used for DNS= and FallbackDNS=:
# Cloudflare: 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
# Google: 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
# Quad9: 9.9.9.9 2620:fe::fe
#DNS=
#FallbackDNS=
#Domains=
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=yes
#LLMNR=yes
#Cache=yes
#DNSStubListener=yes
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no

smartdns或者dnsmasq

systemd-resolved.service 基本满足了我们的需求,但是还不够我们要一些更加强大的能力比如说:

  • DOT,DOH
  • 定制缓存能力, 比如某些网站的dns不缓存
  • 不同的域名使用不同的dns进行解析,比如国内网站走114.114.114.114,国外网站走8.8.8.8
  • 智能选择速度最快的地址,比如一个网站返回多个ip,智能选择一个速度最快的
  • 广告过滤, 拦截某些广告的地址,这样就变相拦截了广告

等等啦这些功能,单纯 systemd-resolved.service就不够用了。我们引入 smartdns来实现上面的功能。
dnsmasqsmartdns类似。

官网文档:smartdns官网文档

smartdns也是在本地53端口开启了一个dns服务器,并且将请求转发给他的上游dns。实现原理上与 systemd-resolved.service是没有区别的。
不过针对请求的处理上它实现了更多的功能,具体看官网介绍吧。
不过有一点是既然都是监听53端口所以会与 systemd-resolved.service冲突, 安装完成后将 systemd-resolved.service关闭掉

1
2
3
sudo systemct stop systemd-resolved.service
sudo systemct disable systemd-resolved.service
sudo systemct restart smartdns #重启smartdns

smartdns代理上游dns时可以使用 DOT、DOH 访问,所以解决了域名污染问题。

smartdns的配置文件在 /etc/smartdns目录下。下面做一些简单介绍, 细节的看官网文档非常的详细:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
root:$ cat /etc/smartdns/smartdns.conf 
# dns服务器的名称,友好展示,可以不配
server-name bf_smartdns
# 引入外部配置文件,相当于把指定的配置文件copy到当前配置文件中
conf-file /etc/smartdns/anti-ad-smartdns.conf

#绑定 tcp,udp的53端口,默认只监听了udp,有些程序会使用到tcp所以把tcp的监听也打开了
bind [::]:53
bind-tcp [::]:53
# 既然是tcp, 那就有超时时间,配置60秒
tcp-idle-time 60

# dns缓存的数量
cache-size 16384

# 强制指定 qtype 返回 SOA
# force specific qtype return soa
# force-qtype-SOA [qtypeid |...]
# force-qtype-SOA 65 28
force-qtype-SOA 65

#支持双栈,即支持ipv4和ipv6
# Enable IPV4, IPV6 dual stack IP optimization selection strategy
# dualstack-ip-selection-threshold [num] (0~1000)
# dualstack-ip-allow-force-AAAA [yes|no]
dualstack-ip-selection yes

# 配置日志,日志在 /var/log/smartdns/smartdns.log
# set log level
# log-level: [level], level=fatal, error, warn, notice, info, debug
# log-file: file path of log file.
# log-size: size of each log file, support k,m,g
# log-num: number of logs, 0 means disable log
log-level info

# log-file /var/log/smartdns/smartdns.log
# log-size 128k
# log-num 2
# log-file-mode [mode]: file mode of log file.

# 这一块是配置上游的dns,使用普通udp协议访问,因为我是用了DOH 所以这了没做配置
# remote udp dns server list
# server [IP]:[PORT] [-blacklist-ip] [-whitelist-ip] [-check-edns] [-group [group] ...] [-exclude-default-group]
# default port is 53
# -blacklist-ip: filter result with blacklist ip
# -whitelist-ip: filter result whth whitelist ip, result in whitelist-ip will be accepted.
# -check-edns: result must exist edns RR, or discard result.
# -group [group]: set server to group, use with nameserver /domain/group.
# -exclude-default-group: exclude this server from default group.
# server 8.8.8.8 -blacklist-ip -check-edns -group g1 -group g2
#server 114.114.114.114

# remote tcp dns server list
# server-tcp [IP]:[PORT] [-blacklist-ip] [-whitelist-ip] [-group [group] ...] [-exclude-default-group]
# default port is 53
# server-tcp 8.8.8.8

# 这一块是配置上游的dns,但是使用tls加密的即支持DOT的dns, 因为我是用了DOH 所以这了没做配置
# remote tls dns server list
# server-tls [IP]:[PORT] [-blacklist-ip] [-whitelist-ip] [-spki-pin [sha256-pin]] [-group [group] ...] [-exclude-default-group]
# -spki-pin: TLS spki pin to verify.
# -tls-host-verify: cert hostname to verify.
# -host-name: TLS sni hostname.
# -no-check-certificate: no check certificate.
# Get SPKI with this command:
# echo | openssl s_client -connect '[ip]:853' | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
# default port is 853
#server-tls 8.8.8.8
#server-tls 1.0.0.1


#这一块是配置上游dns,使用https协议的,即 DOH
# remote https dns server list
# server-https https://[host]:[port]/path [-blacklist-ip] [-whitelist-ip] [-spki-pin [sha256-pin]] [-group [group] ...] [-exclude-default-group]
# -spki-pin: TLS spki pin to verify.
# -tls-host-verify: cert hostname to verify.
# -host-name: TLS sni hostname.
# -http-host: http host.
# -no-check-certificate: no check certificate.
# default port is 443
# server-https https://cloudflare-dns.com/dns-query
server-https https://223.5.5.5/dns-query
server-https https://1.12.12.12/dns-query
server-https https://doh.opendns.com/dns-query
server-https https://101.101.101.101/dns-query

好啦,下面是从smartdns官网拷贝的介绍,功能是非常灵活的。

多虚拟DNS服务器
支持多个虚拟DNS服务器,不同虚拟DNS服务器不同的端口,规则,客户端。

多 DNS 上游服务器
支持配置多个上游 DNS 服务器,并同时进行查询,即使其中有 DNS 服务器异常,也不会影响查询。

支持每个客户端独立控制
支持基于MAC,IP地址控制客户端使用不同查询规则,可实现家长控制等功能。

返回最快 IP 地址
支持从域名所属 IP 地址列表中查找到访问速度最快的 IP 地址,并返回给客户端,提高网络访问速度。

支持多种查询协议
支持 UDP、TCP、DOT 和 DOH 查询及服务,以及非 53 端口查询;支持通过socks5,HTTP代理查询;

特定域名 IP 地址指定
支持指定域名的 IP 地址,达到广告过滤效果、避免恶意网站的效果。

域名高性能后缀匹配
支持域名后缀匹配模式,简化过滤配置,过滤 20 万条记录时间 < 1ms。

域名分流
支持域名分流,不同类型的域名向不同的 DNS 服务器查询,支持iptable和nftable更好的分流;支持测速失败的情况下设置域名结果到对应ipset和nftset集合。

Windows / Linux 多平台支持
支持标准 Linux 系统(树莓派)、OpenWrt 系统各种固件和华硕路由器原生固件。同时还支持 WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)。

支持 IPv4、IPv6 双栈
支持 IPv4 和 IPV 6网络,支持查询 A 和 AAAA 记录,支持双栈 IP 速度优化,并支持完全禁用 IPv6 AAAA 解析。

支持DNS64
支持DNS64转换。

高性能、占用资源少
多线程异步 IO 模式,cache 缓存查询结果。

主流系统官方支持
主流路由系统官方软件源安装smartdns。

更新

  1. ali的223.5.5.5不建议使用,有些网站解析出的域名是错误的。建议使用cloudflare的配合缓存也不会慢的。

  2. 重启smartdns可以用这个命令 sudo systemctl stop smartdns && sleep 1 && sudo rm -f /tmp/smartdns.cache && sudo systemctl start smartdns

  3. 有些doh可以用这样进行测试curl -H 'accept: application/dns-json' 'https://1.1.1.1/dns-query?name=www.google.com&type=A'

  4. 如果发现不生效可以再检查下resolve.conf文件,有时候重启机器后可能里面配置的127.0.0.1会被改成网关的192.168.1.1,怀疑是dhcp服务在修改它


linux的dns解析
https://www.huangchaoyu.com/3456619767.html
作者
hcy
发布于
2024年9月12日
更新于
2024年10月28日
许可协议