文字与生活

不改 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 三层分开,而不是把所有错误都归因于机场协议。

参考资料

留下你的回声

评论

搜索文章

正在加载搜索…