<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>架构优化 on My Life is Going On</title><link>https://liuhp.net/tags/%E6%9E%B6%E6%9E%84%E4%BC%98%E5%8C%96/</link><description>Recent content in 架构优化 on My Life is Going On</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 23:33:59 +0000</lastBuildDate><atom:link href="https://liuhp.net/tags/%E6%9E%B6%E6%9E%84%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>sucaddy v5.1 架构精简：用 SSH 反向隧道取代自建 Relay</title><link>https://liuhp.net/post/2026-04-29-sucaddy-v5-1-%E6%9E%B6%E6%9E%84%E7%B2%BE%E7%AE%80-%E7%94%A8-ssh-%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E5%8F%96%E4%BB%A3%E8%87%AA%E5%BB%BA-relay/</link><pubDate>Wed, 29 Apr 2026 23:33:59 +0000</pubDate><guid>https://liuhp.net/post/2026-04-29-sucaddy-v5-1-%E6%9E%B6%E6%9E%84%E7%B2%BE%E7%AE%80-%E7%94%A8-ssh-%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E5%8F%96%E4%BB%A3%E8%87%AA%E5%BB%BA-relay/</guid><description>&lt;!-- more --&gt;
&lt;h2 id="为什么动了-relay"&gt;为什么动了 Relay？&lt;/h2&gt;
&lt;p&gt;sucaddy 的 Relay 模块最初的设计思路很朴素：把边缘节点的流量通过中继节点转发，实现跨网段互通。代码里手写了一套 AES-256-GCM 加密，用 FIFO 队列管理连接，单连接模式跑通信。&lt;/p&gt;
&lt;p&gt;用着用着问题就出来了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;FIFO 死连接&lt;/strong&gt;：旧连接不释放，把队列占满，新连接挤不进去&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有多路复用&lt;/strong&gt;：一个连接只能传一个流，并发能力为零&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;断线重连有间隙&lt;/strong&gt;：1 秒空窗期间请求直接丢，实测成功率只有 67%&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每次排查这些问题都让我怀疑人生——这些功能 SSH 原生不就自带吗？为什么我要自己写一遍，还写得这么烂？&lt;/p&gt;
&lt;h2 id="方案对比自建-vs-成熟方案"&gt;方案对比：自建 vs 成熟方案&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th style="text-align: center"&gt;自建 Relay&lt;/th&gt;
&lt;th style="text-align: center"&gt;SSH 反向隧道&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;加密&lt;/td&gt;
&lt;td style="text-align: center"&gt;手写 60 行 AES-256-GCM&lt;/td&gt;
&lt;td style="text-align: center"&gt;SSH 内置 AES-256-GCM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多路复用&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ SSH channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成功率&lt;/td&gt;
&lt;td style="text-align: center"&gt;67%&lt;/td&gt;
&lt;td style="text-align: center"&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;延迟&lt;/td&gt;
&lt;td style="text-align: center"&gt;3.5-4.8s&lt;/td&gt;
&lt;td style="text-align: center"&gt;2.3-2.6s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码量&lt;/td&gt;
&lt;td style="text-align: center"&gt;~350 行&lt;/td&gt;
&lt;td style="text-align: center"&gt;0 行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;保活&lt;/td&gt;
&lt;td style="text-align: center"&gt;自己写心跳&lt;/td&gt;
&lt;td style="text-align: center"&gt;autossh + systemd&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结论很明显：&lt;strong&gt;删掉它&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="具体怎么干的"&gt;具体怎么干的&lt;/h2&gt;
&lt;h3 id="ssh-反向隧道拓扑"&gt;SSH 反向隧道拓扑&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;边缘节点 → 中心节点 :端口A → 边缘节点本地服务（直连回内网）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;边缘节点 → 中心节点 :端口B → 边缘节点出墙链路
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;中心节点上用 systemd + autossh 保活，断线自动重连&lt;/li&gt;
&lt;li&gt;边缘节点用 cron keepalive 防止 NAT 超时&lt;/li&gt;
&lt;li&gt;一条命令搞定：&lt;code&gt;ssh -R [端口]:[目标地址]:[目标端口] user@host&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="naiveproxy-新增-tcpaddr-路由"&gt;NaiveProxy 新增 &lt;code&gt;tcp:ADDR&lt;/code&gt; 路由&lt;/h3&gt;
&lt;p&gt;在 NaiveProxy 里加了一个新的路由类型：&lt;code&gt;route: tcp:ADDR&lt;/code&gt;。用户认证成功后，直接转发到本地指定端口（比如 SSH 隧道的入口）。大约 25 行代码，替代了整个 relay 入口模块。&lt;/p&gt;</description></item></channel></rss>