如何使用 DNSMAQ 搭建 DNS 服务器?
nanshan 2024-10-25 13:08 12 浏览 0 评论
作者 | 阿文
责编 | 郭芮
DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。自己搭建公共DNS更加灵活,如果是在本地搭建,还可以大幅提高解析速度。
相比较BIND那复杂的配置来说,dnsmasq轻量很多。
概念
首先,我们需要了解几个概念,即根服务器和 DNS 的解析步骤方便大家理解。
根域名服务器(root name server)是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域名的权威域名服务器的地址。我们在网址中键入的域名,其背后都需要通过 DNS 系统去解析返回 IP,从而让用户访问指定的服务器资源。而 DNS 查询解析记录并不是直接去根服务器去查询,而是逐级递归往上一层一层的去查。
目前世界上共计有 13 台根服务器,由12 个不同的独立组织运营,其中美国控制的有10台,欧洲2台,位于英国和瑞典,亚洲1台位于日本。具体的根服务器信息,可也在 https://root-servers.org/ 查看。
我们可以使用 dig 命令去查看即可,如下所示:
# dig
; <<>> DiG 9.10.6 <<>> @114.114.114.114
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26189
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 658 IN NS a.root-servers.net.
. 658 IN NS b.root-servers.net.
. 658 IN NS c.root-servers.net.
. 658 IN NS d.root-servers.net.
. 658 IN NS e.root-servers.net.
. 658 IN NS f.root-servers.net.
. 658 IN NS g.root-servers.net.
. 658 IN NS h.root-servers.net.
. 658 IN NS i.root-servers.net.
. 658 IN NS j.root-servers.net.
. 658 IN NS k.root-servers.net.
. 658 IN NS l.root-servers.net.
. 658 IN NS m.root-servers.net.
;; Query time: 39 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Wed Jun 26 17:30:51 CST 2019
;; MSG SIZE rcvd: 239
可以看到,根服务器以 A到 M 开头的二级域名后面跟上 root-servers.net ,正好是 13 台,但是这 13 并不是物理上的 13 台,而是逻辑上的 13 台,其背后拥有几百台的镜像机器来为其分担请求,全球很多国家都有根服务器的镜像,这些镜像服务器主要是用来分担根服务器的负载。
一次DNS 查询可以短到两个包:一个查询包、一个响应包,顾名思义,查询包是用来发送查询的,例如你要查询www.baidu.com 的解析结果,而响应包则会返回解析结果给你。
事实上,一个 DNS 的查询过程非常复杂,它分成很多个步骤:
第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果(域名对应的IP地址)返回。
第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址。
第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
第五步:重复第四步,直到找到正确的纪录。
第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
DNS服务器通过分级查询逐级获取到对应域名的 IP 地址,大致过程如下:
从"根域名服务器"查到"顶级域名服务器"的NS记录和A记录;
从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录;
从"次级域名服务器"查出"主机名"的IP地址。
这里提到了一些概念,例如 NS A 记录,这些是 DNS 的记录类型,常见的记录类型有:
A地址记录(Address),返回域名指向的IP地址。
NS域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
MX邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
CNAME规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。
PTR逆向查询记录(Pointer Record),只用于从IP地址查询域名
CAACAA(Certification Authority Authorization,证书颁发机构授权)是一项防止HTTPS证书错误颁发的安全措施,遵从IETF RFC6844。从2017年9月8日起,要求CA(Certification Authority,证书颁发)机构执行CAA强制性检查。
通常来说,为了服务的安全可靠,至少应该有两条NS 记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。
DNS 并不安全
事实上,DNS 是一个很古老的协议,其设计并非完美,存在很多问题,比如劫持、不加密等问题。那么什么是 DNS 劫持呢?
DNS劫持又称域名劫持,是指通过某些手段取得某域名的解析控制权,修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址。
如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS劫持的基本原理。
DNS 劫持危害十分严重,轻则导致不能上网,影响网速,重则导致被黑客诱导到恶意网站,导致个人财产和信息泄露或者发布恶意广告。
因此,一般我们建议大家把 DNS 地址修改为公共的 DNS,如上面我们所说的 DNS 原理,公共的 DNS 由于使用人数多,其缓存数据更新也比一般的 DNS 要快,解析结果更准确,此外,其带来的一个好处就是避免被劫持。
目前也有其他的方案可以防止劫持,例如 DNSSEC,域名系统安全扩展,DNSSEC旨在保护应用程序(以及服务这些应用程序的缓存解析器)免受伪造或不当操纵的DNS数据所造成的影响例如域名服务器缓存污染的数据。来自DNSSEC保护区的所有答案都经过数字签名。通过检验数字签名,DNS解析器可以核查信息是否与区域所有者发布的信息相同(未修改和完整),并确系实际负责的DNS服务器所提供。
或者可以自己搭建一个 DNS 服务器。例如在本地搭建一个 dnsmaq 小型的 DNS 服务器来防止劫持。
安装dnsmaq
以 centos 7 为例,直接执行如下命令:
yum -y install dnsmasq
配置
1.配置文件在 /etc/dnsmasq.conf
,我们要让它能用起来需要做如下配置:
#指定上游dns服务器
resolv-file=/etc/resolv.dnsmasq.conf
#表示严格按照 resolv-file 文件中的顺序从上到下进行 DNS 解析, 直到第一个成功解析成功为止
strict-order
# 开启后会寻找本地的hosts文件在去寻找缓存的域名,最后到上游dns查找
#no-resolv
listen-address=0.0.0.0 #0.0.0.0 设置为公网IP
conf-dir=/etc/dnsmasq.d # 我们的解析记录都写到这个目录下
2.创建 /etc/resolv.dnsmasq.conf
,然后添加:
# cat /etc/resolv.dnsmasq.conf
nameserver 119.29.29.29
nameserver 114.114.114.114
nameserver 8.8.8.8
nameserver 168.95.1.1
3.然后创建 /etc/dnsmasq.d/cloud.conf
,添加:
address=/baidu.com/127.0.0.1 #将百度的域名解析到127.0.0.1
address=/ad.youku.com/127.0.0.1 # 禁止优酷广告
address=/ad.iqiyi.com/127.0.0.1 # 禁止iqiyi广告
格式是:
address=/domain.com/dns
比如上面的百度,我就把它都解析到127.0.0.1。
实现DNS分流
server=/cn/114.114.114.114 # cn的域名都走114的dns
server=/google.com/115.159.220.214 # 将谷歌的解析都走115.159.220.214
上面的是将所有cn结尾的域名都走114解析,下面是将google.com 走115.159.220.214解析。
开启防火墙53端口后,本地测试下 53 端口是否是通的:
? www nc -vuz 121.42.18.6 53
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif
src 192.168.2.32 port 49939
dst 121.42.18.6 port 53
rank info not available
Connection to 121.42.18.6 port 53 [udp/domain] succeeded!
启动dnsmaq:
service dnsmasq start
设置为开机自启动。
# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
测试
? www dig m.baidu.com @121.42.18.6
; <<>> DiG 9.8.3-P1 <<>> m.baidu.com @121.42.18.6
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41523
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;m.baidu.com. IN A
;; ANSWER SECTION:
m.baidu.com. 0 IN A 127.0.0.1
;; Query time: 30 msec
;; SERVER: 121.42.18.6#53(121.42.18.6)
;; WHEN: Mon Aug 28 10:32:27 2017
;; MSG SIZE rcvd: 45
可以看到,百度的子域名已经被解析到127.0.0.1了,此外还可以配合dnscrypt-proxy 对查询进行加密,这里就不展开了。
【End】
相关推荐
- 轻量级分析利器再升级:解读 DuckDB 1.3.0 新特性
-
DuckDB团队近日正式发布了最新版本——DuckDB1.3.0,代号“Ossivalis”。此次版本以金眼鸭的远古祖先BucephalaOssivalis命名,象征项目在演化和成长过...
- C++跨平台编译的终极奥义:用Docker把环境差异按在地上摩擦
-
"代码在本地跑得飞起,一上服务器就coredump?"——每个C++程序员都经历过的《编译器的复仇》事件!大家好,我是Henry,废话少说,今天来简单谈一下跨平台编译的那些事儿,...
- 全网最全-Version Script以及__asm__((".symver xxx"))使用总结
-
首先提醒一点,一切的前提建立在你的名字必须要mangling,不然无论你写的versionscript还是__asm__都不会起任何效果VersionScript简单用法:这是一个典型例子,这个例...
- Ubuntu 25.04 Beta发布:Linux 6.14内核
-
IT之家3月28日消息,Canonical昨日(3月27日)放出了Beta版Ubuntu25.04系统镜像,代号“PluckyPuffin”,稳定版预估将于2025年...
- 不同平台CRT的区别?什么是UCRT?如何看libc源代码?
-
若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好!CRT运行时库C标准规定例如输入输出函数、字符串函数、内存操作等接口,一般采用C运行时库实现。微软的CRT微软有两套CRT,早期的MS...
- 信创力量,中兴绽放——中兴新支点桌面操作系统安装与使用全攻略
-
原文链接:「链接」Hello,大家好啊,今天给大家带来一篇中兴新支点桌面操作系统安装使用的文章,欢迎大家分享点赞,点个在看和关注吧!中兴新支点桌面操作系统是一款基于Linux内核、面向政企和信创环...
- Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?
-
1.安装列表MySQL5.7.11Java1.8ApacheMaven3.6+tomcat8.5gitRedisNginxpythondocker2.安装mysql1.拷贝mysql安装文件到...
- 一篇文章解决Linux系统安全问题排查,另配实操环境
-
实操地址:https://www.skillup.host/1/linux/safe/command.md#Linux安全检查排查指南##1.系统账户安全检查###1.1检查异常账户``...
- 程序员必备的学习笔记《TCP/IP详解(一)》
-
为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样...
- 《Linux常用命令》(linux的常用命令总结)
-
一、文件与目录操作1.目录导航pwd:显示当前工作目录路径示例:pwd关键词:当前路径、工作目录cd:切换目录示例:cd/home/user#切换到绝对路径cd..#...
- Kubernetes 教程之跟着官方文档从零搭建 K8S
-
前言本文将带领读者一起,参照者Kubernetes官方文档,对其安装部署进行讲解.Kubernetes更新迭代很快,书上、网上等教程可能并不能适用于新版本,但官方文档能.阅读这篇文章你...
- 电脑网卡坏了怎么修复(电脑网卡坏了怎么修复win7系统)
-
当电脑网卡出现故障时,无论是有线网络还是无线网络,都可能无法正常连接。下面从软件、硬件等方面,分步骤为你介绍排查与修复的解决方案。一、初步排查:锁定问题源头检查网络环境将手机、平板等其他设备连接至同一...
- 如何查询电脑/手机的物理地址(如何找手机的物理地址)
-
一、要查询电脑的物理地址(也称为MAC地址),可以按照以下步骤进行操作:1.打开命令提示符(Windows)或终端(Mac):-在Windows上,点击“开始”按钮,搜索“命令提示符”,然后点击打...
- IPv4 无网络访问权限全流程解决方案
-
当设备出现IPv4无网络访问权限问题时,多由网络配置错误、连接故障或服务异常导致。以下提供系统化的排查步骤与解决方案,帮助用户快速定位并修复问题。一、基础故障快速检查1.物理连接确认有线网络:检...
- Python教程(十九):文件操作(python操作文件夹)
-
昨天,我们学习了列表推导式,掌握了Python中最优雅的数据处理方式。今天,我们将学习文件操作—Python中读写文件的基础技能。文件操作是编程中的核心技能,无论是读取配置文件、保存用户数据,还是...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
-
- 轻量级分析利器再升级:解读 DuckDB 1.3.0 新特性
- C++跨平台编译的终极奥义:用Docker把环境差异按在地上摩擦
- 全网最全-Version Script以及__asm__((".symver xxx"))使用总结
- Ubuntu 25.04 Beta发布:Linux 6.14内核
- 不同平台CRT的区别?什么是UCRT?如何看libc源代码?
- 信创力量,中兴绽放——中兴新支点桌面操作系统安装与使用全攻略
- Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?
- 一篇文章解决Linux系统安全问题排查,另配实操环境
- 程序员必备的学习笔记《TCP/IP详解(一)》
- 《Linux常用命令》(linux的常用命令总结)
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)