VPS DNS 污染解决方法:彻底解决 VPS 无法访问 Google 的问题(含实用脚本)


VPS 无法访问Google?可能是DNS 污染

当你使用VPS时,遇到无法访问Google,或网页无法正确打开的情况,很大概率是因为DNS 污染导致的解析错误。因为很多VPS 会默认使用systemd-resolved管理系统DNS,该服务有时会引起DNS 缓存污染,导致解析结果错误,从而阻止正常访问海外网站。DNS 污染表现为域名解析异常,查询结果被劫持,或返回错误的IP 地址。

 

你可以通过命令dig www.google.comnslookup www.google.com观察解析结果,如果IP 地址不正确,或者通过公共DNS 查询与本机结果差异大,基本可以确认DNS 污染。此时,即使你已经正确配置了代理或翻墙服务,访问Google 也会失败,因为请求根本没能正确解析出服务器地址。

 

正常状态的我举个例子,如下图,status: NOERROR 表示没有错误,并且返回了有效 IP:如 142.250.206.196,这个是 Google 的真实 IP 之一。

- vpsdnswuran01

 

常见表现与错误代码

  • curl 报错:SSL: no alternative certificate subject name matches target host name 'www.google.com'
  • 网页提示无法解析域名
  • ping 命令无法ping 通Google 域名

 

如何确认是DNS 污染而非代理问题

只要通过切换公共DNS(例如1.1.1.18.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

 

THE END