前言

玩转云服务(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 后,关闭防火墙才能访问内部的设备。

请注意,这里的 WAN IPv6 地址的地址块后缀必须是 /64,这样才能进一步分配给内网里的机器,如果是 /128,说明运营商只分配了 1 个 ip 而不是一大坨 ip,这样只能做端口映射或者干脆打电话给运营商。这种极端情况不在本文讨论范围之内

检查 IPv6

检查

打开 CMD,输入命令

ipconfig -all

找到用来上网的网卡,一般可以发现有好几个 IPv6 地址。

  1. 短的 IPv6 地址是通过 DHCPv6 分配的。
  2. 长的 IPv6 地址是通过 SLAAC 获得的。
  3. 临时 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 直连。

手机流量直连成功。使用 Edge Inspect

查询网卡序号

打开 PowerShell,输入

Get-NetAdapter

获取实际联网的网卡的 Index,后面 DDNS 需要用。比如我获得的是 8。

Cloudflare 域名解析

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

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

备注

为什么要先用一个的域名 home-nas 解析到 IP,再将实际要用到的 videov6 解析到 home-nas,而不是 videov6 直接解析到 IP 呢?

因为宽带一般是动态公网 IP,假设除了 videov6 之外还有其他服务如 bloggit 等自建服务的域名要解析到这台服务器,如果分别直接解析到 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的小窝

建立网站

建立一个网站

  1. 给网站随便起一个名字
  2. 随便选一个新建的目录,空的就行
  3. 选择 https
  4. 端口默认 443。如果你的 443 端口被运营商封禁,就需要选择更高的端口号(几万的那种)
  5. 填域名
  6. 选择之前创建的该域名的证书
  7. 立即启动

可能会提示缺失中间证书,不用管。

配置反代

首先参考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。而且这不是网速上限而是我的手速上限,因为四开来不及点完,第一个网页就已经加载完缓存了,做不到同时占用带宽。