ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 用 avahi/mDNS 固定连接:VSCode Remote SSH + NoMachine 配置大纲

Ubuntu 用 avahi/mDNS 固定连接:VSCode Remote SSH + NoMachine 配置大纲 1. Ubuntu 局域网远程开发为什么总在换 IP 上翻车如果你用 Ubuntu 做机器人、视觉或者嵌入式开发大概率经历过这个场景早上到工位VSCode Remote SSH 连不上翻出终端ip addr一看昨天还是192.168.1.108今天变成了192.168.1.121。改完 SSH config下午换了个 WiFi又变了。手机热点更离谱每次重连分配一个全新网段。这个问题的本质是 DHCP 租约不固定。路由器或者手机热点按自己的心情分配地址你的开发机没有任何话语权。传统解法有三种一是进路由器后台绑定 MAC-IP但手机热点根本没有这个入口二是装 Tailscale 之类的组网工具能解决但引入额外依赖某些公司网络还会拦截三是每次手动查 IP纯体力活。avahi mDNS 提供的是第四条路给 Ubuntu 主机一个稳定的.local名字比如eaibot.local。这个名字由主机自己广播局域网内任何支持 mDNS 的设备都能解析到当前 IP。IP 变了没关系名字不变VSCode Remote SSH 和 NoMachine 都填这个名字就行。mDNS 的全称是 Multicast DNS工作方式可以类比成局域网内的广播喊话Ubuntu 主机持续在 5353 端口广播我叫 eaibot我的地址是 xxxWindows 10 之后的系统原生支持 mDNS 解析macOS 和 Linux 更不用说。所以 Windows 端不需要装任何东西ping eaibot.local就能通。这套方案适合谁局域网内做 ROS/Gazebo/RViz 开发的人、用 NoMachine 跑 Linux GUI 的人、经常切换网络环境工位 WiFi、手机热点、实验室网络的人。不适合跨公网访问那是另一个话题。下面从安装 avahi 开始一步步把eaibot.local跑通然后接到 VSCode Remote SSH 和 NoMachine 上。中间会给出可复制的配置片段、验证命令以及我实际踩过的几个坑。2. TaoToken 前置给远程开发配一个稳定的模型入口远程开发环境搭好之后下一步通常是接 AI 辅助。VSCode 里的 Copilot、Cline、Continue 这些插件或者 Claude Code 这类命令行工具都需要一个模型 API 入口。如果你在 Ubuntu 端跑 Claude Code或者在 Windows 端用 Cline 连远程模型入口的稳定性直接影响开发体验。TaoToken 在这里的角色是统一的 API 网关。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。它的价值在于一个 Key 可以调多个模型Base URL 统一不用在多个平台之间切换配置。具体到本文场景有两种接法。第一种是在 Ubuntu 端跑 Claude Code通过环境变量指向 TaoToken 的 API 端点第二种是在 Windows 端的 VSCode 里用 Cline 或 Continue配置里填 TaoToken 的 Base URL 和 Key。两种接法都需要三件套Base URL、API Key、Model ID。先拿 Key。打开 https://taotoken.net/api-keys 登录后创建一个新的 API Key复制保存。这个 Key 只在创建时显示一次丢了就得重建。然后确认你要用的 Model ID。TaoToken 的模型列表在文档里有常见的比如claude-sonnet-4-20250514、gpt-4o这类。Model ID 必须和文档里写的完全一致大小写、连字符都不能错这是后面 401 和 model not found 报错的主要来源。如果你打算长期在远程环境里做 Agent 开发比如让 Claude Code 在 Ubuntu 端自动改代码、跑测试可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它的计费方式更适合高频调用场景。需要说明的是TaoToken 只是模型 API 入口不替代 VSCode、不替代 SSH、不替代 NoMachine。它解决的是模型调用走哪个端点的问题和本文的 mDNS 连接方案是正交的两件事。你可以先不管 TaoToken把eaibot.local跑通再回来配模型入口。配置的时候有个原则Base URL 填https://taotoken.net/api不要加多余的路径后缀。有些工具的配置项叫baseURL有些叫apiBase有些叫endpoint填的都是同一个值。Key 填sk-开头的那串。Model ID 按文档填。3. 可复制配置avahi、SSH config 与 NoMachine 地址填写这一节给出完整的可复制片段。按顺序操作每一步都有对应的验证命令。3.1 安装 avahi 并设置主机名Ubuntu 端执行sudo apt update sudo apt install avahi-daemon avahi-utils -yavahi-utils提供avahi-resolve和avahi-browse命令后面验证要用。装完之后设置主机名这里用eaibot作为示例sudo hostnamectl set-hostname eaibot hostnamehostname输出eaibot即可。注意主机名不要带下划线mDNS 对特殊字符的处理不一致用纯字母数字和连字符最稳。3.2 avahi-daemon 配置片段默认配置通常够用但有两个地方建议确认。编辑/etc/avahi/avahi-daemon.conf[server] host-nameeaibot domain-namelocal use-ipv4yes use-ipv6no allow-interfaceswlan0,eth0 [publish] publish-addressesyes publish-hinfoyes publish-workstationyesallow-interfaces按你的实际网卡名填用ip link查看。如果同时用 WiFi 和有线两个都写上。use-ipv6no是为了避免某些网络环境下 IPv6 解析优先导致连接超时局域网内 IPv4 足够。改完重启服务sudo systemctl enable avahi-daemon sudo systemctl restart avahi-daemon systemctl status avahi-daemon看到active (running)即可。如果状态是failed用journalctl -u avahi-daemon -n 50看日志常见原因是主机名冲突或者 5353 端口被占用。3.3 SSH config 片段Windows 端编辑C:\Users\你的用户名\.ssh\config没有就新建Host eaibot HostName eaibot.local User your_username Port 22 ServerAliveInterval 30 ServerAliveCountMax 3 TCPKeepAlive yesServerAliveInterval 30是防止连接空闲被断手机热点环境下特别有用。your_username换成 Ubuntu 上的实际用户名。Ubuntu 端确认 SSH 服务在跑sudo apt install openssh-server -y sudo systemctl enable ssh sudo systemctl start ssh systemctl status ssh3.4 NoMachine 地址填写NoMachine 的 Host 栏直接填eaibot.localPort 默认 4000。如果之前用 IP 连过在 NoMachine 客户端里新建一个连接Host 填eaibot.local协议选 NX然后保存。NoMachine 服务端在 Ubuntu 上确认运行sudo systemctl status nxserver如果没有装 NoMachine去官网下载 deb 包安装这里不展开。3.5 模型入口配置片段可选如果你在 Ubuntu 端用 Claude Code环境变量这样配export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key export ANTHROPIC_MODELclaude-sonnet-4-20250514写到~/.bashrc里持久化。如果在 Windows 端用 Cline在 VSCode 设置里找 Cline 的 API 配置Base URL 填https://taotoken.net/apiKey 填sk-开头那串Model ID 按文档填。三件套对照表配置项值说明Base URLhttps://taotoken.net/api不加路径后缀API Keysk-...从 API Keys 页面获取Model ID按文档大小写敏感4. 验证请求ping、avahi-resolve 与 SSH 实测配置写完不算完得验证。这一节给出从底层到上层的验证顺序哪一步断了就停在哪一步排查。4.1 Ubuntu 端自检先在 Ubuntu 本机确认 avahi 在广播avahi-resolve -n eaibot.local正常输出类似eaibot.local 192.168.1.108如果报Failed to resolve host name eaibot.local说明 avahi 没正常广播。检查systemctl status avahi-daemon以及主机名是否和配置一致。再看服务发现avahi-browse -a -t会列出局域网内所有 mDNS 服务。能看到eaibot相关的记录就说明广播正常。4.2 Windows 端解析验证Windows CMD 或 PowerShellping eaibot.local正常输出正在 Ping eaibot.local [192.168.1.108] 具有 32 字节的数据: 来自 192.168.1.108 的回复: 字节32 时间2ms TTL64如果提示找不到主机按顺序排查Windows 是否和 Ubuntu 在同一网段ipconfig对比、Windows 的 Bonjour 服务是否被禁用Windows 10 之后原生支持一般不用管、防火墙是否拦了 5353 端口。4.3 SSH 连接验证Windows 端ssh your_usernameeaibot.local第一次连接会提示确认指纹输入yes然后输密码。能进到 Ubuntu 的 shell 就说明 SSH 通了。如果卡在Connecting to eaibot.local很久然后超时大概率是 mDNS 解析到了但 SSH 端口不通。在 Ubuntu 端sudo ufw status看防火墙需要放行 22 端口sudo ufw allow 22/tcp4.4 VSCode Remote SSH 验证打开 VSCodeCtrlShiftP调出命令面板输入Remote-SSH: Connect to Host选择eaibot。VSCode 会读~/.ssh/config里的配置连上之后左下角显示SSH: eaibot。连上之后打开一个终端跑hostname确认是eaibot。然后可以测试模型入口如果配了 Claude Code跑claude --version看是否正常。4.5 NoMachine 验证打开 NoMachine 客户端双击之前建的eaibot.local连接输入 Ubuntu 的用户名密码能看到 Linux 桌面就成功了。ROS 的 Gazebo、RViz 这些 GUI 程序可以直接在 NoMachine 里跑。实测下来手机热点环境下 mDNS 解析偶尔会有 1-2 秒延迟但连接建立后就稳定了。如果对延迟敏感可以在 SSH config 里加ConnectTimeout 10。5. 本篇常见错排查401、local proxy failed 与解析失败这一节列出实际会遇到的报错和对应解法。每个报错都给出触发场景和排查路径。5.1 401 Unauthorized这个报错出现在模型 API 调用时不是 mDNS 的问题。触发场景Key 填错、Key 过期、Base URL 写错。排查顺序先确认 Base URL 是https://taotoken.net/api不要写成https://taotoken.net/api/v1或者带其他后缀。然后确认 Key 是sk-开头没有多余空格。最后确认 Model ID 和文档一致。如果用的是 Claude Code检查环境变量echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_API_KEY输出不对就重新 export。注意ANTHROPIC_API_KEY的值不要加引号以外的字符。5.2 local proxy failed这个报错通常出现在 Cline 或 Continue 这类 VSCode 插件里提示本地代理失败。触发场景插件配置了代理但代理没跑或者 Base URL 填了localhost但本地没有服务。排查检查插件设置里的 Base URL确保是https://taotoken.net/api而不是http://localhost:xxxx。如果之前配过本地代理清掉。VSCode 的http.proxy设置也检查一下如果公司网络要求代理按 IT 给的填否则留空。5.3 reading choices 报错这个报错出现在模型返回格式解析失败时。触发场景Model ID 填了一个不存在的模型或者 API 返回了错误格式。排查先用curl直接测 APIcurl -X POST https://taotoken.net/api/v1/messages \ -H Content-Type: application/json \ -H x-api-key: sk-你的Key \ -H anthropic-version: 2023-06-01 \ -d {model:claude-sonnet-4-20250514,max_tokens:100,messages:[{role:user,content:hi}]}如果返回正常 JSON说明 API 通了问题在插件配置。如果返回错误看错误信息里的error.typeinvalid_request_error通常是 Model ID 或参数问题。5.4 OAuth 相关报错Claude Code 首次运行会走 OAuth 流程如果环境变量配了ANTHROPIC_API_KEY它会跳过 OAuth 直接用 Key。如果同时配了 OAuth token 和 API Key可能冲突。排查清掉~/.claude/下的 OAuth 缓存只保留环境变量方式。或者反过来只用 OAuth 不配 Key。两种方式选一种不要混用。5.5 eaibot.local 解析失败回到 mDNS 本身。如果ping eaibot.local不通按这个顺序查Ubuntu 端systemctl status avahi-daemon是否 runninghostname是否等于配置里的主机名avahi-resolve -n eaibot.local本机能否解析Windows 和 Ubuntu 是否同网段Windows 防火墙是否拦了 5353 UDP。手机热点有个特殊情况部分手机热点开启了 AP 隔离设备之间不能互相通信。这种情况下 mDNS 广播收不到只能换网络或者用 USB 网络共享。5.6 SSH 连上但 VSCode 卡在 InstallingVSCode Remote SSH 首次连接会在远程端下载 vscode-server如果 Ubuntu 端网络受限会卡住。排查在 Ubuntu 端ls ~/.vscode-server看是否有下载记录手动下载对应的 commit 版本放到对应目录。或者换用 VSCode 的remote.SSH.localServerDownload设置让本地下载再传过去。6. 把 eaibot.local 接进你的日常开发流配置跑通之后日常开发流会变成这样Windows 端打开 VSCodeRemote-SSH: Connect to Host选eaibot几秒后进入远程工作区。GitHub Copilot 在远程端正常工作因为它是 VSCode 插件跟着工作区走。需要看 GUI 的时候切到 NoMachine连eaibot.localGazebo 和 RViz 直接跑。模型入口这块如果你在 Ubuntu 端跑 Claude Code环境变量指向 TaoToken 的 API 端点Key 从 https://taotoken.net/api-keys 拿。如果在 Windows 端用 Cline配置里填同样的 Base URL 和 Key。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有各工具的详细配置示例。有个细节值得注意mDNS 的.local名字在局域网内是唯一的如果你有两台 Ubuntu 都叫eaibot会冲突。多台设备的话分别设成eaibot-1.local、eaibot-2.local这样。最后说一个实际经验手机热点环境下Ubuntu 的 WiFi 偶尔会进入省电模式导致 mDNS 广播中断。可以在 NetworkManager 里关掉 WiFi 省电sudo iw dev wlan0 set power_save off写到 systemd service 里持久化或者直接在/etc/NetworkManager/conf.d/wifi-powersave.conf里配wifi.powersave 2。这个改动对远程连接的稳定性提升很明显尤其是 NoMachine 这种长连接场景。整套方案跑下来你不再需要记 IP不再需要每次改 SSH config手机热点和工位 WiFi 之间切换也不用重新配置。eaibot.local这个名字就是你的开发机入口VSCode 和 NoMachine 都认它。
返回列表