用自定义域名访问Tailscale节点

在这里插入图片描述

需求

tailscale 是好东西,在任何地方都可以和在局域网访问一样,但是也有着 IP 访问的不便,一方面 IPtailscale 分配的(非子网路由模式),另一方面还要记住各种端口

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 中的节点能够支持泛域名,这样就不用记端口了;
  • 最好能使用默认的 80443 端口,这样就不用带尾巴了;

解决方案

老苏设想了下面的应用场景:

在这里插入图片描述

  1. 访问机器上安装 tailscale 客户端;
  2. 群晖上也要安装 tailscale 套件,假设其 tailscale IP100.x.y.z
  3. 因为访问机器上已经安装了 tailscale 客户端,所以我们可以将 100.x.y.z 视为是公网 IP,我们需要将域名解析到 100.x.y.z
  4. 但实际上100.x.y.z 并不是公网 IP,所以 SSL 证书无法通过 HTTP 方式验证,而只能通过 DNS 方式验证;
  5. 要想使用默认的 80443 端口,需要更改群晖 WebStation 的默认端口;
  6. 使用 npm 作为反代服务器,并自动完成 SSL证书的申请和管理;

思路理顺了,接下里就是按部就班的实施、验证了

DNS 解析

老苏选择了 cloudflareDNS 解析

浏览器中打开 https://dash.cloudflare.com/ ,先 添加站点,然后添加 DNS 记录

在这里插入图片描述

  1. 只要添加两条 A 记录,一条名称是 @,一条名称是 *
  2. 关闭代理,仅使用 DNS

Cloudflare API 令牌

在此处创建 Cloudflare API 令牌:https://dash.cloudflare.com/profile/api-tokens

创建令牌

在这里插入图片描述

拉到最下面,创建自定义令牌

在这里插入图片描述

检查权限设置

  • 区域:区域:读取
  • 区域:DNS:编辑

在这里插入图片描述

如果你是英文界面,应该是这样

在这里插入图片描述

确认权限

在这里插入图片描述

创建令牌

【注意】:这个令牌只会显示一次,请务必保存好

在这里插入图片描述

修改 WebStation 端口

SSH 客户端登录到群晖,在命令行执行下面的命令

# 进入目录
cd /usr/syno/share/nginx

用内置的 vi编辑器修改 server.mustacheDSM.mustacheWWWService.mustache 中的 80443 端口改为1508015443

老苏只改了 IPv4,没有改 IPv6,当然你要都改,也没问题;

在这里插入图片描述

重启 WebStation,可以在套件中心中操作,也可以用命令行

# 重启 WebStation套件
synoservice --restart  pkgctl-WebStation

在这里插入图片描述

再次查看端口,nginxIPv4 已经变成了 15080

在这里插入图片描述

这样修改带来的后遗症就是,假如原本访问 phpMyAdminhttp://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/

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我会为你详细解读如何自定义 Node-RED 节点的示例。 首先,你需要准备一个 Node.js 环境和 Node-RED。然后,我们来看看如何创建一个简单的自定义节点。 1. 创建一个新的文件夹,命名为 "node-red-contrib-myfirstnode",并在其中创建一个名为 "myfirstnode.js" 的文件,这个文件将包含我们的自定义节点的代码。 2. 在 Node-RED 的安装目录下找到 "nodes" 文件夹,并将 "node-red-contrib-myfirstnode" 文件夹复制到该文件夹中。 3. 打开 "myfirstnode.js" 文件,开始编写自定义节点的代码。以下是一个简单的示例: ```javascript module.exports = function(RED) { function MyFirstNode(config) { RED.nodes.createNode(this,config); var node = this; node.on('input', function(msg) { //处理节点输入 node.send(msg); //将处理后的结果传递给下一个节点 }); } RED.nodes.registerType("myfirstnode",MyFirstNode); } ``` 4. 在代码中,我们使用 `module.exports` 导出我们的自定义节点函数。该函数接受一个参数 `RED`,它是一个全局变量,它允许我们访问 Node-RED 的 API。 5. 在函数中,我们定义了一个名为 `MyFirstNode` 的构造函数。这个构造函数接受一个参数 `config`,它是我们在 Node-RED 编辑器中配置节点时提供的配置数据。 6. 在构造函数中,我们使用 `RED.nodes.createNode` 方法来创建一个新的节点实例。我们还将 `this` 和 `config` 传递给此方法,这将设置节点的 `id` 和 `name` 属性,并将配置数据存储在 `config` 属性中。 7. 接下来,我们定义了一个名为 `node` 的变量,并在 `this` 上调用 `on` 方法来监听输入事件。当节点接收到输入消息时,我们可以在回调函数中处理它,并使用 `node.send` 方法将处理后的消息传递给下一个节点。 8. 最后,我们使用 `RED.nodes.registerType` 方法来注册我们的自定义节点类型。这个方法需要两个参数:节点类型的名称和我们定义的构造函数。在这个例子中,我们将节点类型命名为 "myfirstnode",并将构造函数传递给 `registerType` 方法。 9. 现在,我们可以启动 Node-RED 并在编辑器中找到我们的自定义节点。我们可以将它拖放到流程中,并配置它的参数,然后测试它是否按预期工作。 希望这个解读能够帮助你理解如何自定义 Node-RED 节点,并让你开始构建自己的节点。如果你有任何疑问,请随时问我。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨浦老苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值