游客发表

ssl加密中转教程

发帖时间:2026-10-17 05:13:01

去年帮朋友处理一个跨境电商的密中小项目,服务器放在海外,转教国内访问后台经常断流,密中支付回调也时不时超时。转教他一开始想上VPN,密中我说那玩意儿容易被识别,转教不如直接拿一台国内中转机做SSL加密转发。密中折腾了一下午,转教效果比预想的密中好——延迟从800ms降到120ms左右,丢包几乎没了。转教这套方案的密中核心其实就一句话:用Nginx的stream模块做TCP层的SSL中转,客户端到中转机加密,转教中转机到源站再加密或明文,密中中间运营商只能看到一坨TLS流量。转教

先讲清楚原理。密中普通代理是客户端直接连源站,中间经过运营商骨干网,QoS限速和SNI阻断都发生在这段。SSL中转的做法是:你在国内租一台VPS(比如阿里云轻量、腾讯云硅谷节点反向不行,得是国内机),在这台机器上监听一个端口,客户端连这个端口时走TLS,中转机解密后把原始TCP流转发到海外源站。运营商看到的是你连国内VPS的443端口,流量特征和正常HTTPS没区别。源站那边如果也配了TLS,就是双重加密,中间人拿不到明文。

Nginx配置怎么写

编译Nginx时要带--with-stream和--with-stream_ssl_module。默认的apt安装版通常没带,得自己编或者找第三方源。配置文件放在/etc/nginx/nginx.conf的顶层,不能塞在http块里。一个能用的最小配置长这样:

stream {  upstream backend {  server 你的海外源站IP:443; } server {  listen 443 ssl; proxy_pass backend; ssl_certificate /etc/nginx/cert.pem; ssl_certificate_key /etc/nginx/key.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; } }

证书可以自签,也可以拿Let's Encrypt的。自签的话客户端要加-k或者导入CA,稍微麻烦点。我一般用acme.sh签个域名证书,反正中转机有公网IP,DNS解析过去就行。注意proxy_pass后面不要加http://,stream模块是四层的,加了会报错。

客户端怎么连

如果是浏览器或API调用,直接把目标地址改成https://中转机IP或域名:443,但Host头要设成源站域名——这步容易漏。比如源站是api.example.com,你连中转机1.2.3.4:443,请求头里必须带Host: api.example.com,否则源站Nginx会返回404。用curl测试的话:

curl -v --resolve api.example.com:443:1.2.3.4 https://api.example.com/endpoint

--resolve强制把域名解析到中转机,SNI和Host都保持原样,这样最接近真实场景。如果是数据库或Redis这类TCP服务,客户端一般不支持SNI,那就得在中转机上用proxy_ssl_server_name on;把SNI透传给源站,否则源站可能拒绝握手。

几个实际踩过的坑

中转机的带宽和流量是硬成本。国内VPS出口带宽普遍小,1Mbps的机器跑HTTPS中转,下载速度撑死120KB/s。我朋友那个项目是API调用,流量不大,所以够用。要是传文件,得选按流量计费的机型,或者上CDN回源——但CDN回源本身也是类似逻辑,只是节点更多。

还有连接数限制。Nginx默认worker_connections是512,stream模块下每个TCP连接占两个fd(客户端侧和服务端侧),并发一高就报worker_connections are not enough。改成worker_connections 4096;,同时调大worker_rlimit_nofile。另外proxy_timeout默认10分钟,长连接场景要改大,不然空闲一会儿就断。

最后说个观察:这套方案不是翻墙用的,它解决的是“合法业务但链路质量差”的问题。真正做跨境支付、海外API调用的团队,很多都在用类似架构,只是包装成了“全球加速”产品。自己搭的好处是便宜、可控,坏处是得自己维护证书和监控。我给朋友加了Prometheus的nginx-exporter,盯住nginx_stream_connections和nginx_stream_bytes_total,流量异常能第一时间发现。折腾完那天他请我吃了顿烧烤,说比买商业加速服务省了八成钱。

    热门排行

    友情链接