☰
自托管AI远程访问最短路径:dsh-pocket局域网与公网隧道配置
2026/10/27 22:50:42 网站建设 项目流程

开头先交代一下这玩意儿是干嘛的。

dsh-pocket 本质上是把自托管 AI 服务装进口袋的一个移动端控制台,核心使用场景就两个:第一,你在局域网里随手扫码就能连上自己机器上的模型服务;第二,人不在家的时候,通过一条公网隧道照样可以远程调。名字里的 “pocket” 指的就是手机端那个壳,真正干活的是背后跑在你电脑或小服务器上的 dsh 引擎。整条链路里最容易被卡住的地方,恰恰不是模型本身,而是从“局域网发现”到“公网访问”这一段网络路径怎么规划。这篇文章就是把我自己从零配置到内外网都能用的完整最短路径记录下来,适合家有 NAS、手上有台闲置电脑、或者单纯想把自己的模型服务带出门的开发者直接照着抄。

1. 先搞清楚 dsh-pocket 的定位,再决定要不要打通公网

1.1 它和云端服务最大的区别是所有权

你在公网上用各种 AI 应用时,数据链路是“你 → 服务商 → 模型”,模型和服务都捏在别人手里。dsh-pocket 这套方案正好反过来:模型权重在本地、推理服务在本地、控制界面在本地,手机端只是一个远程遥控器。数据不出自己局域网的情况下,你可以放心拿它跑一些不太方便传给第三方的私有材料,离线局域网也完全能跑,这也是 DeepSeek Harness 这类自托管工具链在本地环境里受欢迎的直接原因。

局域网优先还有个现实好处:延迟低。本地网口随便都是千兆,模型推理再慢也是受限于显卡和内存,而不是受限于上行带宽。手机通过 Wi-Fi 访问时,整个请求都不出路由器,体验上跟本地桌面端几乎无差别。这也是我建议所有新手第一步只做局域网接入的原因——别一上来就想着公网隧道,先把最小闭环跑通,后面所有故障排查才有参照系。

1.2 “最短路径”到底指什么

标题里的“最短路径”不是网络工程里的 Dijkstra,而是我实际折腾下来总结的一条“最少步骤链路”:

本地启动服务 → 固定局域网 IP → 生成二维码 → 手机扫码访问 → 按需加装公网隧道

每一步之间没有多余环节。你看现在网上很多教程一上来就让配 frp、配域名、配 HTTPS,实际上对 80% 的人来说根本用不上。你人在家里,手机和电脑连的是同一个路由器,那最直接的路就是局域网扫码,干吗非要绕到公网再绕回来?只有当你确实需要“出门在外也能访问家里服务”时,才值得引入隧道层。所以我会把这篇文章分成两段:先讲局域网内怎么把 dsh-pocket 用起来,再讲公网隧道怎么接上去,中间每一步都给你可直接复制执行的命令。

2. 局域网扫码接入:手机变成随身控制台

2.1 先把服务绑到 0.0.0.0,而不是默认回环地址

dsh-pocket 的服务端启动时默认监听 127.0.0.1,也就是只有本机能访问,手机根本连不上。很多新手在这一步就被劝退了,看着浏览器里好好的,手机一扫码就是“连接拒绝”。改法很简单,启动时显式绑定所有网卡:

dsh-pocket --host 0.0.0.0 --port 8080 --model deepseek-r1:7b

这里的--host 0.0.0.0意思是监听本机所有网络接口,包括有线网卡、无线网卡和虚拟网卡。--port 8080是给管理界面用的端口,可以按自己习惯改,只要不和别的服务冲突就行。绑定完以后,你在本机用http://127.0.0.1:8080能开,在局域网内用http://192.168.x.x:8080也必须要能开,这个区别就是成败分水岭。

注意:绑定 0.0.0.0 以后,局域网内任何一台设备都能访问你的服务端口。如果只是在家用,问题不大;如果是在公司或者共享 Wi-Fi 环境,建议先看第四节的访问控制,别裸奔。

2.2 固定局域网 IP,不然二维码说废就废

手机扫码本质是访问一个 URL,URL 里边写的是 IP 和端口。但路由器给设备分配的 IP 默认是 DHCP 动态的,可能今天你家电脑是192.168.1.100,明天重启路由器就变成192.168.1.105了。IP 一变,二维码里写死的地址就失效,你还得重新生成一次。

所以要做两件事。第一,查当前 IP:

# Linux ip addr | grep inet # macOS ifconfig en0 | grep inet # Windows ipconfig | findstr IPv4

记下类似192.168.1.100的地址。第二,登录路由器后台,在 DHCP 设置里给这台机器的 MAC 地址绑定一个固定 IP。不同路由器界面文案不一样,但功能都是“DHCP 静态绑定”或“IP/MAC 绑定”。填进去以后,这台设备每次拿到都是同一个 IP。

固定 IP 这件事属于典型的“两分钟搞定,省掉后面两小时排查”的操作。我见过太多人二维码天天失效,最后发现是 DHCP 租约到期换地址,绑定完以后世界清净。

2.3 二维码生成与手机连接:四行命令的事

服务跑起来了,IP 也固定了,接下来就是二维码。Linux 上直接用qrencode生成,别去在线网站生成,自己机器上的工具最稳,也不会有隐私问题:

# 安装 qrencode sudo apt install qrencode -y # 生成二维码,内容就是手机要访问的地址 qrencode -o ~/pocket.png "http://192.168.1.100:8080" # 在终端里直接显示成 ASCII 码 qrencode -t ANSIUTF8 "http://192.168.1.100:8080"

macOS 用户可以用brew install qrencode,Windows 用户不太方便,可以直接在浏览器生成的在线二维码里填同样的地址。二维码内容就是一个 URL,本质上没有任何黑魔法。

手机连上同一个 Wi-Fi 后,用相机扫这个码,就会自动跳转浏览器打开 dsh-pocket 的界面。第一次打开通常会要求你输入服务端设置的访问令牌,这个令牌在你首次启动服务时会在终端里打印出来,类似这样:

Access token: dsh_pocket_xxxxxxxxxxxx

记住这个 token 比记住二维码还重要,后面公网隧道接入时它就是你最后一道护栏。

实操心得:二维码别只生成一张。我在手机相册里存一份,家里打印机打一份贴主机上。因为手机扫码这东西,一旦换手机或者删了图片,你就要重新回电脑前敲命令,很不值。多存两份不花钱。

3. 公网隧道:出门在外也能连回家的最短路径

3.1 为什么直接暴露端口是最差方案

如果你问“能不能把 8080 端口映射到公网,然后我直接用手机流量访问”,答案是能,但不建议。原因有三个。第一,运营商给家庭宽带分配的 IP 基本是动态的,今天和明天可能不一样,你没法用一个稳定的地址访问;第二,家庭宽带运营商对入站连接普遍做了限制,很多地区的 80/443 端口根本不可用;第三,也是最致命的,直接爆露意味着你的服务完全裸奔,任何扫描公网的人都能探测到你的端口,然后尝试爆破你的 token,安全风险成倍上升。

隧道方案的本质,是让你内网的一台机器主动“拨号”连出去,到一台有公网 IP 的中继服务器上注册一条通道。外部用户访问中继服务器的某个端口/域名时,数据会自动沿着这条隧道送回你的内网机器。这么一来,你不需要公网 IP,不需要路由器端口映射,更不需要去运营商申请什么,隧道一开,最短路径就打通了。

3.2 三种主流隧道方案横向对比

市面上叫得上名字的隧道工具不少,我把最常用的三套放在一起对比,突出各自适合的场景:

方案原理类型是否需要公网服务器访问方式适合场景上手难度
frp内网穿透需要一台有公网 IP 的云服务器域名/IP 加端口有服务器、想完全自控中
Cloudflare Tunnel内网穿透不需要,Cloudflare 做入口自有域名走 HTTPS有域名、不想维护服务器低
Tailscale Funnel组网+穿透不需要,官方协调服务分配的公网域名一个人或小团队,设备少极低

我自己的推荐逻辑是这样:如果你手上已经有云服务器,那 frp 是最可控的方案,一切配置都在自己手里,不依赖第三方;如果你只想要最短路径、最省事,Cloudflare Tunnel 免费额度对个人自托管服务完全够用;如果你纯粹是自己一个人用,设备也就手机和电脑两台,那 Tailscale Funnel 只要一行命令。下面我把三条路都写清楚,你按自己实际情况挑一条就行。

3.3 最短路径推荐:Cloudflare Tunnel 两分钟上线

我自己现在用的就是 Cloudflare Tunnel,原因是家里这台跑 dsh-pocket 的机器不关机,一个守护进程就能把隧道管好,崩溃了自动重连,几乎不需要运维。操作分三步。

第一步,安装cloudflared客户端:

# Linux x86_64 wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod +x cloudflared-linux-amd64 sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared cloudflared tunnel login

登录后它会在浏览器里打开一次授权,选择你自己的域名站点即可。第二步,创建隧道并绑定域名:

cloudflared tunnel create dshpocket cloudflared tunnel route dns dshpocket pocket.example.com

第三步,建配置文件~/.cloudflared/config.yml:

tunnel: dshpocket credentials-file: /root/.cloudflared/dshpocket.json ingress: - hostname: pocket.example.com service: http://localhost:8080 - service: http_status:404

然后启动:

cloudflared tunnel run dshpocket

这一步做完,你在任何地方用浏览器打开https://pocket.example.com,流量都会通过 Cloudflare 的边缘节点转回家里这台机器的 8080 端口,dsh-pocket 界面就在眼前。手机流量、公司网络、酒店 Wi-Fi,统统能访问,因为你访问的是一个标准 HTTPS 域名,不需要客户端,也不需要装 App。

注意:Cloudflare Tunnel 免费版有一个小限制:单条隧道流量上有 Fair Use 限制,个人用完全不存在这个问题,但如果你的模型服务被公开到论坛上让大家白嫖,等着被限速吧。

3.4 自控型玩家选 frp,一行配置连回家

要是你不想把流量入口放在 Cloudflare 上,坚持要服务器和数据链路都自己掌控,frp 是更合胃口的答案。你需要一台云服务器,公网 IP 和一根域名随便什么都行。

服务端frps.toml:

bindPort = 7000 token = "自己设置一串随机字符串"

启动服务端:

./frps -c frps.toml

客户端frpc.toml,也就是家里这台跑 dsh-pocket 的机器上:

serverAddr = "你的云服务器公网IP" serverPort = 7000 auth.token = "上面那串随机字符串" [[proxies]] name = "dsh-pocket" type = "tcp" localIP = "127.0.0.1" localPort = 8080 remotePort = 18080

启动客户端:

./frpc -c frpc.toml

然后在外网直接用http://你的服务器IP:18080访问就行。如果给域名解析到服务器 IP,再在服务器上挂个 Nginx 反代加上 HTTPS,体验就跟 Cloudflare 方案一致。frp 的优势是传输全程你自己可控,不过代价是云服务器流量费要自己掏,高峰期查看日志、模型加载时带宽占用大,月底账单比 Cloudflare 免费方案高不少。

3.5 单用户极简方案:Tailscale Funnel 一行搞定

如果你解决这条隧道问题只是为了“自己出门能连回家”,那 Tailscale 这套组网工具里的 Funnel 功能甚至更夸张。所有节点装好 Tailscale 之后,执行一条命令就能开公网入口:

tailscale funnel 8080 up

命令执行完,Tailscale 会给你分配一个https://xxx.tailXXXX.ts.net域名,直接访问就是家里设备 8080 端口。整个过程没有云服务器、没有域名配置、没有配置文件,纯粹一行命令一条隧道。缺点是域名不是自己的,看着不够正式,但对临时用、个人用完全够了。

实操心得:不要同时开 Cloudflare Tunnel 和 Tailscale Funnel 两条隧道。我试过,会导致外面访问进来时请求不稳定,还会在地排查问题时以为是 dsh 服务的问题,查了半天最后发现是双隧道互相抢来源。最短路径的意思是只留一条链路。

4. 安全基线与高频问题排查实录

4.1 暴露公网前必须做的一件小事:加访问控制

隧道一旦通了,你的服务就从“局域网私有”变成了“公网可达”。如果没有任何访问控制,任何拿到地址的人都能打开你的 dsh-pocket 界面。尤其是 Cloudflare Tunnel 方案,域名一旦泄露,谁都能来。

最短路径上最有效的两道阀门,一个是 dsh-pocket 自带的访问令牌,另一个是加一层基础认证。配置文件里加反向代理认证最直接(以 Caddy/Nginx 为例):

location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; }

.htpasswd文件一行命令生成:

htpasswd -c /etc/nginx/.htpasswd dsh_user

这样外部访问会先看到一个用户名密码框,输入正确后才到 dsh-pocket 的 token 验证,等于上了两道锁。有人说“那我只靠 token 不行吗”,理论上行,但 token 是放在 URL 参数或者请求头里的,一旦通过明文 HTTP 传输,局域网内其他设备抓包就能看到,所以至少外网访问一定要 HTTPS,HTTPS 要么由 Cloudflare 帮你终结,要么由 Nginx/Caddy 自己加证书。

4.2 高频问题排查速查表

这几类问题几乎每个接隧道的人都会撞上,我把排查顺序按命中率从高到低排了一下:

现象大概率原因排查动作
局域网扫码打不开服务没绑 0.0.0.0看启动命令有没有--host 0.0.0.0
局域网能开,外网隧道打不开隧道连的是不是 8080在本地 curl 一下 8080 确认服务活着
隧道域名打开 502/521Cloudflare 连不上源站确认 cloudflared 进程还活着,看有没有断线重连
手机流量能开,Wi-Fi 打不开路由器开了 AP 隔离路由器无线设置里关掉 AP/客户端隔离选项
外网卡到怀疑人生家宽上行带宽太低测一下上行,隧道传输受限于家里的上行速度
过一会隧道就断token 失效或进程被杀用 systemd 守护 cloudflared/frpc 进程

其中 AP 隔离这个问题最阴间,症状是“手机连 Wi-Fi 就是访问不了电脑,换流量就行”,新手容易在防火墙、端口半天,结果路由器一个设置的事。

4.3 我踩过的几个坑,提前给你标记出来

第一,端口别用 8080 就想当然,我有一台机器上 8080 被一个调试进程提前占用了,dsh-pocket 启动报错又没细看,结果局域网扫码一直失败,最后ss -lntp一看才真相大白。建议启动前先用lsof -i :8080查一下端口占用。

第二,二维码生成的地址要区分 HTTP 和 HTTPS。局域网内访问一般就是http://IP:端口,但如果你把服务端配置了 HTTPS 证书,二维码就得填https://IP:端口,否则手机扫出来会报证书错误。公网隧道那边同理,Cloudflare 给你的是 HTTPS,你就别拿http://去扫码,格式不一致,连接不起来都是自找的。

第三,启动 dsh-pocket 的终端窗口一旦关掉,服务跟着就没了。最稳的做法是用 systemd 把它注册成系统服务:

[Unit] Description=dsh-pocket service After=network.target [Service] ExecStart=/usr/local/bin/dsh-pocket --host 0.0.0.0 --port 8080 Restart=always RestartSec=5 User=your_username [Install] WantedBy=multi-user.target

然后:

sudo systemctl daemon-reload sudo systemctl enable --now dsh-pocket

这样开机自启、崩溃重启全解决,隧道那边同样可以用 systemd 托管。我一开始图省事直接nohup跑,后来机器重启一次,全家断连,才逼着自己把服务全部 systemd 化。

5. 这条链路后续还能怎么扩展

隧道通了以后,你其实已经拥有一个“随时随地可访问的自托管 AI 入口”。基于这个基座,可以继续做三件很实用的事情。一是把模型服务换成多模型网关,统一暴露一个兼容接口,手机端 dsh-pocket 切换模型不用改配置。二是在隧道入口前加个带统计的 Nginx,记录每天的请求量、来源 IP、平均响应时长,方便你了解到底什么人在用什么。三是把二维码生成接进 dsh-pocket 的启动脚本,服务每次起来自动更新一次二维码内容,把固定 IP 的变更风险彻底消灭。

我个人实际用了一段时间的最大体会是,这套东西最核心的价值不在于“能连上”,而在于“连接路径足够短、足够可控”。局域网扫码解决的是随手可用的问题,公网隧道解决的是远程可用的兜底问题,两者合起来才是一个完整的最小闭环。你不需要在前期就追求高大上的全套网络基建,先把家里的 Wi-Fi 内用顺手,再按需加一条隧道,这条路对所有自托管新手来说都是最平滑的。最后再啰嗦一句:任何一次改动,都记得先看进程日志,不管是 dsh-pocket 的还是隧道的,日志会告诉你 90% 的真相。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询