问题背景#
这次问题发生在从 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 22bash关键点在于: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 resolutionbash后续再次连接时,域名甚至无法解析。也就是说,同一个域名先被解析到错误 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 域名解析异常。
具体机制可以拆成三层:
- FClash 未正确配置 DNS 转发规则,导致
*.amazonaws.com的解析请求被劫持,返回虚假 IP28.0.0.22。 - 代理侧 DNS 缓存没有及时清理,即使后续调整配置,旧的错误解析结果仍可能被复用。
- WSL 2 共享 Windows 的 DNS 配置,FClash 对 Windows DNS 的修改会影响到 WSL 环境。
解决方案#
临时恢复连接#
- 关闭 FClash 代理工具;
- 清理系统与 WSL 的 DNS 缓存:
# WSL 终端执行:清理 WSL 缓存
sudo systemd-resolve --flush-caches
# Windows 管理员终端执行:清理系统缓存
ipconfig /flushdnsbash长期配置 FClash#
- 打开 FClash → 「设置」→「DNS 设置」;
- 启用「自定义 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)
- Cloudflare DNS:
- 关闭「虚假 DNS」「DNS 劫持」功能,开启「DNS 缓存自动清理」。
添加 AWS 域名专属规则,确保解析走代理且不被污染:
- 「规则」→「添加规则」,选择「域名后缀匹配」;
- 匹配值:
amazonaws.com(覆盖所有 AWS 服务域名); - 动作:「代理」(若校园网封锁 AWS,需选择有效代理节点);
- 调整规则优先级至顶部(优先匹配)。
验证修复效果#
# 解析验证:正确返回 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 域名设置明确的分流规则。