基于Tailscale Funnel实现公网浏览器访问本地局域网文件或服务
电工86
编辑于 2024年01月02日 08:26
收录于文集
共6篇

Tailscale作为一款免费的基于WireGuard的虚拟组网工具,每个安装了Tailscale的设备可以异地组网,同时用户可以通过Exit Node和Subnet功能,将用户的流量转发到该节点,从而在外网访问本地局域网设备,缺点是如果想远程接入本地局域网的话,用户必须安装Tailscale客户端,且的所有的流量都会转发到用Exit Node,如果跨国的话延迟会比较高,类似一个没有白名单功能的普通VPN客户端。跨国连接时,Tailscale大部分时候都可以做到中国流量转发到欧洲有1-5Mbps的带宽,延迟约250ms,连接速度慢的话断开重连基本上都能获得不错的带宽,可以稳定看YT上1080p视频。有趣的是只有欧洲到中国的下行带宽不太稳定,中国到欧洲的上行带宽始终能比较高。

在国内windows通过Subnet功能ping欧洲局域网内的nas,延迟220ms左右,符合预期。

而通过Magic DNS和Tailscale Funnel可以让用户没有安装Tailscale客户端的情况下,在公网通过Tailscale分配的URL访问Tailscale节点上分享的文件或架设的服务,比如网站。


不进行额外设置时,Tailscale支持通过分配的私网IP互相访问,同时支持IPv4和IPv6。

在DNS选项中打开Magic DNS和HTTPS功能之后也会生成一个由设备名字和Tailscale分配的域名组成的URL,Tailnet中的用户通过URL可以直接在浏览器或SSH访问该设备,Magic DNS会自动将URL翻译为IP地址。

由Magic DNS分配的URL构成

通过URL访问Tailnet中的设备


Magic DNS给了用户直接用URL访问Tailnet中设备的能力,而Tailscale Funnel则将用户共享的文件或服务加密后通过Tailscale的中继服务器暴露到公网上。具体原理如下。

Funnel原理

具体操作流程如下。我这里使用的是一台运行CentOS 9的x86主机作为Tailscale节点,平时放在欧洲当Exit Node用,同时通过Subnet访问局域网中的NAS和其他设备。Tailscale在Linux中固定部署这里不赘述,详见官网安装教程https://tailscale.com/kb/installation

除了部署Tailscale外,还需要在CentOS中先通过SMB客户端将本地局域网中需要共享的文件挂载到CentOS中。首先命令行安装smb客户端。

代码块
JavaScript
自动换行
复制代码
yum install cifs-utils
复制成功

然后新建一个目录用来挂在需要共享的文件。我这里在/mnt目录下新建了一个nas目录。

代码块
JavaScript
自动换行
复制代码
mkdir /mnt/nas
复制成功

接下来用mount命令将局域网中的smb共享文件夹挂载到/mnt/nas目录。我这里还以挂在nas中的文件夹为例

代码块
JavaScript
自动换行
复制代码
sudo mount -t cifs //[NAS在局域网中的IP]/[文件夹名字] /mnt/nas -o username=[NAS用户名]
复制成功

之后系统会提示输入密码,输入密码后回车,此时用df -h命令即可看到smb共享文件夹已经被成功挂载到/mnt/nas。

这样的挂载应为一次性的,重启后需要重新挂载。如果需要每次开机都自动挂载指定文件夹,则需要修改fstab文件。我这里这台主机因为常年不关机,在此先不进行fstab修改。


挂载完成后,输入Funnel指令,开放3000端口。

代码块
JavaScript
自动换行
复制代码
tailscale funnel 3000
复制成功

此时会弹出一个链接,进入后选择开启Funnel。再次进入系统命令行,通过Funnel共享指定的文件,这里就是刚刚指定的/mnt/nas。

代码块
JavaScript
自动换行
复制代码
tailscale funnel --bg /mnt/nas
复制成功

此时可以看到,/mnt/nas中的文件已经可以在任意设备在公网通过一个https链接访问到,不再需要下载Tailscale客户端。注意这里必须要加上--bg命令,加上bg后funnel能够在后台运行,否则funnel在命令窗口退出后就会退出服务。通过funnel访问文件毫无压力,但可能由于我现在访问的是我在国外的Tailscale节点,高码率视频几乎打不开。注意由于共享文件夹的密码早在挂载阶段已经提供给系统,通过url访问共享文件时候完全不需要再输入密码,这意味着所有知道url的人都能访问到共享的文件。