You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

curl可正常访问但telnet连接80/443端口被拒,求二者差异

为什么curl能访问目标网站,但telnet连80/443却被拒绝?

嘿,这个问题我碰到过好几次了,咱们一步步拆解curl和telnet在这里表现不同的核心原因:

一、两者的核心行为逻辑完全不同

这是最关键的一点:

  • telnet:它的作用只是帮你建立一个纯TCP连接,连接成功后就原地待命,等着你手动输入应用层的命令(比如要访问HTTP服务,得自己敲GET / HTTP/1.1Host: example.com这些)。如果目标服务器或者中间的防火墙有「拦截/断开无数据的闲置TCP连接」的规则,或者服务器的服务只接受带合法应用层数据的连接,那telnet刚建立连接就会被拒绝或断开。
  • curl:它是一个HTTP客户端工具,建立TCP连接后会立刻发送完整的HTTP请求(默认是GET请求,还会自动带上Host头、User-Agent这些必要字段)。服务器收到合法的HTTP请求后,自然会给出响应(哪怕是你看到的「website moved」重定向),整个过程是完整的应用层交互,不会被当成“无效连接”拦截。

二、细节处理的差异放大了结果

除了核心逻辑,还有几个细节会导致这种差异:

  • 代理适配:curl会自动读取系统的代理配置(比如环境变量里的http_proxy),如果你的设备在地点1是通过代理访问目标网站的,curl会自动走代理成功连接;但telnet默认不会使用代理,直接连目标服务器的80/443端口,刚好被防火墙拦了,就会出现connection refused。
  • HTTPS端口的特殊情况:如果是连443端口,curl会自动发起TLS握手流程,完成加密协商后再发HTTP请求;但telnet只是连TCP端口,根本不会做TLS握手,绝大多数HTTPS服务器会直接拒绝这种没有加密协商的纯TCP连接,所以telnet连443必然被拒。
  • 重定向处理:curl默认会自动处理HTTP重定向(3xx状态码),你看到的「website moved」就是重定向响应,但telnet根本不懂HTTP状态码,它连到80端口后如果服务器没收到请求,直接就断开了。

三、结合你的场景分析

地点1的网络环境(比如公司防火墙、运营商策略、代理配置)应该有这样的规则:只允许带有合法HTTP/HTTPS请求的流量通过,拦截纯TCP空连接。所以telnet这种只建连接不发数据的行为被拦了,但curl的完整HTTP请求能顺利通过;而地点2没有这种限制,所以两者都能正常工作。

内容的提问来源于stack exchange,提问作者Tiến Đỗ

火山引擎 最新活动