前言
在 玩转云服务(11):Cloudflare Tunnel 内网穿透(以 Jellyfin 为例)一文中,介绍了怎么方便地做内网穿透。不过,也许出于以下理由,你想更加折腾:
- 宽带分配了 IPv6 公网 IP。(如果你运气好能争取到 IPv4 公网 IP,这篇文章你就不需要看了)
- 觉得 Cloudflare Tunnel 跑不满上行带宽(比如我家),想更进一步。
先决条件
必须满足以下所有条件:
- 家庭宽带分配了 IPv6 公网 IP,并且光猫、路由器已设置妥当。这部分不是本文的范围,请自行百度,必要时请联系你的宽带师傅。
- 确保电脑也能分配到 IPv6 公网 IP。怎么查看可见下文。
- 使用的是 Windows 电脑。我相信大部分需要这个教程的都是使用闲置的或者主力 Windows 电脑试一下。如果你组建独立的 Linux 服务器,本文应该也能对你有参考意义,但是 PowerShell 部分需要自行修改。
- 有一个已经部署的、想被暴露的服务。本文以 Jellyfin 作为示范。Jellyfin 的搭建见:大内网战略(5):自建在线相册/影视网站 Jellyfin
- 有一个域名,并且解析在 Cloudflare 上。购买可见:Cloudflare 购买与解析域名
路由器
对于小米路由器,获取到 IPv6 公网 IP 后,关闭防火墙才能访问内部的设备。

/64
,这样才能进一步分配给内网里的机器,如果是 /128
,说明运营商只分配了 1 个 ip 而不是一大坨 ip,这样只能做端口映射或者干脆打电话给运营商。这种极端情况不在本文讨论范围之内
检查 IPv6
检查
打开 CMD,输入命令
ipconfig -all
找到用来上网的网卡,一般可以发现有好几个 IPv6 地址。

- 短的 IPv6 地址是通过 DHCPv6 分配的。
- 长的 IPv6 地址是通过 SLAAC 获得的。
- 临时 IPv6 地址是随机生成,首选用来对外通信的。因为 SLAAC 生成的 IPv6 地址会暴露网卡的 MAC 地址。
只要是后面有首选(preferrer),都可视为有效的 IPv6 地址。如果是受到抨击(deprecated,什么鬼才翻译)则不是。
更多可见: Windows上显示的“临时 ipv6地址“和“受到抨击”是什么意思? - 知乎
然后打开这个网站,检查一下整个网络能不能访问 IPv6。
如果分数是 10 分,并且显示的 IPv6 地址是上面查询得到的之一,那就表明你的电脑能通过公网访问。

如果:
- 网页打不开,或者分数不是 10 分:光猫、路由器和电脑的 IPv6 设置有问题,导致不能使用 IPv6 访问。
- 分数是 10 分,但是 IP 不是 CMD 查询中的任何一个:可能是光猫/路由器设置有问题,或者运营商很吝啬地只给你分配了 1 个公网 IP。
访问
如果上一步成功获取了电脑的公网 ipv6,可以用手机开流量打开网站:http://[<ipv6-ip>]:<端口号>
(手机移动网络基本都是 ipv6,不过也可以先用http://test-ipv6.com/测试一下),看看能不能 ipv6 直连。

查询网卡序号
打开 PowerShell,输入
Get-NetAdapter
获取实际联网的网卡的 Index,后面 DDNS 需要用。比如我获得的是 8。

Cloudflare 域名解析
首先 AAAA 解析个域名到服务器的 IP,不要开启小黄云。

然后做个 CNAME 解析个上一个域名。一定要打开小黄云代理,因为代理可以使只有 IPv4 网络的设备也能访问这个纯 v6 的电脑,达成双栈访问;而且开了小黄云可以隐藏 IP + 防 DDOS。

备注
为什么要先用一个的域名 home-nas
解析到 IP,再将实际要用到的 videov6
解析到 home-nas
,而不是 videov6
直接解析到 IP 呢?
因为宽带一般是动态公网 IP,假设除了 videov6
之外还有其他服务如 blog
、git
等自建服务的域名要解析到这台服务器,如果分别直接解析到 IP,DDNS 时 IP 一旦变动就要修改所有 AAAA 解析;而如果都 CNAME 解析到 home-nas
,那么 DDNS 只需要更新 home-nas
的 AAAA IP 记录,其他的 CNAME 保持不变。
安装IIS
IIS 是一个由微软开发和维护的一款用于在 Windows 操作系统上运行 Web 服务器的软件,作用类似于 Linux 上常用的 Nginx。虽然 Jellyfin 自己就能修改监听端口、添加 SSL 证书,但是用一个 IIS 可以做到:
- 80/443 端口同时运行多个网站(Jellyfin 自己监听就是独占了)
- 反向代理在另一台电脑上的站点
IIS 不是必须的。图方便可以直接 Jellyfin 独占一个端口号(使用高位端口,比如50000、60000之类的);或者如果你想且有能力,换成 Nginx 之类的也可以(其实 Nginx 更方便)。
安装
开始菜单中搜索“启用或关闭 Windows 功能”,添加 IIS 组件。点击“Web 管理工具”和“万维网服务”的复选框(自动不全选,也不需要全选),确定。

安装完组件后可能需要重启。
重启完电脑之后,先不要打开 IIS 管理器,安装下面两个组件,反代会用到。打开网页拉到下面,下载 x64 版本。
https://www.iis.net/downloads/microsoft/url-rewrite
https://iis-umbraco.azurewebsites.net/downloads/microsoft/application-request-routing
IIS 配置反向代理
添加 SSL 证书
参见:IIS 添加 SSL 证书 – Eterance的小窝
建立网站
建立一个网站

- 无
- 无
- 给网站随便起一个名字
- 随便选一个新建的目录,空的就行
- 选择 https
- 端口默认 443。如果你的 443 端口被运营商封禁,就需要选择更高的端口号(几万的那种)
- 填域名
- 选择之前创建的该域名的证书
- 立即启动
可能会提示缺失中间证书,不用管。

配置反代
首先参考IIS的反向代理 - 知乎,配置 ARR 参数。
然后,在网站主页上,双击打开 URL 重写


输入 Jellyfin 本地 IP 和端口(默认是 8096),保存。

修复打开 503 错误
现在可以打开网页。如果打开是 503 错误:

那就需要修改应用程序标识:

修改并启动之后,你应该就能看见网页了。
要是还是不行怎么办
- 检查步骤是否有问题
- 检查 Jellyfin 是否有问题
- 可能是运营商封禁 443 端口
动态域名解析 DDNS(可选)
参考:Use dynamic IP addresses · Cloudflare DNS docs
上一步之后,其实已经成功 90% 了。但是,如果公网 IP 是动态的(重启你的路由器/光猫看看 IP 有无变化就知道了),那就需要配置 DDNS ,在 IP 变动的时候修改 DNS 记录。(我相信绝大部分人都是动态 IP)
获取 Zoneid 和 API
点进在 cloudflare 解析的域名,滚动到下方,右边可复制区域 ID (也就是 Zone id,CF 把每个域名成为 Zone)。

然后获取 API Key:先点击上图的 2,然后如下图:



确定创建令牌,然后复制,后面会用到。

警告
API 令牌应该单次使用,不应该保存到某个文件中然后后续其他场景重复使用。API 令牌如果泄露可能会导致危险的后果。
建立 DDNS 脚本
复制Cloudflare DDNS Powershell Script的内容,本地新建一个 cf_ddns.ps1
文件(路径的文件夹不要有特殊字符),粘贴并保存。

配置计划任务
打开任务计划程序,新建任务:
- 名称:home-nas.eterance.com Cloudflare DDNS
- 描述:每隔一段时间检查IP有无变化,有则更新DNS解析记录
设置启动选项。

设置任务在每天的 0 点 0 分 30 秒启动(开始日期是今天就行),每隔一天启动一次任务,且每隔 1 分钟重复运行:(可选最低 5 分钟,选了再键盘修改数字;如果电脑性能很低,可以适当增加几分钟间隔)

警告
如果触发器设置为“登录后”或“启动后”,并且持续时间设置为无限期,不能正常每分钟触发一次脚本。
配置脚本的路径和参数。程序写 powershell
,参数写:
-NoProfile -ExecutionPolicy Bypass -File "C:\Programs\scripts\cf_ddns.ps1" -index 8 -zoneid abcdefg -key hijklmn -email yourcloudflare@email.com -domain "home-nas.eterance.com"
参数含义:
- ExecutionPolicy:执行策略。更多请见:关于执行策略 - PowerShell | Microsoft Learn
- File:脚本文件的完整路径
- index:之前查询到的网卡序号
- zoneid:区域 ID
- key:API token
- email:你的 Cloudflare 登录邮箱
- domain:要被 DDNS 的域名

最后是一些设置:

点击确定创建任务。
之后手动点击一次运行任务,等几秒然后右键刷新,如果出现“下次运行时间”就启动成功。
可能杀毒软件会拦截,放行(我都开源给你看了怎么可能有害)。

电脑重启会自动开始任务。
查看日志(可选)
日志文件保存在C:\用户\<用户名>\AppData\Local\cf_ddns\<域名>
文件夹下。默认保存 1500 条,也就是 1 天的日志。

网速
电信千兆下行百兆上行,三开网页(纯 IPv4 网络)同时播放可达到约 76 Mbps 上行,远超 Tunnel。而且这不是网速上限而是我的手速上限,因为四开来不及点完,第一个网页就已经加载完缓存了,做不到同时占用带宽。

Comments 6 条评论
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
好文,赞赞赞
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
实际尝试过了,只能说能用,页面加载很慢,上行带宽跑不满,下载最多400Kb的样子。比较慢,不如买个云服务器搞内网穿透的速度快。
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
@565638707 没办法,cf全是海外的服务器,而且出口线路也随地域不同而不同,运气不好拥堵就很慢了。国内服务器当然是最优解,但是带宽太贵了
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
@Eterance 时快时慢,有点奇怪。今天早上还是蛮快的,跑到了3MB多,跑满了公司办公网的下载限制。云服务器的话推荐天翼云,带宽比别家便宜很多。
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
有个问题麻烦问下,我NAS上有许多功能,用了很多不同端口,如果在CF上弄双栈如何填写对应端口呀,我现在用的heimdall作为主页,弄了两个页面,一个ipv6的一个ipv4的,并且在CF里面给每一个服务添加了DNS,这样感觉太麻烦了。。。
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
@TeslaThunder 应该是不行的,开了cf的小黄云代理之后cf给的证书只支持443端口,不开代理就没法双栈了