先把问题画成一条线

我需要的并不是把整台家庭服务器暴露到公网,而是让一台同时拥有 IPv4 和 IPv6 的腾讯云主机,只转发 Emby 所需的端口。外部设备连接云服务器的 IPv4,云服务器再通过 IPv6 把请求送回家。

这套结构最重要的价值是边界清晰:云服务器只负责入口和转发,媒体文件始终留在家里,动态 IPv6 变化则交给定时任务处理。

入口保持简单

Nginx 监听 8096,同时接受 IPv4 与 IPv6 连接。上游地址写成家庭服务器的 IPv6,并保留 WebSocket 所需的请求头。这样 Emby 的页面、播放进度和视频流都走同一条路径。

server {
  listen 8096;
  listen [::]:8096;

  location / {
    proxy_pass http://[HOME_IPV6]:8096;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

真正容易忽略的是网络选择

客户端看见域名同时有 A 和 AAAA 时,往往会优先尝试 IPv6。某些公共 Wi‑Fi 的 IPv6 看似可用,实际路径却不完整,于是首页能打开、视频却失败。排障时,把 IPv4 和 IPv6 两条路径分开验证,会比反复怀疑应用端口更快。

最后得到的经验很朴素:先确认 DNS 把人带去了哪里,再看入口端口,最后才检查应用。网络故障经常不是“完全不通”,而是走错了一条看起来更近的路。