Linux / Nas · 2023年5月29日 0

Tailscale高级功能篇(tailscale Funnel)——实现不需要独立ip的公网访问

多朋友没有独立ip,但是又想把nas上的服务映射到公网上使用。

比较简单的方案是通过zerotier,tailscale,wireguard等虚拟内网工具,把需要访问的设备都加到虚拟内网中,通过穿透实现异地访问服务。

其实tailscale本身可以提供类似于群晖的公网访问。

这个工具叫Tailscale Funnel 

基本原理是在tailscale会给你的设备分配一个二级域名,你通过二级域名的访问会被转发到指定的内网服务上,来实现。

这个服务是免费的

下面开始配置

首先要去tailscale管理页面开启它,先登录你的tailscale

https://login.tailscale.com/admin/dns

系统会分配一个默认的二级域名

然后激活magicDNS

然后激活https

打开access controls页面,激活funnel

建议使用完整功能的linux系统操作,方便把局域网中其他设备的服务映射出去,我这里以ubuntu20为例。

首先安装tailscale,打开
https://pkgs.tailscale.com/stable/

找到对应的平台安装tailscale

申请证书

tailscale cert 
#会提示需要输入三级域名,格式是   node_name.tailxxx.ts.net
# 输入正确的节点域名,重新执行
tailscale cert g4560.tail471ed.ts.net

首先确保这台机器上的服务正常启动了,注意一定要localhost也就是127.0.0.1的本机服务,这是funnel的限制,不要问我为什么不能直接把127.0.0.1写成局域网的其他设备ip,tailscale不让!!!那如果想映射局域网的其他设备怎么办,后面讲。

tailscale serve https / http://127.0.0.1:9091
tailscale funnel 443 on
tailscale funnel status
#https://example.pango-lin.ts.net (Funnel on)

可以看到已经激活了

但是如果你现在访问它是访问不了的,因为域名生效是需要时间的,稍等片刻一般来说就能更新出来

不用等很久就可以访问了

如果我们想把局域网中其他的服务访问出去怎么办

要么你在有服务的节点上安装tailscale启用funnel

如果那台机器不方便使用funnel怎么办,比如它是一台群晖

办法总是有的,我们在一台可以安装tailscale的节点上,这台机器可以是虚拟机

通过nginx先把服务给代理一下,本机上就可以通过localhost访问到了

比如,我现在要把我的jellyfin服务映射出去。

http://192.168.188.167:8096

就需要nginx之类的反代工具了,其他的类似的caddy也是可以的,不过我个人是喜欢用nginx的。

首先安装nginx

sudo apt install nginx -y

创建并配置/etc/nginx/conf.d/jellyfin.conf


server {
    listen 8801;
    
    server_name _;
    charset utf-8;


    keepalive_timeout 70;

    location / {
        # proxy_redirect off;
        proxy_pass http://192.168.188.167:8096; # port
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }


}

重启nginx使配置生效

systemctl restart nginx

查看服务是否已经启动

netstat -nltp
# 看到8801已经启动了

重新配置funnel 443指向8096

tailscale serve https / http://127.0.0.1:8096
tailscale funnel 443 on
tailscale funnel status
#https://example.pango-lin.ts.net (Funnel on)

刷新你的页面,可以看到页面已经变成了jellyfin,至此就完成了内网服务到公网的映射。

速度取决于你的搭建tailscale的节点到tailscale的服务器的速度,并不快,但是免费的服务

这个funnel功能适合实在没有办法的朋友,可以用于一些文字类的内网服务或者用于临时的内网服务管理。

你可能要问能不能搭建一个中间服务器提速啊

你是不是傻,如果你能自己搭建中间服务器,你有一台独立ip的vps,你还需要这个东西做什么呢,直接搭建ngrok、frp等等,他不香么