VPS DNS 污染解决方法:彻底解决 VPS 无法访问 Google 的问题(含实用脚本)
VPS 无法访问Google?可能是DNS 污染
当你使用VPS时,遇到无法访问Google,或网页无法正确打开的情况,很大概率是因为DNS 污染导致的解析错误。因为很多VPS 会默认使用systemd-resolved
管理系统DNS,该服务有时会引起DNS 缓存污染,导致解析结果错误,从而阻止正常访问海外网站。DNS 污染表现为域名解析异常,查询结果被劫持,或返回错误的IP 地址。
你可以通过命令dig www.google.com
或nslookup www.google.com
观察解析结果,如果IP 地址不正确,或者通过公共DNS 查询与本机结果差异大,基本可以确认DNS 污染。此时,即使你已经正确配置了代理或翻墙服务,访问Google 也会失败,因为请求根本没能正确解析出服务器地址。
正常状态的我举个例子,如下图,status: NOERROR 表示没有错误,并且返回了有效 IP:如 142.250.206.196,这个是 Google 的真实 IP 之一。
常见表现与错误代码
- curl 报错:
SSL: no alternative certificate subject name matches target host name 'www.google.com'
- 网页提示无法解析域名
- ping 命令无法ping 通Google 域名
如何确认是DNS 污染而非代理问题
只要通过切换公共DNS(例如1.1.1.1
、8.8.8.8
)单独测试DNS 解析,或禁用本机systemd-resolved
服务,再次尝试访问。若问题解决,说明是DNS 污染导致。
systemd-resolved 问题修复详解
systemd-resolved是Linux 系统中常见的DNS 解析服务,但默认配置和缓存机制在部分环境下容易造成DNS 污染问题。
什么是systemd-resolved?
它是systemd 的一部分,负责管理和缓存DNS 查询。系统会将/etc/resolv.conf
链接到一个本地的虚拟DNS 服务(通常是127.0.0.53),所有DNS 请求都会先发到这里,再转发给上游DNS。
如何彻底禁用并恢复传统DNS 模式
停止并禁用systemd-resolved 服务:
systemctl disable --now systemd-resolved
删除当前/etc/resolv.conf
文件:
rm /etc/resolv.conf
创建新的/etc/resolv.conf
,写入你想用的DNS 服务器,比如:
sudo bash -c 'cat > /etc/resolv.conf <<EOF
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF'
重启网络服务(或重启 VPS)
sudo systemctl restart networking
sudo systemctl restart NetworkManager
这样可以绕开systemd-resolved 缓存,直接使用你指定的DNS 服务器,避免DNS 污染。
VPS DNS 设置教程:彻底解决DNS 污染
下面发一个一键检测的脚本,可以检测DNS 状态、备份和恢复/etc/resolv.conf
,禁用systemd-resolved,选择和设置多组公共DNS 服务器。
一键修改脚本核心功能
- 检测systemd-resolved 是否运行,当前
/etc/resolv.conf
内容 - 备份和恢复
/etc/resolv.conf
文件,防止误操作丢失配置 - 支持禁用systemd-resolved 并设置用户选定的公共DNS,如1.1.1.1、8.8.8.8、114.114.114.114 等
- 检测网络连通性,包括ping 公共IP 和使用curl 测试访问谷歌
- 本地代理功能状态检测(非VPS 专用),通过ping + https 请求综合判断代理连通状态
公共 DNS 服务器推荐
- 1.1.1.1 - Cloudflare,速度快且注重隐私,详细见 Cloudflare DNS 官方文档
- 8.8.8.8 - Google 公共 DNS,全球稳定,参考 Google Public DNS
- 114.114.114.114 - 国内知名公共 DNS
- 9.9.9.9 - Quad9,安全防护强
总结:最稳妥的VPS DNS 污染解决方法
本教程系统介绍了导致VPS 无法访问Google的核心原因—— DNS 污染,特别是systemd-resolved
服务的影响。通过禁用该服务、手动配置可信公共DNS、以及使用智能检测脚本,你可以轻松解决访问障碍,确保VPS 网络畅通。建议大家根据实际需求选择合适的公共DNS,同时保持脚本和系统的定期维护。掌握这些VPS DNS 污染解决方法,你将大大提升服务器的稳定性和访问速度,避免因DNS 导致的连通性问题。
附录:VPS DNS 污染解决一键脚本
#!/bin/bash
# 脚本配置
BACKUP_FILE="/etc/resolv.conf.backup"
RESOLV_FILE="/etc/resolv.conf"
# 可选的 DNS 服务器列表
declare -A DNS_OPTIONS=(
[1]="1.1.1.1 (Cloudflare)"
[2]="8.8.8.8 (Google)"
[3]="9.9.9.9 (Quad9)"
[4]="223.5.5.5 (AliDNS)"
[5]="114.114.114.114 (114DNS)"
[6]="自定义"
)
# 检查 systemd-resolved 状态
check_dns_status() {
echo "---- DNS 状态 ----"
if systemctl is-active --quiet systemd-resolved; then
echo "systemd-resolved 服务:运行中(已启用)"
else
echo "systemd-resolved 服务:未运行(已禁用)"
fi
echo "/etc/resolv.conf 内容:"
cat $RESOLV_FILE 2>/dev/null || echo "未找到 $RESOLV_FILE 文件"
echo "-------------------"
}
# 备份 resolv.conf
backup_resolv() {
if [ -f "$RESOLV_FILE" ]; then
cp $RESOLV_FILE $BACKUP_FILE
echo "已备份 $RESOLV_FILE 至 $BACKUP_FILE"
else
echo "$RESOLV_FILE 文件不存在,无法备份"
fi
}
# 恢复 resolv.conf
restore_resolv() {
if [ -f "$BACKUP_FILE" ]; then
cp $BACKUP_FILE $RESOLV_FILE
echo "已恢复 DNS 配置"
else
echo "未找到备份文件 $BACKUP_FILE"
fi
}
# 禁用 systemd-resolved
disable_systemd_resolved() {
systemctl disable --now systemd-resolved
echo "已禁用并关闭 systemd-resolved"
}
# 启用 systemd-resolved
enable_systemd_resolved() {
systemctl enable --now systemd-resolved
echo "已启用并启动 systemd-resolved"
}
# 设置 DNS
set_dns() {
echo "请选择要设置的 DNS:"
for key in "${!DNS_OPTIONS[@]}"; do
echo "$key) ${DNS_OPTIONS[$key]}"
done
read -p "输入编号: " dns_choice
if [[ "$dns_choice" == "6" ]]; then
read -p "请输入自定义 DNS 地址(多个用空格隔开): " custom_dns
dns_addresses=$custom_dns
else
case "$dns_choice" in
1) dns_addresses="1.1.1.1 1.0.0.1" ;;
2) dns_addresses="8.8.8.8 8.8.4.4" ;;
3) dns_addresses="9.9.9.9 149.112.112.112" ;;
4) dns_addresses="223.5.5.5 223.6.6.6" ;;
5) dns_addresses="114.114.114.114 114.114.115.115" ;;
*) echo "无效输入"; return ;;
esac
fi
rm -f $RESOLV_FILE
for ip in $dns_addresses; do
echo "nameserver $ip" >> $RESOLV_FILE
done
echo "DNS 已设置为:$dns_addresses"
}
# 网络连通性测试
test_network() {
echo "测试网络连通性..."
echo "ping 1.1.1.1 ..."
if ping -c 2 -W 2 1.1.1.1 > /dev/null; then
echo "Ping 1.1.1.1 成功"
else
echo "Ping 1.1.1.1 失败"
fi
echo "ping 8.8.8.8 ..."
if ping -c 2 -W 2 8.8.8.8 > /dev/null; then
echo "Ping 8.8.8.8 成功"
else
echo "Ping 8.8.8.8 失败"
fi
echo "curl https://www.google.com -I ..."
if curl -I --connect-timeout 5 https://www.google.com 2>&1 | grep -q "HTTP/"; then
echo "curl 测试成功"
else
echo "curl 测试失败,可能被墙或 DNS 被污染"
fi
}
# 本机代理功能状态检测
check_local_proxy() {
echo "本机代理功能状态检测(非VPS专用)..."
if curl -I --connect-timeout 5 https://www.google.com 2>&1 | grep -q "HTTP/"; then
echo "代理功能正常(能访问 Google)"
else
echo "代理功能异常(无法访问 Google)"
fi
}
# DNS 响应延迟测试
test_dns_latency() {
echo "DNS 响应延迟测试:"
declare -A dns_latency
for key in "${!DNS_OPTIONS[@]}"; do
[[ "$key" == "6" ]] && continue
ip=$(echo "${DNS_OPTIONS[$key]}" | grep -oE '^[0-9.]+')
latency=$(dig +stats +timeout=2 @"$ip" www.google.com | grep "Query time" | awk '{print $4}')
latency=${latency:-超时}
echo "$ip => $latency ms"
done
}
# 主菜单
while true; do
check_dns_status
echo "请选择操作:"
echo "1) 备份当前 /etc/resolv.conf"
echo "2) 恢复 DNS 备份"
echo "3) 禁用 systemd-resolved"
echo "4) 启用 systemd-resolved"
echo "5) 设置 DNS(支持多种)"
echo "6) 测试网络连通性"
echo "7) 本机代理功能状态检测(非VPS专用)"
echo "8) 测试 DNS 延迟"
echo "9) 退出"
read -p "输入数字并回车: " choice
case $choice in
1) backup_resolv ;;
2) restore_resolv ;;
3) disable_systemd_resolved ;;
4) enable_systemd_resolved ;;
5) set_dns ;;
6) test_network ;;
7) check_local_proxy ;;
8) test_dns_latency ;;
9) echo "退出"; break ;;
*) echo "无效输入" ;;
esac
echo ""
read -p "按回车键继续..." temp
done