想让家里只带 IPv6 的机器上的服务,普通人用 IPv4 也能打开? 用阿里云 ESA(边缘安全加速)搭一个"入口"就行了。
一、一句话说清原理
原来只有 IPv6 的用户访问你的服务会直接失败——他的网络"不认识" IPv6 地址。
ESA 的作用是当一个中间人:
用户(只有 IPv4)
│ https://app.example.com
▼
阿里云边缘节点 ← 这里是"有 IPv4 的地方",用户能连上
│ 悄悄跑到你家去取数据(回源)
▼
你的服务器(只有 IPv6)
边缘节点先把用户的 HTTPS 请求接下来,再自己跑一趟你家把内容取回来交给用户。 全程不用你自己有公网 IPv4,也不用买中转服务器。
整套配置就分三块,一块一块来:
| 块 | 在哪配 | 管什么 |
| ① 服务器配置 | 你自己的机器(nginx) | 让服务能接受 8443 端口的加密请求 |
| ② DNS 解析配置 | 阿里云 DNS | 把域名指对,并让源站 IPv6 自动更新 |
| ③ ESA 配置 | 阿里云 ESA 站点 | 边缘节点怎么接、怎么回源、要不要缓存 |
二、第一块:服务器配置
1. 装好 nginx,配一个 8443 端口的入口
你家路由器封了 80 和 443(很多宽带都这样),所以换个端口,比如 8443。
server {
listen [::]:8443 ssl;
server_name app.example.com origin.example.com;
ssl_certificate /etc/nginx/ssl/example-fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example-privkey.key;
location / {
proxy_pass http://127.0.0.1:17231;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
逐行说人话:
listen [::]:8443 ssl—— 只监听 IPv6 的 8443 端口,并且启用 HTTPS。
为什么写 8443?因为你家路由器的 80/443 被封了。
server_name要同时写对外域名和源站域名,少写一个就会 404。proxy_pass http://127.0.0.1:17231—— nginx 帮你把请求转给真正跑着的服务端口。proxy_set_header Host $host—— 必须有,否则你的服务会收到 Host 是127.0.0.1:17231的请求。
2. 证书
放一张泛域名证书(*.example.com),一张顶所有子域。
这张证书后面第三块还要再用一次,两处得是同一张。
3. 自己先测通
注意用 [::1](IPv6 的本地回环),因为这个端口只听 IPv6:
curl --resolve app.example.com:8443:[::1] https://app.example.com:8443/
看到 200 就说明服务器这块 OK 了。
三、第二块:DNS 解析配置
1. 加一条源站记录
在阿里云 DNS 加一条 AAAA 记录:
origin.example.com AAAA <你服务器的 IPv6>
为什么用域名、不直接填 IP? 因为你的 IPv6 会变(运营商给的临时地址过阵子就换)。写死 IP 的话一换地址服务就挂了, 而且不报错、没日志,特别难查。写成域名 + 后面自动更新,才是长久之计。
2. 让它自动跟着 IP 变
写个定时脚本(每 5 分钟跑一次):
- 查当前服务器的 IPv6
- 跟 DNS 里那条 AAAA 比一下
- 不一样就改,改完再读回来确认
两个要点:
- 取哪个 IPv6:要取长期不变的那个(网卡上的"管理地址"),别取临时地址——
临时地址过阵子就换,改了也白改。
- 用小权限账号:只给"查记录"和"改记录"两个权限,别给新增和删除。
3. 加一条 CNAME 指向 ESA
这个等第三块建完记录再填,因为目标地址是 ESA 给的。
四、第三块:ESA 配置
1. 建一条加速记录
告诉 ESA:"有人访问 app.example.com 的时候,你去 origin.example.com 那拿。"
aliyun esa CreateRecord \
--SiteId <SiteId> \
--RecordName app.example.com \
--Type CNAME \
--Data "{\"Value\":\"origin.example.com\"}" \
--SourceType Domain \
--Proxied true \
--HostPolicy follow_hostname \
--Ttl 1 \
--BizName web
跑完会返回一个 RecordCname,长这样:app.example.com.a1.inituu.com。 把它填回第二块那条 CNAME,第二步就完成了。
2. 告诉 ESA 回源时走哪个端口
边缘节点默认只走 80/443,而你家封了这两个,所以要指定走 8443。
aliyun esa CreateOriginRule \
--SiteId <SiteId> \
--RuleName "app-origin" \
--Rule '(http.host eq "app.example.com")' \
--RuleEnable on \
--OriginScheme https \
--OriginHttpsPort 8443 \
--OriginHost app.example.com \
--OriginVerify off \
--Sequence 1
⚠️ 一定要"新建一条带 Rule 的规则",不要去改那条全局规则。 全局规则是给整个站点用的,一改就等于把站点上别的域名全带崩了。
3. 如果是动态页面,关掉缓存
ESA 默认什么都缓存 24 小时。你要是跑的是带登录、带 token 的后台, 缓存起来就会把旧页面发给用户,还特别难排查。
aliyun esa CreateCacheRule --SiteId <SiteId> \
--RuleName "bypass-app" \
--Rule '(http.host eq "app.example.com")' \
--BypassCache bypass_all \
--EdgeCacheMode no_cache \
--BrowserCacheMode no_cache \
--ServeStale off \
--RuleEnable on \
--Sequence 1
Sequence 给个小数字(比如 1),让它排在默认规则前面才生效。
怎么确认生效了?别看返回码(命中缓存也是 200,要看响应头):
curl -sI https://app.example.com/ | grep -iE '^(age|cache-control):'
# 有 Cache-Control: no-cache,而且没有 Age 头 = 没被缓存
4. 把证书也交给 ESA
边缘节点给用户看的那张证书,也要是同一张泛域名证书。
覆盖 ESA 上的证书(注意:没有 UpdateCertificate 这个命令, 覆盖和新建都是 SetCertificate,带上原来的 Id 就是覆盖,不会堆出一堆废证书):
aliyun esa SetCertificate --SiteId <SiteId> --Type upload \
--Id <已有证书Id> --Name "$(date +%Y%m%d%H%M%S)" \
--Certificate "$(cat fullchain.pem)" --PrivateKey "$(cat privkey.key)"
⚠️ 自签证书不行,ESA 边缘会校验(会报 ssl_verify=18),得用正经 CA 签的。
五、常用命令
aliyun esa ListSites --PageSize 30 # 看站点、拿 SiteId
aliyun esa ListRecords --SiteId <SiteId> # 看加速记录
aliyun esa ListOriginRules --SiteId <SiteId> # 看回源规则
aliyun esa ListCacheRules --SiteId <SiteId> # 看缓存规则
aliyun esa ListCertificates --SiteId <SiteId> # 看证书和过期时间
不知道命令叫什么,让它自己找:aliyun esa --help-search 关键词
六、几个容易踩的坑
| 现象 | 原因 | 怎么办 |
| 回源报错 400 | 第一块和第三块只改了一边 | 两边一起改:nginx 加 ssl,ESA 改 OriginScheme https |
| 域名建好了但打不开 | ESA 的 A 记录还没下发(实测 40 秒 ~ 8 分钟) | 等着就行,别删了重建,越删越慢 |
| 本机能开、外面开不了 | 本机走代理/DNS 缓存的问题 | 从另一台外部机器测 |
| 全部 502 | 源站 IP 记录过期了,或者证书到期了 | 先看证书过期时间,再看 DNS 记录对不对 |
| 返回旧页面 / 旧 token | 被边缘缓存了 | 补一条缓存豁免规则 |
另外:
- 边缘端口是套餐写死的,不能改(想加自定义端口会报
QuotaCheckFailed.CustomPort);
但回源端口可以随便填,这是绕开封端口的关键。
- 想代理 TCP/UDP 这种四层流量(游戏、数据库直连),这个方案不管用,那是企业版功能。
七、什么时候适合用这套
✅ 家里/小办公室只有 IPv6,但想让外面的人访问 ✅ 服务是网页、API 这种 HTTP(S) 七层的东西 ✅ 不想额外买带宽、不想加中转机器
❌ 需要代理任意端口的 TCP/UDP ❌ UDP / QUIC 协议(游戏、实时视频) ❌ 需要源站有稳定公网 IPv4(那种情况用云服务器反代更合适)
八、总结
服务器:加一个 8443 的 nginx 入口,证书放好。 DNS:源站用域名 + 自动更新 IP,再把域名 CNAME 指向 ESA。 ESA:建加速记录、回源规则指向 8443、动态内容加缓存豁免、证书同步一份。
长期要维护的就两件事:IP 变了自动改 DNS、证书续期同步两处。
文章评论