遇到“接口不通”,不要立即归因于防火墙。先分清名字解析、连接建立、协议交互和应用处理。它们处在不同层次,留下的错误也不同。
本篇需要先按实验准备启动 security-up。所有请求都指向本机教学服务。
一、从一个 URL 拆出四层问题
以 http://127.0.0.1:18080/health 为例:
| 部分 | 本例 | 要回答的问题 |
|---|---|---|
| 协议 | http | 双方使用什么应用协议,是否要求 TLS? |
| 主机 | 127.0.0.1 | 目标地址在哪里?若使用域名,还要解析名字 |
| 端口 | 18080 | 目标主机上的哪个网络端点? |
| 路径 | /health | 应用把请求交给哪个处理逻辑? |
这里直接使用 IP,因此不需要 DNS 查询。Docker 把宿主 18080 转发到容器 8080,这两个端口不必相同。127.0.0.1 在宿主和容器里分别代表各自的回环接口;进入另一个容器以后,它不会自动指向宿主。
IP 负责网络寻址;TCP 提供有序可靠的字节流;HTTP 定义请求、响应及其语义。UDP 是数据报传输,不能简单理解成“没有可靠性的 HTTP”。现代 HTTP 也有基于 QUIC 的实现,因此不要把“HTTP 必然等于 TCP”作为永久规则。MDN HTTP 概览
二、实验 A:读一条完整响应
curl -i http://127.0.0.1:18080/health |
关注三部分:状态行中的 200、Content-Type: application/json 等响应头、末尾 JSON 响应体。这个教学服务器可能返回 HTTP/1.0,不能把协议版本差异当作漏洞证据。
再观察请求侧:
curl -v -H 'Accept: application/json' \ |
-v 的连接信息与头部写到标准错误,响应体通常在标准输出。> 标记发送,< 标记接收。-i 是把响应头放进输出;-I 则发出 HEAD 请求,二者不等价。教学服务没有实现 HEAD,使用 -I 可能得到 501。curl 参数文档
在浏览器访问 /health,打开开发者工具的 Network,刷新一次。试着找到请求方法、状态码、响应头和响应体;不要把浏览器额外请求 favicon 的 404 与 /health 的结果混在一起。
三、实验 B:域名与连接地址不是同一件事
curl --noproxy '*' \ |
--resolve 只为这一次 curl 提供名字到地址的映射;没有修改系统 DNS 或 hosts。观察连接地址仍是 127.0.0.1,而 HTTP Host 包含 lesson.test:18080。--noproxy '*' 避免本次练习被代理设置转走。
思考:如果服务器按 Host 选择站点,连接到同一个 IP 是否就一定返回同一份内容?这里的实验服务没有虚拟主机路由,但你已经可以区分网络地址和应用主机名。
四、实验 C:区分 HTTP 失败与连接失败
curl -i http://127.0.0.1:18080/does-not-exist |
第一条预期 404;第二条预期 401,因为没有提供教学 token。这两次都已成功建立连接并收到 HTTP 响应。
| 观察结果 | 至少能说明什么 | 不能直接说明什么 |
|---|---|---|
| DNS 解析失败 | 名字解析未得到可用结果 | 服务一定没启动 |
| Connection refused | 连接未被接受,常见于没监听或主动拒绝 | 应用已经返回了 403 |
| 超时 | 在时限内未完成相应阶段 | 一定是防火墙导致 |
| HTTP 401 | 本请求未通过身份认证要求 | 账号一定不存在 |
| HTTP 403 | 服务拒绝当前请求 | 网络连接失败 |
| HTTP 404 | 服务未提供该资源 | 能据此确认资源在后台不存在 |
实践中,应用也可能用 404 隐藏无权限资源,因此状态码要结合接口契约和服务日志解释。
五、HTTPS 保护的是哪一段
HTTPS 在 HTTP 下使用 TLS,主要保护传输中的机密性、完整性以及对端身份验证。它不会替应用检查“用户 A 能不能读取用户 B 的订单”。即便访问控制漏洞位于 HTTPS 接口,漏洞仍然存在。
本实验使用本机明文 HTTP,没有 TLS 服务。向 https://127.0.0.1:18080 发请求失败,并不能证明 TLS 本身不安全。后续证书实验再讨论信任链、主机名匹配和有效期;不要用关闭证书校验来宣称问题已解决。
六、练习与答案
先回答,再展开。
- 本机
/missing返回 404,是否需要先检查 DNS? - Docker 宿主 18080 与容器 8080 不同,是不是配置错了?
curl -i与curl -I是否执行同一类请求?
参考答案
- 本例使用字面 IP,且已收到 HTTP 响应,优先检查应用路径;不是 DNS 问题。
- 不一定。端口发布本来就允许两侧端口不同,需要按映射关系解释。
- 不是。前者显示响应头,后者请求 HEAD,服务端可能采取不同处理逻辑。
下一篇:Linux 用户、权限与最小暴露。返回学习路线。