文字与生活
不改 DNS 怎样测试指定 IP?curl --resolve 与 --connect-to 的区别
排查机场连接时,经常需要回答一个问题:失败来自 DNS 解析,还是连接到某个地址后的 TLS/HTTP 阶段?直接修改系统 hosts 会影响整台设备,也容易忘记恢复。curl 提供了两种只作用于当前命令的办法:--resolve 和 --connect-to。
--resolve:为主机和端口临时指定地址
示意命令如下:
curl --resolve example.com:443:203.0.113.10 https://example.com/
其中 example.com 和地址只是文档示例,实际测试必须换成你有权访问的目标。--resolve 相当于为“主机名 + 端口”提供一条临时解析记录。请求 URL、HTTP Host、TLS SNI 和证书校验仍以 example.com 为准,只改变本次连接使用的地址。
这适合比较“正常 DNS 得到的地址”和“已知候选地址”是否表现不同。测试结束后无需改回系统 DNS,因为规则只存在于这一条 curl 命令里。
--connect-to:只替换网络连接目的地
示意命令:
curl --connect-to example.com:443:backend.example.net:8443 https://example.com/
curl 官方手册说明,--connect-to 只改变建立网络连接时使用的主机和端口,不改变 TLS 使用的服务器名称,也不改变应用层请求中的原始主机。它适合在前端域名保持不变时,验证另一个后端入口。
两者不要混为一谈
- 已经知道目标 IP,想绕过本次 DNS 结果:优先考虑
--resolve。 - 想把连接导向另一台主机或另一个端口,同时保留原始 URL 语义:使用
--connect-to。 - 只是想看代理是否工作:先用明确的
--proxy参数和普通 URL,不必加入这两个选项。
如果目标证书并不覆盖原始域名,curl 应当报证书错误。不要用 -k 或关闭校验来“修好”它;证书不匹配本身就是重要证据。
放进机场排障流程
先在直连状态执行普通请求,再在机场客户端提供的代理入口下执行同一个请求。只有确认普通请求失败点后,才加入 --resolve 或 --connect-to 做单变量对照。每次记录退出码、连接地址、HTTP 状态和总耗时,不要把含账号、Cookie、订阅密钥的完整命令发到公开场合。
验收时应看到:临时映射只影响当前命令;URL 主机名和证书校验没有被偷偷替换;去掉选项后行为恢复。这样才能把 DNS、网络连接与 TLS 三层分开,而不是把所有错误都归因于机场协议。
评论