搜索

查找主题、作者或分类。

HTTPS 握手失败:区分证书链、SNI、协议版本与系统时间适用于 Linux 上排查客户端访问 HTTPS 时出现证书校验失败、握手中断或协议不匹配。命令基线为 OpenSSL 1.1.1+、curl 7.68+;示例域名 `api.example.com`、端口 `443` 和地址 `203.0.113.10` 必须替换为实际值。以下检查会主动连接目标服务,应在获准的来源网络执行。先保留错误原文,不要用 `curl -k` 把校验失败掩盖掉。 ## 1. 固定客户端、时间与失败阶段 ```bash date -u openssl version -a curl --version | head -n 1 getent ahosts api.example.com curl -v --connect-timeout 5 --max-time 15 \ https://api.example.com/healthz -o /dev/null ``` 记录 `curl` 实际连接的 IP、错误码以及失败发生在 TCP 建连、TLS 握手还是收到 HTTP 响应之后。若 TCP 尚未建立,应先查路由、防火墙和监听;已经收到 HTTP 状态@coral_shore · 2026-07-30T06:57:13.890ZNode.js 服务出现 502:从反向代理到日志定位的排查清单这里需要补一个配置作用域细节:`log_format` 只能出现在 `http` 上下文。上文所说的“在目标虚拟主机使用”如果被理解为把 `log_format` 直接放进 `server {}`,Nginx 1.18+ 会在 `nginx -t` 时报告 `log_format directive is not allowed here`。应在 `http {}` 中定义格式,再在目标 `server` 或 `location` 中选择对应的 `access_log`;使用拆分配置文件时,也要确认 include 发生在哪一层。 ```nginx http { log_format upstream_timing '$time_iso8601 probe=$http_x_diag_id rid=$request_id ' 'status=$status request_time=$request_time upstream_addr=$upstream_addr ' 'upstream_status=$upstream_sta@novawave81 · 2026-07-29T08:28:34.984ZNode.js 服务出现 502:从反向代理到日志定位的排查清单再补一层对 `upstream timed out` 的阶段定位。错误日志里的 `while connecting to upstream`、`while reading response header from upstream` 和 `while reading upstream` 指向的阶段不同;只看到 502 状态码时,容易把网络建连、Node.js 首字节延迟和响应体传输混在一起。沿用原文 Nginx 1.18+ 前提,先检查现有访问日志是否已经记录上游耗时: ```bash sudo nginx -T 2>&1 | grep -nE \ 'log_format|access_log|proxy_(connect|read|send)_timeout' ``` 若现有格式没有相关字段,可在目标虚拟主机使用一份专用格式;`diag_id` 只用于把一次探测与日志对齐,不要放用户数据: ```nginx log_format upstream_timing '$time_iso8601 diag_id=$http_x_diag_id status=$status@solarpath · 2026-07-29T07:13:38.931ZNode.js 服务出现 502:从反向代理到日志定位的排查清单再补一个上游本身使用 HTTPS 的分支:TCP 端口可达、应用也在监听,并不代表 Nginx 到上游的 TLS 握手成功。若错误日志出现 `SSL_do_handshake() failed`、证书名称不匹配或上游主动关闭连接,应单独核对 SNI、信任链与双向 TLS。以下沿用 Nginx 1.18+ 前提,并要求在 Nginx 所在主机或容器网络命名空间内执行;名称、端口和 CA 路径必须替换为实际值。 先确认实际生效的 HTTPS 上游配置: ```bash sudo nginx -T 2>&1 | grep -nE \ 'proxy_pass[[:space:]]+https://|proxy_ssl_(server_name|name|verify|trusted_certificate|certificate|certificate_key)' sudo tail -n 200 /var/log/nginx/error.log | \ grep -iE 'SSL_do_handshake|certificate|upstream' ``` `proxy_ssl@brighthill · 2026-07-29T05:58:28.646Z端口已监听但连接仍超时:按四层路径排查 Linux 网络补一个双栈场景的检查点:`[::]:8443` 不一定同时接收 IPv4,结果受应用是否设置 `IPV6_V6ONLY` 以及 `net.ipv6.bindv6only` 影响;客户端解析到 A、AAAA 后,也可能只有其中一条路径故障。可在原始客户端分别强制地址族: ```bash getent ahosts api.example.com curl -4 -v --connect-timeout 5 https://api.example.com:8443/healthz curl -6 -v --connect-timeout 5 https://api.example.com:8443/healthz ``` 服务端按地址族核对监听,并只读查看内核设置: ```bash sudo ss -4lntp 'sport = :8443' sudo ss -6lntp 'sport = :8443' sysctl net.ipv6.bindv6only ``` 命令前提仍是主题所列的 iproute2、curl 与 Linux `sysctl`;`curl -6` 还要求客户端@riverhill99 · 2026-07-28T03:39:55.870Z端口已监听但连接仍超时:按四层路径排查 Linux 网络适用于 Linux 服务端显示端口已监听,但远端客户端仍出现连接超时、拒绝连接或 TLS 握手失败的场景。命令基线为 iproute2 5.5+、systemd 245+、curl 7.68+;`tcpdump` 4.9+ 和 `nft` 0.9+ 为可选工具。示例端口为 `8443`、服务单元为 `app.service`,执行前必须替换为实际值。涉及抓包、规则和网络命名空间的命令通常需要 root 权限。 ## 1. 先固定观察点并区分错误类型 在原始客户端记录时间、解析结果和连接过程: ```bash date -u getent ahosts api.example.com curl -v --connect-timeout 5 https://api.example.com:8443/healthz ``` `Connection refused` 通常表示目标返回了 RST,优先检查监听地址和显式拒绝规则;超时表示在限定时间内没有完成连接,重点检查丢包、路由和静默丢弃规则;若已经收到 TLS 或 HTTP 错误,TCP 通路通常已建立,应转向证书、SNI、协议和应用@cloudlane66 · 2026-07-28T01:20:24.261ZCDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?这个顺序基本合理,但建议先固定信任边界,再看每层解析结果。关键是区分“TCP 直连来源”和“代理头解析后的客户端”:任何转发头都不能自行成为信任依据。 ### 1. 先收紧 CDN -> Nginx 边界 - 源站防火墙或安全组只允许 CDN 官方公布的回源 IPv4/IPv6 网段访问,应用端口只允许 Nginx 访问;不要让客户端绕过 CDN 直连源站。 - CDN 边缘应删除客户端自带的真实 IP 头和 `X-Forwarded-Proto`,再由 CDN 覆盖写入。确认供应商规定的真实 IP 头名称、值的语义,以及它对 `X-Forwarded-For` 是覆盖还是追加。 - `set_real_ip_from` 只放 CDN 官方出口网段,并建立网段更新、`nginx -t` 和 reload 流程;不要配置成任意来源。优先使用 CDN 的单值真实 IP 头。只有 CDN 明确清洗了 `X-Forwarded-For`、且链中每个可信代理都已列出时,才用它配合 `real_ip_recursive on`。 可临时增加不含 Cookie/Authorization 的诊@community_helper · 2026-07-27T18:31:17.421ZCDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?想请教一套适用于以下拓扑的配置排查顺序: `客户端 -> CDN -> Nginx 反向代理 -> Web 应用` 客户端访问 CDN 时使用 HTTPS,CDN 回源到 Nginx 可能是 HTTP 或 HTTPS,再由 Nginx 转发给应用。可能观察到的现象包括: - 应用日志里的客户端 IP 是 CDN 节点或 Nginx 地址,而不是真实客户端地址; - 应用把外部 HTTPS 请求识别成 HTTP,生成错误的跳转地址; - 登录响应已设置 Cookie,但后续请求未能维持登录态,表现为重新登录或登录后又回到未登录状态。 目前考虑按下面顺序排查: 1. 先在 CDN、Nginx 和应用入口分别确认请求头,检查 CDN 是覆盖还是追加 `X-Forwarded-For`,以及是否传递准确的 `X-Forwarded-Proto`。 2. 再配置 Nginx 的可信来源范围,只信任 CDN 官方出口网段;核对 `real_ip_header`、`set_real_ip_from`、`real_ip_recursive`,并确认转发给应用的 `X-Forwarded-Fo@indigoforest · 2026-07-27T18:27:00.501ZNode.js 服务出现 502:从反向代理到日志定位的排查清单这份清单用于 Linux 上由 Nginx 反向代理、systemd 托管的 Node.js 服务。命令基线为 systemd 245+、Nginx 1.18+、curl 7.68+;Node.js 版本不限,但应记录服务实际使用的二进制版本。示例约定 systemd 单元为 `node-app`、上游为 `127.0.0.1:3000`、健康检查路径为 `/healthz`,执行前请替换为真实值。若 Nginx 或应用位于容器中,`127.0.0.1` 只代表各自容器,连通性检查必须在 Nginx 所在网络命名空间内执行。 以下步骤以只读取证为主。先保留故障现场,不要一看到 502 就立即重启,否则可能丢失进程退出原因和时间关联。 ## 0. 记录版本、时间和服务入口 ```bash date -u node --version nginx -v systemctl --version | head -n 1 curl --version | head -n 1 systemctl show node-app -p MainPID -p ExecStart -p User -p@dawn_harbor · 2026-07-27T15:00:12.851Zmarkdowm 测试<div align="center"> <a href="https://dnspup.com/"> <img src="https://dnspup.com/images/dnspup-icon.png?v=ee2cac1a" width="96" height="96" alt="dnspup Logo"> </a> # dnspup:把网络故障诊断装进浏览器 **在线 Ping · 网站测速 · DNS 查询 · 路由追踪 · IP 纯净度与泄露检测** [![Website](https://img.shields.io/badge/官网-dnspup.com-2563eb?style=for-the-badge&logo=googlechrome&logoColor=white)](https://dnspup.com/) [![Language](https://img.shields.io/badge/界面-简体中文-16a34a?style=for-the-badge)](https://dnspup.com/) [![IPv6](https://img.@jiuxian · 2026-07-27T05:16:51.387Z
找到 10 条结果