需求
tailscale
是好东西,在任何地方都可以和在局域网访问一样,但是也有着 IP
访问的不便,一方面 IP
是 tailscale
分配的(非子网路由模式),另一方面还要记住各种端口
tailscale
也考虑到了这些问题,所以推出了 MagicDNS
,允许你为 tailscale
网络中的节点配置 SSL
证书,让你可以通过域名来访问
但这种方式也不好用,因为:
- 这个域名中后面的
tailnet name
也是固定分配的,又长又难记; - 一个节点(也就是一台设备),只能有一个域名,这也就导致只能是类似
DDNS
的用法,每个服务都要加端口访问; - 最重要的是,老苏不会玩。在群晖上执行
tailscale cert ds3617xs.tailxxxxx.ts.net
获取证书时遇到了错误,一直也没找到解决的办法
500 Internal Server Error: acme.GetReg: Get "https://acme-v02.api.letsencrypt.org/directory": tls: failed to verify certificate: x509: certificate signed by unknown authority
老苏理想中的玩法应该是👇这样的:
- 不需要公网
IP
,因为vps
不便宜; - 能使用自定义域名,毕竟老苏在
freenom
申请了好几个好记的短域名; - 能够让
tailnet
中的节点能够支持泛域名,这样就不用记端口了; - 最好能使用默认的
80
和443
端口,这样就不用带尾巴了;
解决方案
老苏设想了下面的应用场景:
- 访问机器上安装
tailscale
客户端; - 群晖上也要安装
tailscale
套件,假设其tailscale IP
为100.x.y.z
; - 因为访问机器上已经安装了
tailscale
客户端,所以我们可以将100.x.y.z
视为是公网IP
,我们需要将域名解析到100.x.y.z
; - 但实际上
100.x.y.z
并不是公网IP
,所以SSL
证书无法通过HTTP
方式验证,而只能通过DNS
方式验证; - 要想使用默认的
80
和443
端口,需要更改群晖WebStation
的默认端口; - 使用
npm
作为反代服务器,并自动完成SSL
证书的申请和管理;
思路理顺了,接下里就是按部就班的实施、验证了
DNS 解析
老苏选择了 cloudflare
做 DNS
解析
浏览器中打开 https://dash.cloudflare.com/ ,先 添加站点
,然后添加 DNS
记录
- 只要添加两条
A
记录,一条名称是@
,一条名称是*
; - 关闭代理,仅使用
DNS
;
Cloudflare API 令牌
在此处创建 Cloudflare API
令牌:https://dash.cloudflare.com/profile/api-tokens
创建令牌
拉到最下面,创建自定义令牌
检查权限设置
- 区域:区域:读取
- 区域:DNS:编辑
如果你是英文界面,应该是这样
确认权限
创建令牌
【注意】:这个令牌只会显示一次,请务必保存好
修改 WebStation 端口
用 SSH
客户端登录到群晖,在命令行执行下面的命令
# 进入目录
cd /usr/syno/share/nginx
用内置的 vi
编辑器修改 server.mustache
、DSM.mustache
、WWWService.mustache
中的 80
和 443
端口改为15080
、15443
老苏只改了
IPv4
,没有改IPv6
,当然你要都改,也没问题;
重启 WebStation
,可以在套件中心中操作,也可以用命令行
# 重启 WebStation套件
synoservice --restart pkgctl-WebStation
再次查看端口,nginx
的 IPv4
已经变成了 15080
这样修改带来的后遗症就是,假如原本访问 phpMyAdmin
是 http://192.168.0.197/phpMyAdmin/
,现在要加上端口 15080
,变成 http://192.168.0.197:15080/phpMyAdmin/
,这个问题,后面用域名很容易解决
安装 npm
如果是新安装,将下面的内容保存为 docker-compose.yml
文件
本次安装使用了默认的
SQLite
作为数据库,如果要使用MySQL
,可以去看往期的文章
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
然后执行下面的命令
# 新建目录
mkdir -p /volume1/docker/npm/{data,letsencrypt}
# 进入目录
cd /volume1/docker/npm
# 将 docker-compose.yml 放入当前目录
# 一键启动
docker-compose up -d
如果已经安装过 npm
,只要修改端口就可以, npm
前置的 frp
或者 cloudflard
转发的端口也要同步修改,这样可以多个应用共用同一个 npm
证书设置
Add SSL Certification
--> Let's Encrypt
启用 Use a DNS Challenge
才是 DNS
验证
- ①
Domain Names
中填*.域名
,例如*.laosu.ml
; - ②
DNS Provider
中选择Cloudflare
; - ③
Credentials File Content
中,涂抹的地方,填入之前获取的Cloudflare API
令牌
更详细的说明可以去看『 nginx-proxy-manager在线申请证书』
稍等一会儿,就会看到证书,有效期是 3
个月,到期会自动续期
示例
将本机的 npm
管理界面反代处理
如果服务在其他主机上,
IP
可以填局域网IP
,也可以填Tailscale IP
证书选择前面申请的 Cloudflare
证书
现在在浏览器中直接打开 https://npm.laosu.ml
就会看到登录界面了
共享服务
到目前为止,只有你自己(Tailscale
管理员),有权访问这些服务。
当你希望将服务分享给别人时,可以在 https://login.tailscale.com/admin/machines 中,生成分享链接
在这里插入图片描述
虽然老苏没试过分享,但是从原理来说,肯定是没问题的
小结
这是目前老苏找到的最安全的一种随时随地访问群晖服务的方案
- 不需要买
vps
,更省钱; - 虽然使用域名,但没有公网
IP
,所以更安全; - 相比纯
Tailscale IP
,不用记IP
和端口,使用更简单; - 相比
cloudflare tunnel
,因为未使用Cloudflare
代理,所以带宽和流量都没有了限制,使用起来更放心;
如果大家还在找内网穿透方案,老苏强烈建议你试试这个,当然,如果你清楚了这里面的逻辑,Zerotier
等其他的 vpn
应该也是可以这么折腾的
参考文档
Failed to get cert on Synology · Issue #4060 · tailscale/tailscale
地址:https://github.com/tailscale/tailscale/issues/4060
Tailscale to the Rescue - Self-Hosted Services without Port-Forwarding + your Domain and SSL Certificates
地址:https://www.ajfriesen.com/tailscale-to-the-rescue/
Exploring the Tailscale-Traefik Integration | Traefik Labs
地址:https://traefik.io/blog/exploring-the-tailscale-traefik-proxy-integration/