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

资讯详情

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

统信UOS与CentOS DNS转发配置实战:systemd-resolved与dnsmasq详解

统信UOS与CentOS DNS转发配置实战:systemd-resolved与dnsmasq详解 1. 项目概述与核心价值最近在折腾一个内部测试环境需要让几台不同操作系统的服务器都能通过一个统一的出口去解析域名。手头正好有统信UOS和CentOS的机器这俩一个代表国内主流的商用发行版一个依然是服务器领域的常青树把它们凑一块搞DNS转发感觉是个挺有代表性的场景。说白了DNS转发就是个“二传手”自己不去做复杂的域名解析而是把客户端发来的查询请求转发给上游更专业的DNS服务器比如114.114.114.114或者公司内网的DNS然后把结果拿回来再告诉客户端。这样做的好处太多了对于网络管理员来说可以集中管理缓存提升内网解析速度还能做一层过滤和审计对于服务器本身尤其是那些不能直接连外网的机器这就是它们“看”到外部世界的眼睛。这个需求在国产化替代和混合IT架构里特别常见。你可能在统信UOS上部署了自研的应用后端数据库却跑在CentOS的虚拟机里它们都需要稳定地解析彼此的域名以及外网的API地址。自己搭建一个全功能的Bind9服务器当然可以但很多时候我们只是需要一个轻量、快速、稳定的转发代理这时候用系统自带的systemd-resolved或者老牌的dnsmasq来配置就非常合适了。接下来我就以“配置一台Linux服务器作为DNS转发器”为目标分别拆解在统信UOS和CentOS 7/8上的实现步骤把配置逻辑、排错心得分摊清楚让你不管遇到哪种系统都能快速搞定。2. 核心方案选型与原理浅析在Linux世界里实现DNS转发主要有几个“选手”古老的/etc/resolv.conf直配法、目前主流的systemd-resolved服务以及小巧强大的dnsmasq。每种方式都有自己的脾气选对了才能事半功倍。2.1 方案对比与选型理由先来看看这几种方式的区别我做了个简单的对比表格方案核心组件适用场景优点缺点直接修改 resolv.conf系统库函数 (glibc)临时测试、极简环境、静态网络配置配置简单直观直接生效容易被网络管理器NetworkManager, netplan覆盖无法配置复杂的转发规则如分域名转发systemd-resolvedsystemd 套件的一部分使用 systemd 的现代发行版如 CentOS 8, UOS与系统集成度高支持 DNS-over-TLS管理方便配置相对抽象排查问题需要多学一套命令dnsmasq独立服务进程需要轻量级DHCPDNS服务器、做复杂转发和缓存功能强大缓存、分域名转发、DHCP配置灵活需要额外安装和守护进程增加系统复杂度对于我们的目标——配置DNS转发服务器——我的建议是统信UOS (基于Debian/Deepin)和CentOS 8/Rocky Linux 8/AlmaLinux 8及以上版本优先使用systemd-resolved。因为它是系统原生自带的与网络管理器NetworkManager配合最好也是最“官方”的维护方式。CentOS 7 / RHEL 7由于其自带的systemd版本较老systemd-resolved默认未安装或未启用。此时dnsmasq是更通用、更可控的选择。当然你也可以选择安装新版的systemd并启用resolved但涉及核心组件升级有潜在风险。临时调试或简单环境直接改/etc/resolv.conf并锁住文件是最快的手段。注意很多教程会教你在/etc/resolv.conf里直接写nameserver 127.0.0.1然后在本地装一个DNS服务。这思路没错但关键是要搞清楚127.0.0.1背后到底是哪个服务在监听是systemd-resolved还是dnsmasq还是别的配置要对得上否则就会陷入“为什么配置了却不生效”的怪圈。2.2 DNS转发的基本工作流程理解流程对排错至关重要。当你在一台Linux服务器上配置好DNS转发后一个查询请求比如ping www.baidu.com的旅程是这样的应用发起请求应用程序如ping调用系统函数如getaddrinfo查询域名。系统库处理glibc库读取/etc/resolv.conf或/etc/nsswitch.conf的配置决定向哪个DNS服务器发起查询。如果resolv.conf里指向了127.0.0.1或::1请求就发往本机。本地转发服务接收监听在53端口DNS默认端口的本地服务systemd-resolved或dnsmasq收到查询包。查询缓存本地服务首先检查自己的缓存里有没有这个域名的记录如果有且未过期直接返回结果旅程结束。这是提升速度的关键。转发决策如果缓存没有则根据配置的转发规则决定将请求转发给哪个上游DNS服务器。可以配置多个上游形成备份链路。向上游查询并返回本地服务将请求转发给上游DNS拿到解析结果后一方面将结果返回给应用程序另一方面将结果存入自己的缓存供后续查询使用。这个流程里缓存和转发规则是核心。好的配置能最大化缓存命中率并智能地将内网域名转发给内部DNS公网域名转发给公共DNS。3. 统信UOS (基于Debian) 配置实战统信UOS默认使用了systemd-resolved和NetworkManager来管理网络和DNS这是比较现代和推荐的方式。我们的目标是让本机的DNS查询都经由systemd-resolved转发到我们指定的上游DNS服务器例如114.114.114.114和8.8.8.8。3.1 确认与启用 systemd-resolved首先我们需要确认服务状态并启用它。# 检查 systemd-resolved 服务状态 sudo systemctl status systemd-resolved # 如果服务未运行则启动并设置开机自启 sudo systemctl enable --now systemd-resolved如果看到Active: active (running)说明服务已经在运行了。systemd-resolved默认会监听127.0.0.53:53这个地址为本机提供DNS服务。3.2 配置上游DNS服务器systemd-resolved的主要配置文件是/etc/systemd/resolved.conf。我们需要编辑这个文件来设置上游DNS。sudo vim /etc/systemd/resolved.conf找到[Resolve]段落修改或添加以下行[Resolve] DNS114.114.114.114 8.8.8.8 #FallbackDNS1.1.1.1 9.9.9.9 #Domains~.DNS这里填写你想要转发到的上游DNS服务器地址用空格分隔。我填了国内常用的114和Google的8.8.8.8作为示例。FallbackDNS这是备用DNS当主DNS全部失效时使用。你可以取消注释并设置。Domains~.这个设置有点意思~.表示对所有域名的查询都使用本机解析器即systemd-resolved。通常保持注释即可因为默认行为就是处理所有查询。实操心得在UOS或Debian系上有时NetworkManager会强行为网卡生成DNS配置并覆盖resolved的设置。为了确保systemd-resolved全局生效一个稳妥的做法是在/etc/NetworkManager/NetworkManager.conf的[main]部分添加dnssystemd-resolved然后重启NetworkManager服务sudo systemctl restart NetworkManager。这等于告诉NetworkManager“DNS的事情交给resolved管你别插手了。”3.3 配置本机使用 resolved 服务现在需要让系统知道DNS查询应该发给本机的systemd-resolved服务。这通过修改/etc/resolv.conf的符号链接来实现。# 查看当前的 /etc/resolv.conf 是什么 ls -lh /etc/resolv.conf # 通常它是指向 /run/systemd/resolve/stub-resolv.conf 或 /run/NetworkManager/resolv.conf 的链接 # 删除原有链接如果是文件先备份 sudo rm /etc/resolv.conf # 创建指向 systemd-resolved 存根解析器的符号链接 sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf这个stub-resolv.conf文件里通常只有一行nameserver 127.0.0.53它就是一个“存根”告诉系统所有DNS查询都发送到本机53端口由systemd-resolved接管。3.4 应用配置并测试完成配置后重启systemd-resolved服务使配置生效然后进行测试。# 重启服务 sudo systemctl restart systemd-resolved # 测试DNS解析是否正常 nslookup www.baidu.com # 或使用 dig 命令它能显示更多细节比如查询了哪个服务器 dig www.baidu.com如果dig命令返回结果中SERVER:一行显示的是127.0.0.53#53并且能正确解析出IP地址说明配置成功。你还可以通过systemd-resolve --status命令查看详细的DNS配置和统计信息。4. CentOS 7 配置实战 (使用 dnsmasq)CentOS 7默认没有启用systemd-resolved而NetworkManager自带的DNS管理在作为转发服务器时不够灵活。因此我们选择安装和配置dnsmasq它是一个非常轻量且功能完整的DNS转发器和缓存服务器。4.1 安装与基础配置 dnsmasq首先安装dnsmasq。sudo yum install -y dnsmasq安装完成后主要的配置文件是/etc/dnsmasq.conf。在修改前建议先备份原文件。sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak sudo vim /etc/dnsmasq.conf我们需要修改或确认以下几个关键配置# 监听地址。设置为 127.0.0.1 表示只监听本机设置为 0.0.0.0 表示监听所有接口允许其他机器查询。 # 作为转发服务器我们通常需要监听所有接口。 listen-address127.0.0.1, 192.168.1.100 # 请将 192.168.1.100 替换为你服务器的实际IP # 禁止读取 /etc/hosts 文件。如果希望dnsmasq也提供本地主机名解析可以注释掉。 no-hosts # 或者如果想用可以指定额外的hosts文件 # addn-hosts/etc/dnsmasq.hosts # 指定上游DNS服务器。这是转发的核心配置。 server114.114.114.114 server8.8.8.8 # 你也可以按域名指定不同的上游服务器例如将所有 .internal 域名转发到内部DNS # server/internal/10.0.0.1 # 缓存大小默认是150条记录。对于转发服务器可以适当调大。 cache-size1000 # 重要禁止dnsmasq作为DHCP服务器运行除非你确实需要。 no-dhcp-interface注意listen-address配置非常关键。如果你只配了127.0.0.1那么只有本机可以把它当DNS用。如果你希望网络内的其他机器也能把这台CentOS当作DNS服务器就必须加上服务器的局域网IP并且确保防火墙放行了53端口的UDP/TCP流量。4.2 配置本机网络使用 dnsmasq配置好dnsmasq后需要修改本机的DNS设置让它指向自己。# 编辑网卡配置文件例如 ifcfg-ens33你的网卡名可能不同 sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33找到DNS1参数将其修改为127.0.0.1。如果不存在可以添加一行。DNS1127.0.0.1然后重启网络服务以应用更改。sudo systemctl restart network或者如果你使用的是NetworkManager也可以用nmcli命令修改sudo nmcli con mod ens33 ipv4.dns 127.0.0.1 sudo nmcli con up ens33最后检查/etc/resolv.conf确认nameserver已经指向了127.0.0.1。4.3 防火墙与SELinux配置这是CentOS 7上最容易出问题的环节。防火墙如果其他机器要访问此DNS服务必须开放53端口。sudo firewall-cmd --permanent --add-servicedns sudo firewall-cmd --reload # 或者直接添加端口 # sudo firewall-cmd --permanent --add-port53/tcp # sudo firewall-cmd --permanent --add-port53/udp # sudo firewall-cmd --reloadSELinux如果SELinux处于Enforcing模式需要允许dnsmasq绑定网络端口。# 查看SELinux状态 getenforce # 如果为 Enforcing为 dnsmasq 设置正确的上下文 sudo semanage port -a -t dns_port_t -p tcp 53 sudo semanage port -a -t dns_port_t -p udp 53 # 如果上述命令报错端口已定义可以尝试修改布尔值 sudo setsebool -P dnsmasq_use_tcp 1 sudo setsebool -P dnsmasq_use_udp 1避坑技巧在测试阶段如果被SELinux问题困扰可以临时将其设置为Permissive模式来排查是否是SELinux导致的问题sudo setenforce 0。但生产环境务必在找到根本原因后配置正确的安全策略而不是简单关闭。4.4 启动服务与测试启动dnsmasq并设置开机自启然后进行测试。sudo systemctl enable --now dnsmasq sudo systemctl status dnsmasq # 确认状态为 active (running)测试DNS解析# 测试本机解析 nslookup www.qq.com 127.0.0.1 dig 127.0.0.1 www.qq.com # 从同一网络内的另一台机器测试将 192.168.1.100 替换为你的CentOS服务器IP nslookup www.qq.com 192.168.1.100如果都能正确返回IP地址说明DNS转发服务器配置成功。你还可以查看dnsmasq的缓存和查询日志默认日志在/var/log/messages中可以通过sudo tail -f /var/log/messages | grep dnsmasq来实时观察。5. 高级配置与优化技巧基础的转发配好了但想让这个“二传手”更聪明、更高效还需要一些进阶玩法。5.1 分域名转发Split DNS这是企业内网非常实用的功能。让内网域名如.corp.com的查询走内部DNS服务器其他所有域名走公共DNS。在 dnsmasq 中配置(/etc/dnsmasq.conf)# 将所有 .corp.com 后缀的查询转发到内部DNS服务器 10.0.0.53 server/corp.com/10.0.0.53 # 其他所有查询使用公共DNS server114.114.114.114在 systemd-resolved 中配置systemd-resolved原生支持按域名配置DNS但通常通过NetworkManager的链接配置文件/etc/NetworkManager/system-connections/或/etc/systemd/resolved.conf.d/目录下的自定义配置文件来实现相对复杂。更常见的做法是依然用dnsmasq做分流转发或者使用systemd-resolved的DNSOverTLS功能来加密上游查询。5.2 缓存优化DNS缓存能极大提升重复查询的速度。dnsmasqcache-size参数控制缓存条目数。对于有几百个客户端的网络设置cache-size10000也不为过。你还可以通过sudo kill -SIGHUP $(pidof dnsmasq)命令让dnsmasq清空缓存而不重启服务。systemd-resolved缓存是自动管理的。你可以使用sudo systemd-resolve --statistics查看缓存命中率。清除缓存需要重启服务sudo systemctl restart systemd-resolved。5.3 安全性增强限制查询来源在dnsmasq中可以使用listen-address精确指定监听的IP并使用local-service或interface选项限制。避免使用0.0.0.0。还可以用no-dhcp-interface确保不提供DHCP服务。防止DNS放大攻击在dnsmasq.conf中设置no-resolv不使用/etc/resolv.conf中的服务器和明确的server列表并考虑设置filterwin2k或bogus-priv来过滤无效响应。使用DNS-over-TLS (DoT)systemd-resolved支持DoT。在/etc/systemd/resolved.conf中设置DNSOverTLSyes并将DNS指向支持DoT的服务器如9.9.9.9#853或1.1.1.1#853可以加密本机到上游的DNS流量防止窃听和篡改。6. 故障排查与诊断实录配置过程中难免会遇到问题这里记录几个我踩过的坑和排查思路。6.1 通用排查流程当DNS不工作时按照以下步骤排查可以快速定位问题检查本地解析ping 127.0.0.1或ping 服务器本机IP确保网络栈基本正常。检查DNS服务状态# systemd-resolved sudo systemctl status systemd-resolved # dnsmasq sudo systemctl status dnsmasq # 查看监听端口 sudo ss -tulnp | grep :53确认服务是active (running)并且有进程在监听53端口UDP和TCP。检查本机DNS配置cat /etc/resolv.conf确认nameserver指向的是127.0.0.1或127.0.0.53。使用 dig 或 nslookup 逐级测试# 测试本地转发器 dig 127.0.0.1 www.baidu.com # 如果失败直接测试上游DNS dig 114.114.114.114 www.baidu.com如果直接测试上游成功但通过本地失败问题就出在本地转发服务配置错误、缓存问题、防火墙/SELinux。检查防火墙和SELinux这是CentOS上的常见“杀手”。# 防火墙 sudo firewall-cmd --list-all | grep services sudo firewall-cmd --list-ports # SELinux (针对dnsmasq) sudo ausearch -m avc -ts recent | grep dnsmasq sudo sealert -l [上条命令输出的ID]6.2 常见问题与解决方案问题现象可能原因解决方案dig命令卡住或超时1. 防火墙阻止了53端口出/入站。2.dnsmasq配置了错误的上游DNS或上游DNS不可达。3. SELinux阻止了网络连接。1. 检查并配置防火墙规则。2.ping一下上游DNS IP检查/etc/dnsmasq.conf中server行是否正确。3. 查看SELinux日志或临时setenforce 0测试。nameserver被重置为其他值NetworkManager 或其他网络管理服务覆盖了/etc/resolv.conf。对于systemd-resolved确保使用了stub-resolv.conf链接并在NetworkManager中配置dnssystemd-resolved。对于dnsmasq在网卡配置中设置PEERDNSno并手动设置DNS1127.0.0.1。能解析外网域名但解析不了内网域名分域名转发配置错误或未生效。检查dnsmasq.conf中server/internal.domain/的语法是否正确。确保内网DNS服务器的IP地址可达。systemd-resolved服务启动失败端口53已被其他程序如dnsmasq,bind占用。使用sudo ss -tulnp | grep :53找出占用端口的进程停止或禁用冲突服务。从其他机器无法查询此DNS服务器1.dnsmasq只监听了127.0.0.1。2. 服务器防火墙未开放53端口。3. 服务器有多张网卡监听地址配置错误。1. 修改dnsmasq.conf中的listen-address加上服务器局域网IP。2. 配置防火墙开放53/tcp和53/udp。3. 确认listen-address中的IP是客户端能访问到的那个。6.3 日志分析技巧日志是排查问题的金钥匙。dnsmasq日志默认输出到/var/log/messages或/var/log/syslog。可以在/etc/dnsmasq.conf中通过log-queries和log-dhcp开启详细日志。使用sudo journalctl -u dnsmasq -f可以实时跟踪日志。systemd-resolved日志使用sudo journalctl -u systemd-resolved -f查看实时日志。-x参数可以提供更详细的解释信息。一个典型的dnsmasq查询日志看起来像这样dnsmasq[1234]: query[A] www.baidu.com from 192.168.1.50接着是dnsmasq[1234]: forwarded www.baidu.com to 114.114.114.114和dnsmasq[1234]: reply www.baidu.com is 14.215.177.39。通过这个流程你可以清晰地看到查询来源、转发动作和最终结果。7. 性能监控与维护建议配置好了不是一劳永逸日常的监控和维护能保证服务稳定。7.1 基础监控命令查看缓存命中率 (dnsmasq)dnsmasq本身不直接提供命中率统计但可以通过清空缓存前后的查询延迟变化来感知或者解析sudo kill -SIGUSR1 $(pidof dnsmasq)后在系统日志里查看dnsmasq输出的缓存统计需要编译时开启相关选项。查看连接与缓存状态 (systemd-resolved)sudo systemd-resolve --statistics这个命令会显示当前缓存大小、已处理的查询总数、成功/失败的查询数等非常有用。使用 netstat 或 ss 查看连接数sudo ss -tunp | grep :53观察连接到53端口的客户端数量和状态如果发现大量TIME-WAIT或异常IP可能需要关注。7.2 日常维护建议定期更新上游DNS列表公共DNS IP可能会变可以定期检查并更新配置文件。可以考虑使用可靠性更高的DNS如223.5.5.5阿里、119.29.29.29腾讯DNSPod。日志轮转与清理确保系统的日志轮转配置如logrotate包含dnsmasq或systemd-resolved的日志防止日志文件撑满磁盘。备份配置文件在修改/etc/dnsmasq.conf或/etc/systemd/resolved.conf等关键文件前务必备份。压力测试如果服务器需要为大量客户端提供服务可以考虑使用dnsperf等工具进行简单的压力测试观察服务器的响应能力和资源消耗CPU、内存。7.3 安全加固 checklist[ ] 上游DNS服务器至少配置两个且来自不同的运营商或提供商避免单点故障。[ ] 防火墙规则严格限制仅允许必要的IP段向本机53端口发起查询。[ ] 如果使用dnsmasq确认no-dhcp-interface已设置除非你真的需要DHCP功能。[ ] 定期检查服务日志是否有来自异常IP的大量查询请求可能预示着DNS放大攻击尝试。[ ] 保持系统和软件包更新及时修补安全漏洞。配置DNS转发器尤其是跨不同发行版最关键的是理解其工作原理和配置逻辑的差异。统信UOS为代表的现代发行版拥抱systemd-resolved配置更集中但抽象而CentOS 7这类系统用dnsmasq则能获得更直观和强大的控制力。遇到问题别慌按照“服务状态 - 本机配置 - 网络连通 - 安全策略”的路径一步步排查大部分问题都能迎刃而解。最后别忘了根据你的实际网络环境灵活运用分域名转发和缓存优化让这台DNS转发服务器真正成为你网络架构中高效、可靠的一环。
返回列表