Linux 服务器无法连接外网,教你排查 DNS
引言:外网不通,先别急着重启网卡
当 Linux 服务器突然连不上外网(比如 ping baidu.com 没反应),很多新手第一反应是重启网卡或重装系统。
其实大部分情况是 DNS 解析出了岔子。DNS(域名系统)负责把域名转换成 IP 地址,如果它配置错误,即使网络本身是通的,你也无法通过域名访问任何网站。
本文从零开始,带你一步步排查 DNS 问题,让你从此不再盲目敲命令。
准备条件:确认是不是 DNS 的锅
在动手配置前,先做一个简单的判断:
- 测试能否 ping 通外网 IP
ping 114.114.114.114
如果能收到回复,说明网络链路是通的,问题基本锁定在 DNS。
- 测试域名解析
nslookup baidu.com
# 或者
dig baidu.com
如果提示 connection timed out 或 server can't find baidu.com,那 90% 是 DNS 配置错误。
分步操作:从配置文件到防火墙全面检查
1. 检查 /etc/resolv.conf – 最直接的 DNS 配置
Linux 的 DNS 服务器地址通常写在 /etc/resolv.conf 里。
用以下命令查看:
cat /etc/resolv.conf
正确的样子应该包含一个或多个 nameserver 行,比如:
nameserver 8.8.8.8
nameserver 114.114.114.114
如果文件为空、只有 # 注释,或指向了不可用的 DNS 服务器(比如内网地址却连不上),就需要修改。
修改方法(请提前备份):
sudo cp /etc/resolv.conf /etc/resolv.conf.bak
sudo vi /etc/resolv.conf
写入以下内容(用阿里 DNS 示例):
nameserver 223.5.5.5
nameserver 223.6.6.6
保存后立刻测试:ping baidu.com。
2. 解决 systemd-resolved 覆盖 resolv.conf 的问题
很多现代 Linux 发行版(Ubuntu 18.04+、CentOS 8+)使用 systemd-resolved 管理 DNS,导致手动修改 /etc/resolv.conf 会被自动还原。
如果发现改了又变,请运行:
ls -l /etc/resolv.conf
如果显示是一个符号链接(比如指向 /run/systemd/resolve/stub-resolv.conf),则说明被 systemd-resolved 接管。
正确做法:编辑 /etc/systemd/resolved.conf:
sudo vi /etc/systemd/resolved.conf
取消注释并修改:
[Resolve]
DNS=223.5.5.5 223.6.6.6
#FallbackDNS=
#Domains=
然后重启服务:
sudo systemctl restart systemd-resolved
3. 检查防火墙是否拦截 DNS 端口
DNS 请求默认使用 UDP 端口 53,如果防火墙拦截了出站 UDP 53,解析也会失败。
以 iptables 为例:
sudo iptables -L -n -v | grep :53
如果看到 Drop 或 Reject 规则,暂时清空防火墙测试:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
(注意:生产环境请精确放行,不要轻易清空规则)
如果你使用 firewalld(CentOS 7+),运行:
sudo firewall-cmd --list-all
确认输出中有 ports: 53/udp 或服务 dns 已添加。
4. 检查网络管理服务是否覆盖 DNS
如果你使用 NetworkManager(桌面版或部分服务器),它的配置会覆盖 /etc/resolv.conf。
检查当前使用哪个服务:
systemctl status NetworkManager
如果正在运行,建议通过 nmcli 修改连接配置:
nmcli con show
# 找到当前活动连接名称,比如 eth0
nmcli con mod eth0 ipv4.dns "223.5.5.5 223.6.6.6"
nmcli con up eth0
然后验证 cat /etc/resolv.conf 是否已经更新。
避坑指南:常见但容易被忽略的坑
- 坑 1:resolv.conf 被其他软件反复覆盖 除了 systemd-resolved 和 NetworkManager,还有
ppp(拨号)、dhclient等也可能自动改写 resolv.conf。可以通过chattr +i /etc/resolv.conf锁定文件(但注意这可能导致更新失效,谨慎使用)。 - 坑 2:公网 DNS 被防火墙或 DNS 劫持 有时你写了 8.8.8.8,但运营商或云平台强制拦截,导致解析失败。改用国内 DNS 如 223.5.5.5 通常能解决。
- 坑 3:忘记放行 UDP 53 和 TCP 53 一些场景下 DNS 查询会回退到 TCP(比如响应过长),所以防火墙不仅要放 UDP 53,也得放 TCP 53。
- 坑 4:DNS 缓存导致旧记录残留 修改配置后,可以用
systemd-resolve --flush-caches(systemd-resolved)或重启nscd服务来清空缓存。
效果验证:确认 DNS 已经正常
完成上述调整后,依次执行以下验证:
- ping 域名
ping -c 4 baidu.com
看到有回包说明 DNS 解析和网络都正常。
- nslookup 详细结果
nslookup baidu.com
输出中应显示 Address: ... 和 Non-authoritative answer: 等。
- curl 测试 HTTP 访问
curl -I https://www.baidu.com
返回 HTTP 200 表示完整链路畅通。
如果以上都没问题,你的服务器外网连接就彻底恢复了。
记住:遇到 Linux 服务器无法连接外网,优先排查 DNS 问题,按照本文的顺序检查 resolv.conf、systemd-resolved、防火墙和网络管理服务,90% 的情况都能解决。
如果在操作中遇到本文没提到的报错,欢迎留言讨论。