尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

告别端口尾巴与自签证书:用 Cloudflare + OCI Socat 穿透暴露云端 K3s ArgoCD

告别端口尾巴与自签证书:用 Cloudflare + OCI Socat 穿透暴露云端 K3s ArgoCD 告别端口尾巴与自签证书用 Cloudflare OCI Socat 穿透暴露云端 K3s ArgoCD背景与痛点我的 GitOps 管控集群aliyun-k3s跑在一台 2C2G2GB 内存的云服务器上8.148.149.80上面跑着完整的 ArgoCD 全家桶application-controller、repo-server、server、redis等。默认情况下ArgoCD Server 是通过 K3s 的 NodePort 暴露出来的HTTP 端口31589内部强制 307 重定向到 HTTPSHTTPS 端口30080自带自签证书日常访问有几个明显的痛点必须带端口尾巴每次登录都要输入https://8.148.149.80:30080非常繁琐。浏览器自签证书警告每次打开都会弹红色的“您的连接不是私密连接”得手动点高级继续。主节点内存吃紧2GB 内存跑完 K3s 控制面和 ArgoCD 后物理内存已经占用了近 1.6GB80% 以上。如果为了暴露 443 端口强行在主节点上装一套 Kong Ingress Controller 或者 Envoy常驻内存会飙升 300MB~500MB遇到突发流量极容易触发 Linux OOM Killer 把argocd-application-controller干掉。我手头买了一个新域名jppwl.asia并把 DNS 托管到了 Cloudflare。目标很明确实现标准https://argo.jppwl.asia443 端口 权威免费 SSL 绿锁直接访问 ArgoCD同时不在源服务器节点增加任何重型组件和内存负担。架构选型与踩坑实录尝试方案一Cloudflare Origin Rules直接重写回源端口Cloudflare 免费版提供了一个叫Origin Rules回源规则的功能理论上支持在边缘节点接收到 443 请求后自动将回源目标端口重写为指定的端口如30080。配置思路argo.jppwl.asia解析到源站 IP8.148.149.80开启 Cloudflare 代理小黄云。配置 Origin Rule当Hostname argo.jppwl.asia时回源端口重写至30080。Cloudflare SSL/TLS 模式设置为Full。踩坑现场525 SSL Handshake Failed 与 SNI 握手阻断规则部署完成后用 curl 测试curl-s-ihttps://argo.jppwl.asia返回直接报错HTTP/2 525 server: cloudflare error code: 525 (SSL handshake failed)为什么会 525我用 Python 写了个脚本直接模拟不同的 SNI 向目标机器的 30080 端口发起 TLS 握手测试importssl,socket hostname8.148.149.80port30080forsniin[None,localhost,8.148.149.80,argo.jppwl.asia]:try:ctxssl.create_default_context()ctx.check_hostnameFalsectx.verify_modessl.CERT_NONEwithsocket.create_connection((hostname,port),timeout3)assock:withctx.wrap_socket(sock,server_hostnamesni)asssock:print(fSNI{sni}- SUCCESS: TLS{ssock.version()})exceptExceptionase:print(fSNI{sni}- FAILED:{e})输出结果SNINone - SUCCESS: TLSTLSv1.3 SNIlocalhost - SUCCESS: TLSTLSv1.3 SNI8.148.149.80 - SUCCESS: TLSTLSv1.3 SNIargo.jppwl.asia - FAILED: [Errno 104] Connection reset by peer原因分析当客户端带外部未登记的自定义域名 SNI 发起 Client Hello 时源站服务商的网络安全网关在握手阶段在物理层重置了 TCP 连接Connection Reset。Cloudflare 无法完成与源站的 TLS 握手因而直接抛出 525 错误。这意味着直接将未完成服务商接入审核的域名解析到该源站公网 IP 上会受到服务商边界安全策略的强制重置。方案二利用 OCI 节点作为公网入口走 Tailscale 隧道安全穿透既然源站公网 IP 有外层访问策略限制但我的所有多云节点都在同一个 Tailscale 虚拟局域网中WireGuard 隧道加密。我在 OCI 新加坡有一台闲置的 Always Free 机器free-amd-vm2161.118.240.218Tailscale IP100.122.84.84它本身也是aliyun-k3s集群的 Worker 节点之一。整体流量拓扑设计如下渲染错误:Mermaid 渲染失败: Parse error on line 4: ...|2. TLS 443 回源(直连 OCI 节点)| OCI[OC -----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got PS为什么这个方案最合理多云边界策略自由Cloudflare 回源到 OCI 节点没有任何访问限制握手秒级完成。Tailscale 隧道安全穿透OCI 到源站 Master 走的是纯内网 WireGuard 加密隧道流量全程加密。极低资源开销在 OCI 节点上用socat做纯 TCP 层的透明字节流转发内存占用仅 1.1MB不占 CPU也不需要额外维护 Web 服务器证书。源站端零改动原服务器节点不需要装任何反向代理网关不消耗额外内存。落地实施步骤1. 在 OCI 节点上配置 socat 服务登录free-amd-vm2100.122.84.84创建 systemd 服务catEOF|sudotee/etc/systemd/system/argocd-socat-proxy.service[Unit] DescriptionArgoCD Port 443 Forwarder to K3s NodePort 30080 Afternetwork.target tailscaled.service Wantstailscaled.service [Service] Typesimple ExecStart/usr/bin/socat TCP-LISTEN:443,fork,reuseaddr TCP:100.114.103.101:30080 Restartalways RestartSec5 Userroot [Install] WantedBymulti-user.target EOF启动并设置开机自启sudosystemctl daemon-reloadsudosystemctlenable--nowargocd-socat-proxy.service放行防火墙端口sudoiptables-IINPUT1-ptcp--dport443-jACCEPT检查服务运行状态$sudosystemctl status argocd-socat-proxy.service --no-pager ● argocd-socat-proxy.service - ArgoCD Port443Forwarder to K3s NodePort30080Loaded: loaded(/etc/systemd/system/argocd-socat-proxy.service;enabled)Active: active(running)Memory:1.1M CGroup: /system.slice/argocd-socat-proxy.service └─2245846 /usr/bin/socat TCP-LISTEN:443,fork,reuseaddr TCP:100.114.103.101:300802. 配置 Cloudflare DNS 与 SSL在 Cloudflare 控制台完成配置① 修改 DNS 记录把argo.jppwl.asia和argocd.jppwl.asia指向 OCI 节点的公网 IP并开启代理小黄云Type: A Name: argo IPv4 address: 161.118.240.218 Proxy status: Proxied (开启小黄云)② 设置 SSL 模式为 Full进入SSL/TLS设置加密模式选择FullCloudflare 对外提供 Universal SSL 证书对源站发起 TLS 连接。因为socat在 443 端口直接将 TLS 握手流透传给后端的 ArgoCD30080ArgoCD 自带自签名证书Full模式下 Cloudflare 接受自签证书握手完美闭环。最终验证全部生效后在终端发起验证$curl-s-ihttps://argo.jppwl.asia输出结果HTTP/2 200 date: Sun, 30 Aug 2026 09:47:53 GMT content-type: text/html; charsetutf-8 content-security-policy: frame-ancestors self; vary: Accept-Encoding x-frame-options: sameorigin x-xss-protection: 1 cf-cache-status: DYNAMIC server: cloudflare !doctype htmlhtml langenheadmeta charsetUTF-8titleArgo CD/titlebase href/meta nameviewport contentwidthdevice-width,initial-scale1link relicon typeimage/png hrefassets/favicon/favicon-32x32.png sizes32x32/link relicon typeimage/png hrefassets/favicon/favicon-16x16.png sizes16x16/link hrefassets/fonts.css relstylesheetscript deferdefer srcmain.2c48e1df88f1dd48beac.js/script/headbodynoscriptpYour browser does not support JavaScript. Please enable JavaScript to view the site. Alternatively, Argo CD can be used with the a hrefhttps://argoproj.github.io/argo-cd/cli_installation/Argo CD CLI/a./p/noscriptdiv idapp/div/bodyscript deferdefer srcextensions.js/script/html在浏览器直接打开https://argo.jppwl.asia地址栏显示干净的https://argo.jppwl.asia没有:30080后缀。拥有完整的 Cloudflare 权威 SSL 绿色安全锁零拦截、零自签警告。内存开销原 Master 节点 0 额外增加OCI 节点仅消耗 1.1MB。总结与经验排查 TLS 握手要看 SNI当遇到 525 错误时先用脚本测试不同 SNI 场景下的表现能迅速定位是证书问题还是外层网络边界拦截。多云拓扑的优势在于借力遇到特定云厂商的公网访问限制时不需要推翻已有架构让其他云平台节点作为入口跳板配合 Tailscale 私网穿透可以用极低成本绕过链路限制。不要滥用重型网关对于纯粹的内网管理面板暴露单行socatTCP 代理在性能和资源占用上1.1MB 内存远胜额外拉起一套复杂的 Ingress/Nginx。
返回列表