尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【Linux从入门到精通】第36篇:DNS服务探秘——自己搭建一个内网DNS

【Linux从入门到精通】第36篇:DNS服务探秘——自己搭建一个内网DNS 目录一、引言为什么需要DNS二、/etc/hostsDNS出现之前的解决方案2.1 hosts文件的工作原理2.2 hosts文件的局限性三、Dnsmasq最轻量的DNS服务器3.1 什么是Dnsmasq3.2 安装与启动3.3 配置自定义域名解析3.4 验证自定义域名解析四、BIND9简介企业级的DNS方案五、实战用DNS劫持广告域名5.1 原理5.2 配置Dnsmasq广告屏蔽5.3 使用社区维护的广告域名列表六、故障排查清单6.1 DNS配置排查命令6.2 常见问题速查七、本篇小结动手练习八、下篇预告一、引言为什么需要DNS假如没有DNS你访问百度不是输入baidu.com而是输入110.242.68.66。你能记住几个这样的IP地址DNSDomain Name System就是为解决这个问题而生的——它把人类容易记忆的域名翻译成计算机需要的IP地址。但DNS的作用远不止“翻译”。在运维工作中自己搭建DNS服务器有两个非常实用的场景内网域名解析公司内部的服务如GitLab、Jenkins、Nexus都在内网没有公网DNS记录。自己搭一个DNS员工就能用gitlab.internal这样的域名访问不用记IP广告过滤把所有广告域名的解析结果指向一个不存在的地址广告自然就加载不出来了——这是网络级别的广告屏蔽不用装任何浏览器插件二、/etc/hostsDNS出现之前的解决方案2.1 hosts文件的工作原理在DNS出现之前互联网上的每一台计算机都用一个文件来记录“域名→IP”的映射关系——这就是/etc/hosts。bashcat /etc/hosts输出典型的Linux hosts文件text127.0.0.1 localhost 127.0.1.1 myhostname # 你可以手动添加自定义映射 192.168.1.100 gitlab.internal 192.168.1.101 jenkins.internal当你访问gitlab.internal时系统会先查hosts文件如果找到了对应的IP就直接使用不会再发起DNS查询。优先级现代Linux系统默认先查hosts文件再查DNS服务器。这个顺序由/etc/nsswitch.conf中的hosts: files dns控制——files代表hosts文件dns代表DNS服务器查询排在前面优先级更高。2.2 hosts文件的局限性局限说明单机生效每台机器都得单独维护机器多了根本无法同步静态配置IP变了就得手动改DHCP动态分配IP的场景根本没法用无高级功能不支持泛域名解析*.internal、不支持负载均衡、不支持故障转移无法应付大规模互联网有上亿个域名一个hosts文件不可能装下当你管理三台以上的服务器时hosts文件就会变成噩梦——每加一台新机器你都得在所有机器上更新hosts。这时候就需要一个集中式的DNS服务器了。三、Dnsmasq最轻量的DNS服务器3.1 什么是DnsmasqDnsmasq是一个轻量级的DNS和DHCP服务器专为小型网络设计。它的特点配置极简核心配置往往只需要几行资源占用极低几十MB内存就能跑树莓派上也能流畅运行自动读取/etc/hosts你只需要把内网域名写进服务器的hosts文件Dnsmasq就能把它们作为DNS记录对外提供支持DNS缓存加速重复查询减轻上游DNS负担对于几十台到几百台规模的内网环境Dnsmasq是性价比最高的选择。3.2 安装与启动bash# Ubuntu/Debian sudo apt update sudo apt install dnsmasq -y # CentOS/RHEL sudo dnf install dnsmasq -y # 启动并设为开机自启 sudo systemctl start dnsmasq sudo systemctl enable dnsmasqDnsmasq默认监听53端口DNS标准端口。Ubuntu/Debian系统可能自带systemd-resolved它也占用53端口会导致Dnsmasq启动失败。排查方法bash# 查看53端口被谁占用 sudo ss -tulnp | grep :53 # 如果systemd-resolved占用了53端口停止它并禁用 sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved # 处理/etc/resolv.conf软链接避免被systemd-resolved覆盖 sudo rm /etc/resolv.conf echo nameserver 127.0.0.1 | sudo tee /etc/resolv.conf3.3 配置自定义域名解析Dnsmasq的默认配置非常精简大部分功能都需要手动配置。编辑配置文件bashsudo vim /etc/dnsmasq.conf在文件末尾追加以下内容ini# 监听所有网络接口生产环境建议指定具体IP如 interfaceeth0 interface* # 上游DNS服务器Dnsmasq自己解析不了的域名转发给Google和Cloudflare的DNS server8.8.8.8 server8.8.4.4 # 监听地址绑定的内网IP根据你的服务器IP修改 listen-address192.168.1.100 # 禁止读取 /etc/resolv.conf 获取上游DNS我们用 server 手动指定 no-resolv # DNS缓存大小缓存1000条查询结果加快重复访问速度 cache-size1000然后配置内网自定义域名bash# 方法一直接写入服务器的 /etc/hosts echo 192.168.1.10 gitlab.internal | sudo tee -a /etc/hosts echo 192.168.1.20 jenkins.internal | sudo tee -a /etc/hosts echo 192.168.1.30 nexus.internal | sudo tee -a /etc/hostsbash# 方法二通过Dnsmasq的专用配置文件更规范 sudo mkdir -p /etc/dnsmasq.d sudo vim /etc/dnsmasq.d/internal.conf添加内容text# 内网自定义域名 address/gitlab.internal/192.168.1.10 address/jenkins.internal/192.168.1.20 address/nexus.internal/192.168.1.30 # 泛域名解析所有 .app.internal 都解析到这个IP address/.app.internal/192.168.1.50重启Dnsmasqbashsudo systemctl restart dnsmasq3.4 验证自定义域名解析在DNS服务器本机测试bash# 测试自定义域名127.0.0.1 指定用本机的DNS服务查询 nslookup gitlab.internal 127.0.0.1 # 或者用dig dig 127.0.0.1 gitlab.internal在其他内网机器上测试将它们的DNS设置为你的Dnsmasq服务器IPbash# Linux临时修改DNS echo nameserver 192.168.1.100 | sudo tee /etc/resolv.conf # 测试 ping gitlab.internal nslookup jenkins.internalWindows上修改DNS控制面板 → 网络和共享中心 → 更改适配器设置 → 右键网卡属性 → IPv4属性 → DNS服务器填192.168.1.100。四、BIND9简介企业级的DNS方案Dnsmasq适合小型内网但如果需要更复杂的功能——比如多区域管理、主从DNS同步、动态更新——就需要BIND9。BINDBerkeley Internet Name Domain是互联网上使用最广泛的DNS服务器软件大部分公网DNS服务器都在运行BIND。它功能强大但配置复杂得多这里只做简要对比对比维度DnsmasqBIND9适用规模几十~几百台几百~几万台以上配置复杂度★☆☆☆☆★★★★☆内存占用~50MB~200MB区域传输不支持支持主从同步学习成本10分钟上手需要系统学习DNS协议如果你的环境和需求符合以下条件之一可以考虑学习BIND9需要管理多个DNS区域zone需要部署主从DNS服务器实现高可用需要支持DDNS动态DNS更新对DNS协议有深入学习的兴趣五、实战用DNS劫持广告域名这是本篇最有趣的部分——利用DNS实现网络级别的广告屏蔽。5.1 原理广告加载的流程通常是网页 → 请求ads.example.com/some_ad.js→ DNS查询 → 获取广告服务器IP → 加载广告。如果在DNS层面把ads.example.com解析到127.0.0.1或者0.0.0.0浏览器就无法加载广告内容——因为广告请求全被“黑洞”了。5.2 配置Dnsmasq广告屏蔽bashsudo vim /etc/dnsmasq.d/adblock.conf添加以下内容text# 把所有常见广告域名指向 0.0.0.0指向自己或空地址浏览器发起请求后立即失败 address/doubleclick.net/0.0.0.0 address/googleadservices.com/0.0.0.0 address/googlesyndication.com/0.0.0.0 address/adservice.google.com/0.0.0.0 # 一些常见的第三方广告域名 address/ads.example.com/0.0.0.0 address/tracker.analytics.com/0.0.0.0效果验证重启Dnsmasq后在本机试试bash# 解析广告域名应该返回 0.0.0.0 nslookup doubleclick.net 127.0.0.1 # ping 测试 ping ads.example.com # 输出 PING ads.example.com (0.0.0.0) 说明劫持成功5.3 使用社区维护的广告域名列表手动维护广告域名费时费力社区已经有现成的列表可用bash# 下载一个经过整理的hosts广告屏蔽列表转换为Dnsmasq格式 curl -s https://someonewhocares.org/hosts/zero/hosts | \ grep ^0\.0\.0\.0 | \ awk {print address/$2/0.0.0.0} | \ sudo tee /etc/dnsmasq.d/adblock_community.conf # 重启Dnsmasq sudo systemctl restart dnsmasq注意社区列表可能包含数千甚至上万条域名Dnsmasq的处理性能在普通服务器上完全够用。但建议只选择你信任的列表来源避免误拦截正常网站。六、故障排查清单6.1 DNS配置排查命令bash# 查看当前系统DNS配置 cat /etc/resolv.conf # 检查53端口是否被占用 sudo ss -tulnp | grep :53 # 查看Dnsmasq日志排查配置错误 sudo journalctl -u dnsmasq -f # 测试DNS解析逐步定位 nslookup baidu.com # 用系统默认DNS nslookup baidu.com 127.0.0.1 # 用本机DNS nslookup gitlab.internal 192.168.1.100 # 用内网DNS6.2 常见问题速查问题现象可能原因解决方案Dnsmasq无法启动53端口被占用通常是systemd-resolvedsudo ss -tulnp | grep :53停掉占用进程内网域名解析不到其他机器的DNS没指向Dnsmasq检查/etc/resolv.confLinux或网卡DNS设置Windows某些网站打不开广告列表误伤了正常网站检查/etc/dnsmasq.d/下的屏蔽列表注释掉怀疑的域名后重启Dnsmasq解析变慢上游DNS延迟高或cache-size太小检查server上游DNS配置增大cache-size值七、本篇小结DNS层次text/etc/hosts单机→ Dnsmasq小型内网DNS→ BIND9企业级DNSDnsmasq核心配置配置项作用示例serverIP指定上游DNSserver8.8.8.8address/域名/IP自定义域名解析address/gitlab.internal/192.168.1.10address/域名/0.0.0.0屏蔽域名广告过滤的核心address/ads.com/0.0.0.0cache-sizeNDNS缓存条数cache-size1000DNS劫持广告的原理把广告域名的DNS指向127.0.0.1或0.0.0.0浏览器就无法加载广告内容——无需插件网络级别生效。动手练习bash# 1. 确认Dnsmasq安装并运行 sudo apt install dnsmasq -y sudo systemctl status dnsmasq # 2. 添加一个自定义域名并测试 sudo mkdir -p /etc/dnsmasq.d echo address/myapp.internal/192.168.1.100 | sudo tee /etc/dnsmasq.d/myapp.conf sudo systemctl restart dnsmasq nslookup myapp.internal 127.0.0.1 # 3. 劫持一个常见广告域名体验DNS屏蔽效果 echo address/doubleclick.net/0.0.0.0 | sudo tee /etc/dnsmasq.d/adtest.conf sudo systemctl restart dnsmasq nslookup doubleclick.net 127.0.0.1八、下篇预告DNS把域名解析为IP但一个域名往往只对应一个IP。如果这台服务器挂了怎么办如果流量太大一台服务器撑不住怎么办下一篇我们将学习NFS网络文件系统——它是分布式存储的基础让多台服务器共享同一份文件数据。你将理解“无状态协议”的设计哲学以及为什么NFS会让进程进入我们第11篇学过的“D状态”不可中断睡眠。延伸思考DNS虽然解决了集中式域名解析的问题但/etc/hosts并没有消失——你可以在服务器上把127.0.0.1 localhost这一行删掉看看会发生什么很多服务的本地通信都会依赖localhost解析。这就是为什么hosts文件在单机配置中依然重要它是绕过DNS最快、最可靠的解析方式。
返回列表