银河麒麟多网卡dns干扰的根本原因是dns未按网卡权重区分,应优先用systemd-resolved按网卡绑定专属dns并设域名路由(如ens33专解~internal),辅以networkmanager设置route-metric和ignore-auto-dns,最后强制nsswitch.conf中hosts行启用files dns myhostname顺序。

您在银河麒麟系统中配置了多个网卡(如有线+无线、或两张有线网卡),但发现内网域名解析总走外网DNS、局域网服务访问失败,或不同网卡的DNS查询互相干扰,根本原因在于各网卡DNS未按预期优先级生效——系统未对不同网卡的DNS设置做权重区分,而是简单合并或覆盖。
用 systemd-resolved 按网卡绑定专属DNS并设域名路由
该方法适用于麒麟V10 SP1及以上版本,通过 resolved 的 per-link DNS 机制,让某张网卡(如ens33)专用于解析 internal 域名,另一张(如wlan0)负责公网,互不干扰。这是唯一能实现“网卡级DNS优先级”的原生方案。
第一步:确认目标网卡名称及当前 resolved 状态
执行 ip -br link | grep UP 查出活跃网卡,例如 【ens33】;再运行 systemctl is-active systemd-resolved 确保服务已启动。
第二步:为 ens33 创建专用 link 配置文件
执行 sudo vim /etc/systemd/network/10-ens33.network,写入以下内容:
[Match]
Name=ens33
[Network]
DNS=192.168.10.5
Domains=~internal ~intranet.local
RouteMetric=100
第三步:重启 systemd-networkd 并重载 resolved
执行 sudo systemctl restart systemd-networkd && sudo systemctl reload systemd-resolved。注意:【必须先重启 networkd,否则 resolved 不会读取新 link 配置】。
第四步:验证域名是否命中指定网卡DNS
执行 systemd-resolve --status | grep -A10 "Link.*ens33",确认输出中包含 DNS: 192.168.10.5 和 Domains: ~internal ~intranet.local;再测试 dig gitlab.internal @192.168.10.5 应返回有效响应。
通过 NetworkManager 设置连接级DNS优先级
当您使用图形桌面且 NetworkManager 管理网络时,可通过调整连接的 route-metric 和 ignore-auto-dns 实现DNS出口控制——metric 决定默认路由走向,而 ignore-auto-dns 强制该连接的DNS不被覆盖,从而间接形成DNS优先级。
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
方法一:禁用低优先级连接的DNS自动获取
执行 nmcli con mod "Wired connection 1" ipv4.ignore-auto-dns yes,再 nmcli con up "Wired connection 1"。这一步会让该连接只用自己配置的DNS,不抢全局解析权。
方法二:给高优先级连接设更低跃点数并绑定DNS
先执行 nmcli con mod "WIFI-SSID" ipv4.route-metric 50,再设DNS:nmcli con mod "WIFI-SSID" ipv4.dns "114.114.114.114 223.5.5.5",最后 nmcli con mod "WIFI-SSID" ipv4.ignore-auto-dns yes。这三步合起来,让WiFi连接既获得路由优先权,又独占DNS解析路径。
方法三:图形界面快速设置(仅限桌面环境)
点击右上角网络图标 → “有线设置”或“Wi-Fi设置” → IPv4 选项卡 → 将“DNS”设为手动,填入 114.114.114.114,223.5.5.5 → 关闭“自动从DHCP获取DNS”开关 → 应用。操作起来很简单,直接点几下就行。
强制 /etc/nsswitch.conf 启用多源DNS解析顺序
即使所有网卡DNS都配好了,若系统解析器跳过DNS查询,一切配置都白搭。nsswitch.conf 中 hosts 行决定解析路径顺序,缺了 dns 就等于关掉了整个DNS层。
执行 grep hosts /etc/nsswitch.conf,若输出为 hosts: files myhostname,说明DNS解析被完全绕过。
用 root 权限编辑该文件:sudo vim /etc/nsswitch.conf,将 hosts 行改为:hosts: files dns myhostname。位置很关键——【dns 必须放在 files 之后、myhostname 之前,否则内网 hosts 条目会被DNS覆盖】。
保存退出即可生效,无需重启任何服务。后续所有 getaddrinfo() 调用都会按此顺序查 hosts → DNS → myhostname。










