ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

麒麟V10系统DNS配置指南:图形界面与命令行实操详解

麒麟V10系统DNS配置指南:图形界面与命令行实操详解 1. 动手之前先搞清楚麒麟V10的DNS配置机制很多朋友拿到麒麟V10的第一反应就是去翻/etc/resolv.conf改完发现能上网重启之后又没了或者干脆系统设置里改了保存不上。踩过几次坑之后我发现问题的根源不在于DNS地址本身而在于你不清楚当前这个系统里到底是谁在“管”网络。麒麟V10是基于Linux内核的国产操作系统分桌面版和服务器版两大类这两类的网络管理机制是有差异的。桌面版默认跑的是NetworkManager也就是说你看到的有线连接、无线连接、网络图标这些背后基本都是NetworkManager在接管配置而服务器版早期版本或者说一些精简安装场景下用的是传统的network服务加/etc/sysconfig/network-scripts/ifcfg-*配置脚本。你如果拿着桌面版的思路去改服务器版或者拿服务器版的思路去改桌面版大概率会得到一个“改完不生效”或者“一重启就还原”的结果。还有个容易混淆的点麒麟V10里存在至少三个地方可以写DNS。第一是/etc/resolv.conf这是Linux系统里最底层的域名解析配置文件几乎所有应用程序做域名解析时都会查询它第二是NetworkManager的连接配置文件也就是/etc/NetworkManager/system-connections/下面的文件这里面记录的DNS在NetworkManager重启或连接重连时会主动写回/etc/resolv.conf第三是/etc/systemd/resolved.conf如果你的系统启用了systemd-resolved服务那么/etc/resolv.conf会变成一个软链接指向/run/systemd/resolve/下的动态文件这时候你直接改/etc/resolv.conf根本是白改因为服务一刷新就把你改的内容覆盖掉了。理解这三层关系后面所有操作都不会再犯迷糊。提示改DNS前建议先执行ip addr show和ip route show确认当前网卡名称、IP地址和默认路由避免改完DNS发现连默认网关都丢了那就不是解析问题而是连通性问题了。2. 图形界面修改DNS适合桌面版和普通办公场景2.1 通过系统设置修改麒麟V10桌面版改DNS最不容易出错的路径是图形化操作。从开始菜单打开“设置”找到“网络”那一项里面会列出当前的有线连接和无线连接。点击你正在用的那个连接旁边的齿轮图标进入连接详情之后会看到一个“IPv4”或“IPV4设置”的标签页默认情况下使用的是“自动DHCP”这意味着IP、网关、DNS全是从路由器的DHCP服务器拿来的。要修改DNS把“自动”切换成“手动”或“仅地址手动”然后在DNS服务器那一栏把旧的DNS删掉填入新的地址。这里有两个细节需要注意多个DNS之间用逗号分隔不要把逗号写成中文标点。有些老手也会在这个地方翻车因为图形界面上没有明显提示你输入一个中文逗号之后系统不会报错但解析会异常。如果你发现网络连接是灰色的点不了齿轮图标那就说明当前这个连接被NetworkManager锁定了一般是权限问题。可以关掉设置窗口在终端里执行nm-connection-editor这个命令会直接弹出连接编辑窗口里面同样能改DNS而且权限管控更宽松。2.2 图形界面改完为什么有时候不生效我遇到过好几次的情况是图形界面里明明把DNS改成了内网指定的10.10.10.10点保存之后再打开看也没问题但实际解析用的还是老DNS。排查下来发现原因是NetworkManager的配置被系统里的其他服务抢先刷掉了。常见的原因有两个。第一是你在/etc/resolv.conf里手动加过内容而NetworkManager的dns处理模式设置为“default”时它会接管并重写这个文件你手动加的内容在连接重连后会被清空第二是你装了docker或者其他会操作iptables、docker0网桥的服务这些服务启动时会给NetworkManager发送配置变更事件导致网络重连结果就是你改的DNS被网络重连时的DHCP租约重新覆盖。要解决这个问题可以在NetworkManager的连接配置文件里把[ipv4]段的dns-priority设为负数比如dns-priority-10让手动配置的DNS优先级高于DHCP下发的DNS。这个参数在图形界面里没有直接选项需要编辑配置文件或者用nmcli命令设置。nmcli connection modify 有线连接 1 ipv4.dns-priority -10这就是为什么我经常建议命令行运维的人干脆复用nmcli来统管配置而不是在图形界面和配置文件之间来回横跳。3. 命令行修改DNS服务器版和SSH远程操作的必选方案3.1 临时修改DNS应急最快路径如果只是临时测试某个DNS能不能用最直接的方法就是改/etc/resolv.conf。echo nameserver 223.5.5.5 /etc/resolv.conf echo nameserver 119.29.29.29 /etc/resolv.conf注意第一条命令用了是覆盖写第二条用是追加写顺序别搞反。改完之后立刻就能生效不需要重启网络服务你执行nslookup www.baidu.com或者getent hosts www.baidu.com马上能看到结果变化。但这个方法有个前提你的系统里NetworkManager没有在管理这个网卡或者NetworkManager的dns处理模式没有覆盖这个文件。如果NetworkManager正在接管你改了也是白改因为几秒之后它就会把文件恢复原样。所以临时修改只建议在不启用NetworkManager的服务器版上操作或者你明确知道当前网络就是靠/etc/resolv.conf直接生效的老环境。3.2 永久修改方式一通过NetworkManager连接配置这是麒麟V10桌面版和安装了NetworkManager的服务器版最推荐的做法。核心思路是不要直接改/etc/resolv.conf而是改NetworkManager的连接配置让NetworkManager自己把DNS写进去。先用nmcli connection show查看当前所有连接的名字和UUID确认你要操作的连接是哪一个。注意连接名称不一定是中文“有线连接 1”这样的名字有的系统里可能叫“Wired connection 1”或者“eth0”这种自定义名字复制的时候要原样带上空格。nmcli connection show假设当前连接名是“有线连接 1”执行下面的命令设置两个DNSnmcli connection modify 有线连接 1 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 223.5.5.5,119.29.29.29但是这里有个坑很多人只想改DNS不想把IP地址改成手动的于是写了这条命令之后原来DHCP拿到的IP就没了网络直接断了。正确做法是如果IP还想继续用DHCP就不要动ipv4.method直接把DNS加进去nmcli connection modify 有线连接 1 ipv4.dns 223.5.5.5,119.29.29.29然后重连网卡让配置生效nmcli connection down 有线连接 1 nmcli connection up 有线连接 1重连的瞬间SSH会短暂断开但只要你在本机操作或者有物理控制台就没问题。如果你想不中断连接就生效可以试试nmcli device reapply eth0把eth0替换成你的实际网卡名这个命令会重新应用当前网卡上的连接配置比断开重连温和不少。3.3 永久修改方式二通过systemd-resolved麒麟V10服务器版如果启用了systemd-resolved你会注意到/etc/resolv.conf其实是个软链接ls -l /etc/resolv.conf看到类似../run/systemd/resolve/stub-resolv.conf的输出就说明DNS解析这件事归systemd-resolved管了。这种方式下应用程序发的DNS请求默认会从127.0.0.53这个本地地址走由systemd-resolved转发给上游DNS。你直接改/etc/resolv.conf改完执行resolvectl flush-caches之后内容指向的其实还是stub文件你改的东西会被重置。正确做法是修改/etc/systemd/resolved.conf文件找到[Resolve]段把#DNS这行的注释去掉填上你要的DNS地址[Resolve] DNS223.5.5.5 119.29.29.29 FallbackDNS114.114.114.114 Domains~corp.example.com这里DNS和FallbackDNS的区别在于主备关系多个DNS用空格分隔不是逗号。改完之后重启服务systemctl restart systemd-resolved这个方式的优势是应用层解析非常稳定而且支持按域名分流比如内网域名*.corp.local走内网DNS公网域名走公网DNS这些都可以在[Resolve]段里配置。劣势是配置语法和其他方式不一样很多人第一次接触容易搞混。3.4 永久修改方式三直接改网卡配置文件服务器版麒麟V10如果用的是传统network服务那么网卡配置文件在/etc/sysconfig/network-scripts/ifcfg-eth0注意实际文件名里的eth0要替换成你机器的网卡名可能叫ens33、enp0s3等等。修改方式是在文件里加一行DNS1223.5.5.5 DNS2119.29.29.29然后重启网络服务systemctl restart network这里有个容易踩的坑如果ifcfg文件里已经有PEERDNSyes这个参数DHCP获取到的DNS会覆盖你手动写的DNS1、DNS2。解决办法是把PEERDNSno加上让系统不再从DHCP获取DNS只用你手动配置的。还有一种情况是网卡配置用了NetworkManager和systemd-networkd的混合模式这时候ifcfg文件改了不生效要去查/etc/systemd/network/目录下有没有对应的.network文件里面有[Network]段同样支持DNS配置。判断系统到底走的哪套网络管理可以执行systemctl status network NetworkManager systemd-networkd看哪个服务是active状态。4. 完整实操记录从查看到验证的整个流程4.1 场景A桌面版通过nmcli完成修改我在虚拟机里装了一台麒麟V10桌面版网卡桥接到物理网络获取到的IP是192.168.31.150默认DNS是192.168.31.1。现在要改成使用阿里DNS223.5.5.5和腾讯DNS119.29.29.29。先查看当前状态nmcli device status nmcli connection show输出里能看到一个叫“有线连接 1”的连接状态是已连接。接着查看这个连接当前的DNS配置nmcli connection show 有线连接 1 | grep -i dns可以看到IPV4.DNS[1]: 192.168.31.1说明当前用的是DHCP下发的DNS。修改nmcli connection modify 有线连接 1 ipv4.dns 223.5.5.5,119.29.29.29 ipv4.ignore-auto-dns yesipv4.ignore-auto-dns yes这个参数很关键它的意思是“忽略DHCP自动获取的DNS”不写这个参数的话虽然手动DNS也配置了但DHCP下发的DNS会继续存在最终生效的DNS可能是两组混在一起顺序还不一定是你想要的。重连之后验证nmcli connection down 有线连接 1 nmcli connection up 有线连接 1 cat /etc/resolv.conf输出应该就是nameserver 223.5.5.5 nameserver 119.29.29.29再执行nslookup www.baidu.com看到解析服务器是223.5.5.5就说明成功了。4.2 场景B服务器版直接改配置文件一台麒麟V10服务器版网卡名是ens33系统没有装NetworkManager走的是network服务。这种情况下nmcli命令是用不了的直接去改配置vi /etc/sysconfig/network-scripts/ifcfg-ens33在文件里找到BOOTPROTO这一行如果值是dhcp你要确认能不能把它改成none或static。如果这台服务器的IP是固定IP直接把BOOTPROTO改成none然后确认下面几项没有问题BOOTPROTOnone IPADDR192.168.1.100 PREFIX24 GATEWAY192.168.1.1 DNS1223.5.5.5 DNS2119.29.29.29 PEERDNSno这里PEERDNSno必须写否则即使你手写了DNS1和DNS2只要网卡是通过DHCP获取到IPDHCP下发DNS还是会写进/etc/resolv.conf覆盖你手写的配置。保存退出重启网络systemctl restart network重启后检查/etc/resolv.conf你会发现里面自动生成了nameserver 223.5.5.5和nameserver 119.29.29.29这个文件是NetworkManager或network服务根据ifcfg文件自动生成的你不需要也没有必要手动去改它。4.3 修改后的验证和回滚方案改完DNS不是看一眼cat /etc/resolv.conf就结束了一定要做三件事第一验证解析是否正常nslookup www.baidu.com dig www.baidu.com其中dig命令如果没安装需要先装一下麒麟V10可以用yum install bind-utils或者apt install dnsutils不同版本包管理不一样。我建议至少用nslookup验证因为dig在某些最小化安装环境下默认不带的。第二检查内外网域名解析是否存在冲突。比如你设置了公网DNS之后内网的服务器域名解析不了那就需要在DNS配置里同时加入内网DNS或者配置搜索域。如果内网域名是server1.internal这种带特定后缀的可以在/etc/resolv.conf里加search internal让系统在解析短域名时自动尝试追加这个后缀。第三保留回滚方案。改之前最好先备份旧的配置特别是服务器版直接在ifcfg文件里操作的情况强烈建议先把原始文件复制一份cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak这样如果改完发现网络不通或者解析出问题可以直接把备份文件恢复回去再重启网络服务几秒钟就能回到原来的状态。5. 常见问题与排查技巧实录5.1 改完DNS重启之后又变回原样这是被问得最多的一个问题。绝大多数原因是NetworkManager接管了网络配置你手动改了/etc/resolv.conf但NetworkManager在开机或网卡重连时根据自己的连接配置重新生成了这个文件把你手写的内容覆盖了。排查思路执行systemctl status NetworkManager看服务是否在跑如果确实在跑就用我前面说的nmcli方式去改而不是直接改resolv.conf。还有一种情况是服务器版存在多个网卡配置文件比如ifcfg-eth0和ifcfg-eth1都配置了DNS系统启动的时候按顺序加载后面加载的覆盖了前面配置这时候要检查所有相关网卡文件统一调整。还有一种更隐蔽的情况系统里装了dnsmasq或者unbound这类本地DNS代理服务DNS请求其实是先到127.0.0.1的某个端口由代理服务转发到上游。你改/etc/resolv.conf里的nameserver对代理服务本身没影响需要去修改dnsmasq的配置文件/etc/dnsmasq.conf里的server或者resolv-file参数。5.2 修改DNS之后ping域名通了但ping IP地址不通这个问题的排查方向就完全不是DNS了。ping域名能通说明DNS解析成功了域名转换成了IP地址ping IP不通说明网络层有问题。可能的原因包括目标IP不在你的路由范围内没有默认网关防火墙拦截了ICMP包或者网卡的IP地址配置有问题。操作上也经常有人把这两个概念混淆改DNS解决的是“域名翻译成IP”的问题改路由和防火墙解决的才是“数据包能不能到达”的问题。如果业务反馈是“ping网关都不通”那先用ip route show检查路由表再用firewall-cmd --list-all检查防火墙规则不要一直纠结DNS配置。5.3 双网卡环境下DNS配置冲突麒麟V10服务器经常有双网卡场景比如内网网卡和公网网卡各一张。这种情况下如果两个网卡都从DHCP获取DNS或者都手动配置了DNS最终哪个生效取决于路由优先级和NetworkManager的DNS优先级策略。我的处理经验是明确“哪张网卡负责DNS解析”。如果内网业务主要走内网卡那就把内网卡的手动DNS配置好并在连接配置里设置ipv4.never-default yes表示这张网卡不设置默认路由避免默认路由走错网卡把公网卡设置为默认路由DNS用公网DNS。这样内网域名解析走内网DNS公网域名解析走公网DNS互不干扰。如果双网卡是同一个网段做bond绑定链路聚合那DNS配置就只需要在bond接口上配置一次物理网卡上配置的DNS会被忽略不要两边都写同样的配置否则看不出问题但改起来容易改漏。5.4 无网络环境下离线排查DNS问题有时候你根本连不上外网无法通过nslookup www.baidu.com来测试这时候怎么确认DNS配置不对可以用getent hosts解析一个已知的内网主机名或者直接getent hosts gateway看能不能解析网关的主机名。如果本机/etc/hosts里有内容getent hosts会优先读hosts文件而不是DNS服务器所以测试时最好解析一个不在hosts文件里的名字。还可以用ping -c 1 223.5.5.5判断网络通不通通的话就确认链路没问题剩下就是DNS的问题。如果连这个IP都不通那就是网络层的问题和DNS无关别在DNS配置上浪费时间。5.5 虚拟机环境里的特殊注意点很多人在虚拟机里装麒麟V10练手比如VMware、VirtualBox或者华为泰山服务器上的虚拟机。虚拟机网络模式如果是NAT那么DNS由虚拟机软件自己决定一般VMware NAT模式下默认DNS是虚拟网关的IP比如192.168.xxx.2你改完系统内的DNS之后如果用的是NAT模式要确认虚拟网络编辑器里的NAT设置没冲突。如果是桥接模式虚拟机直接加入物理网络DNS行为和物理机一样正常配置就行。还有一点麒麟V10桌面版在虚拟机里如果开启了系统防火墙改DNS后解析正常但连不上某些端口优先查防火墙而不是DNS。常见的表现就是nslookup能解析出IP但curl或者ping不通这时候systemctl stop kylin-firewall或者systemctl stop firewalld试试很多奇怪问题就消失了。5.6 修改DNS后应用不生效如果你改了系统DNS重启了网卡nslookup也验证通过了但某个应用比如docker容器、Java应用、浏览器还是解析不了新域名那大概率是应用层面缓存了之前的DNS或者使用了自定义DNS配置。比如docker容器默认使用的宿主机DNS配置但如果你给容器指定了--dns参数启动容器内部就只认那个参数指定的DNSJava虚拟机默认缓存DNS结果默认缓存时间是30秒到30分钟不等但你可以修改JVM的networkaddress.cache.ttl参数来调整缓存时间。浏览器也是很多浏览器内部有自己的DNS缓存或者直接使用系统解析刷新页面没能解决问题的话清一下浏览器缓存基本就正常了。注意麒麟V10上如果跑着squid、nginx这类反向代理服务改完DNS之后需要重启这些服务因为它们内部会有DNS缓存模块不会实时读取新的系统DNS配置。6. 最后再分享两个我实测过的小技巧第一个技巧是DNS配置前后的对比测试。很多人在改完DNS之后没有做前后对比导致出了问题不清楚是自己的配置错误还是网络环境本身的问题。我习惯改之前先记录一份完整的“配置前网络状态快照”echo 修改前 /tmp/dns_before.txt nmcli connection show /tmp/dns_before.txt cat /etc/resolv.conf /tmp/dns_before.txt ip route show /tmp/dns_before.txt nslookup www.baidu.com /tmp/dns_before.txt 21修改完成后再执行一遍同样的命令把输出存到/tmp/dns_after.txt然后diff /tmp/dns_before.txt /tmp/dns_after.txt对比差异问题一目了然。这个方法在处理“改完DNS还是解析不对”的疑案时特别有用。第二个技巧是设置多组DNS时的顺序策略。如果你在两个地方分别配置了不同的DNS系统解析时会按照/etc/resolv.conf里nameserver出现的顺序逐个尝试第一个不通才轮到第二个所以顺序不是越多越好而是把最快的、最稳定的放在最前面。公网环境我个人的习惯是首选223.5.5.5阿里公共DNS或119.29.29.29腾讯DNSPod这两个国内访问速度快内网环境一定把内网DNS放第一位否则你访问内网服务名会先走公网DNS绕一圈导致解析失败。而且不建议同时写三个以上因为解析超时轮询的问题会让应用层的请求卡顿明显。操作上我最后再啰嗦一句不管用哪种方式改改完一定做一遍“重启网络服务并验证域名解析”的完整流程而不是只验证一次就收工。我在实际运维中踩过太多次“当场生效、重启失效”的坑希望这篇内容能帮你一次就把问题根除。
返回列表