Frank's Lab

Back

问题背景#

这次问题发生在从 WSL 2 连接 AWS EC2 时。目标实例位于东京区域 ap-northeast-1,AWS 控制台确认的公网 IP 是 54.95.61.230,连接方式是 SSH 密钥认证。

当时的网络环境是校园网,Windows 端运行 FClash 代理工具,WSL 2 共享 Windows 的网络配置。

项目详情
客户端WSL 2(Ubuntu 子系统),用户名 frank
目标服务AWS EC2 实例(东京区域 ap-northeast-1
预期配置公网 IP:54.95.61.230;连接方式:SSH 密钥认证
网络环境校园网,Windows 端运行 FClash

核心现象#

SSH 连接到了错误 IP#

frank@LAPTOP-D1IUBHQH:~$ ssh -i /home/frank/learning/cloud.pem ubuntu@ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
kex_exchange_identification: Connection closed by remote host
Connection closed by 28.0.0.22 port 22
bash

关键点在于:SSH 最终连接到的是 28.0.0.22,而不是 AWS 控制台显示的 54.95.61.230。这说明问题很可能不在 EC2 安全组,而在域名解析阶段。

后续出现域名解析失败#

frank@LAPTOP-D1IUBHQH:~$ ssh -i /home/frank/learning/cloud.pem ubuntu@ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
ssh: Could not resolve hostname ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com: Temporary failure in name resolution
bash

后续再次连接时,域名甚至无法解析。也就是说,同一个域名先被解析到错误 IP,随后又出现解析超时,问题进一步指向 DNS 链路。

排查过程#

验证域名解析结果#

通过 nslookup 命令定位解析异常,结果显示 DNS 返回错误 IP:

frank@LAPTOP-D1IUBHQH:~$ nslookup ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
Server:         10.255.255.254    本地私有 DNS 服务器(代理分配)
Address:        10.255.255.254 53

Name:   ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
Address: 28.0.0.22    错误解析结果,与 EC2 真实 IP 不符
bash

结论很明确:域名解析被污染,返回结果没有指向 AWS EC2 实例的真实公网 IP。

排除其他层面问题#

排查方向操作结果
校园网直接解析Windows 主机执行 nslookup 相同域名同样解析到 28.0.0.22,排除 WSL 独立问题
公共 DNS 测试指定 Google DNS 8.8.8.8 解析仍返回 28.0.0.22,说明解析请求被拦截或篡改
代理工具影响关闭 FClash 后重新解析解析恢复为 54.95.61.230,确认 FClash 是污染源头

根本原因#

根本原因是 FClash 的 DNS 处理导致 AWS 域名解析异常

具体机制可以拆成三层:

  1. FClash 未正确配置 DNS 转发规则,导致 *.amazonaws.com 的解析请求被劫持,返回虚假 IP 28.0.0.22
  2. 代理侧 DNS 缓存没有及时清理,即使后续调整配置,旧的错误解析结果仍可能被复用。
  3. WSL 2 共享 Windows 的 DNS 配置,FClash 对 Windows DNS 的修改会影响到 WSL 环境。

解决方案#

临时恢复连接#

  • 关闭 FClash 代理工具;
  • 清理系统与 WSL 的 DNS 缓存:
# WSL 终端执行:清理 WSL 缓存
sudo systemd-resolve --flush-caches

# Windows 管理员终端执行:清理系统缓存
ipconfig /flushdns
bash

长期配置 FClash#

  1. 打开 FClash → 「设置」→「DNS 设置」;
  2. 启用「自定义 DNS 服务器」,添加加密 DNS(防止劫持):
    • Cloudflare DNS:1.1.1.1(DoH 地址:https://cloudflare-dns.com/dns-query
    • Google DNS:8.8.8.8(DoH 地址:https://dns.google/dns-query
  3. 关闭「虚假 DNS」「DNS 劫持」功能,开启「DNS 缓存自动清理」。

添加 AWS 域名专属规则,确保解析走代理且不被污染:

  1. 「规则」→「添加规则」,选择「域名后缀匹配」;
  2. 匹配值:amazonaws.com(覆盖所有 AWS 服务域名);
  3. 动作:「代理」(若校园网封锁 AWS,需选择有效代理节点);
  4. 调整规则优先级至顶部(优先匹配)。

验证修复效果#

# 解析验证:正确返回 EC2 真实 IP
frank@LAPTOP-D1IUBHQH:~$ nslookup ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
Server:         1.1.1.1
Address:        1.1.1.1 53

Name:   ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
Address: 54.95.61.230

# SSH 连接验证:成功建立会话
frank@LAPTOP-D1IUBHQH:~$ ssh -i /home/frank/learning/cloud.pem ubuntu@ec2-54-95-61-230.ap-northeast-1.compute.amazonaws.com
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-1019-aws x86_64)
...
ubuntu@ip-xxx-xxx-xxx-xxx:~$
bash

总结#

这次排障的关键不是 SSH 本身,而是先确认“连接目标到底是谁”。当 SSH 报错里出现了非预期 IP 28.0.0.22 时,就应该优先怀疑 DNS 链路。

最终问题链路是:

FClash DNS 配置异常AWS 域名被污染SSH 连接到错误 IP连接被远端关闭或解析失败

解决思路也很直接:修正代理 DNS 配置,清理缓存,并为 AWS 域名设置明确的分流规则。

连接 AWS EC2 失败:DNS 污染导致解析异常
https://frank-whw.com/blog/articles/aws-ec2-dns-pollution
Author Frank
Published at 2025年11月12日