Tailscale + xrdp 实现 Ubuntu 无公网远程控制方案
摘要
本文介绍了一种无需公网 IP 和端口转发的 Ubuntu 远程桌面方案。在 Ubuntu 端,需安装 Tailscale 并登录,安装 xrdp(推荐轻量级 Xfce),配置会话并放行 3389 端口。在 Windows 端,安装 Tailscale 并使用远程桌面连接到 Ubuntu 的 Tailscale IP。文中还提供了连接失败、黑屏等常见问题的解决方法。
前言
我之前写过 Ubuntu 的远程控制方案,当时用的是端口转发的思路。但很多朋友反馈说:我根本没有公网 IP,或者宽带运营商不给公网地址,这条路根本走不通。
那没有公网 IP 该怎么办?传统方案无非两种:
frp:需要一台有公网 IP 的服务器做中转,得自己买服务器。
Ngrok:用它的服务,但有流量限制,免费额度也紧巴巴。
其实还有一条更省心的路——Tailscale + xrdp。这套方案体验最接近原生 Windows 远程桌面,而且关键优势在于:
全程不用公网 IP
不用去路由器里开端口(不用 NAT 转发、不用改防火墙)
Tailscale 免费版个人套餐就支持 100 台设备,个人用完全够。下面完整记录配置过程。
原理:为什么能"无公网也远程"
简单说,Tailscale 会把你名下的多台设备(不管它们各自在什么网络下)组成一个虚拟局域网,给每台设备分配一个稳定的 100.x.x.x 虚拟 IP,设备之间通过加密隧道直接互通——所以两台机器之间能互相访问,根本不需要公网 IP。
而 xrdp 则是让 Linux 提供一个 RDP(远程桌面协议)服务,这样 Windows 自带的"远程桌面连接"(mstsc)就能直接连上来,体验和连 Windows 远程桌面几乎一样。
一句话概括:Tailscale 负责"把两台机器拉到同一个内网",xrdp 负责"提供桌面",合起来就是无公网 IP 的流畅远程桌面。
两个细节值得多说一句
① 为什么虚拟 IP 是 100.x.x.x?
100.64.0.0/10 是国际标准(RFC 6598)里划定给运营商级 NAT(CGNAT)使用的保留网段。Tailscale 选它的原因很实际:这个段在公网上不会被真实路由,所以不存在"虚拟 IP 和某个真实公网地址撞车"的可能,同时又不像 192.168.x.x 那样在你家里已经被占满了。看到 100.x 就理解成"这是 Tailscale 私有网络里的门牌号"即可。
② 万一打洞失败呢?
Tailscale 底层用的是 WireGuard(现代、极快的 VPN 协议),但它自己解决了一个 WireGuard 原生没管的问题:NAT 穿透。
两台设备能直连时(比如都在常见的家用 NAT 后),它用 STUN 打洞建立点对点直连,流量不经过任何第三方,速度最快。
打洞失败时(对称型 NAT、企业防火墙等),它会自动退到 DERP 中继——由 Tailscale 的服务器帮忙转发。
关键点:即使走中继,流量也是端到端加密的,中继服务器只负责搬运加密数据包,看不到内容。所以"走了中继"只是慢一点,不是不安全。
一、Ubuntu 端配置(被控机)
先在被控的 Ubuntu 机器上操作。
1. 安装并登录 Tailscale
在 Ubuntu 终端执行:

运行 sudo tailscale up 后,终端会打印一个登录链接。

把它复制到浏览器打开,用 Google / GitHub / Microsoft 账号登录(随便选一个)。登录成功后,这台 Ubuntu 会获得一个 100.x.x.x 的虚拟 IP,就说明已经加入你的虚拟局域网了。
2. 安装 xrdp
Ubuntu 桌面版可以直接用默认环境,但有个坑要注意:GNOME 桌面经 xrdp 很容易黑屏/卡顿。所以我推荐装轻量的 Xfce,远程体验更流畅。
为什么偏偏是 GNOME 出问题? GNOME 的默认会话(GNOME Shell)依赖 3D 硬件加速来渲染界面;而 xrdp 提供的是一套没有真实 GPU 加速的虚拟显示后端,两者凑在一起就容易黑屏、卡在登录界面或者画面撕裂。Xfce 本身不依赖 3D 合成,对这类"软件模拟显示"环境天然友好——所以远程用 Xfce,不是它不好,而是它用对了地方。
3. 让 xrdp 使用 Xfce
装完 Xfce 后,要告诉 xrdp 用 Xfce 会话,并启动服务:
这一步是避免黑屏/认证循环的关键,别跳过。
~/.xsession的作用是"告诉 xrdp:给我这个用户起会话时,跑哪个桌面程序"。不写这行,xrdp 不知道你要哪个桌面环境,就会回退到系统默认(也就是那个会黑屏的 GNOME)。注意这个文件是按用户的——多用户机器上,每个用户都得配一次。
4. 放行端口(若开了 UFW 防火墙)
如果你给 Ubuntu 开了 UFW 防火墙,需要放行 RDP 端口 3389:
注意:我们之所以能"不开路由器端口",是因为 Tailscale 走的是它自己的加密隧道,不需要你在公网路由器上转发 3389;这里的
ufw allow只是放行 Tailscale 虚拟网卡到你本机的访问。
5. 记下 Ubuntu 的 Tailscale IP

把这个 IP 记下来,等会儿 Windows 端就连它。
二、Windows 端设置(你的电脑)
Ubuntu 端配好后,到你的 Windows 电脑上操作。
去 https://tailscale.com/download 安装 Windows 版 Tailscale。

登录同一个账号(和 Ubuntu 那步用的账号一致)——这样两台机器才能在同一个虚拟局域网里互相看到。
打开 Windows 自带的**「远程桌面连接」**(按
Win+R输入mstsc回车即可)。在"计算机"栏填 Ubuntu 的 Tailscale IP(如
100.102.53.68)。

用户名 / 密码填 Ubuntu 的登录账密。
点连接,看到 Xfce 桌面就成功了 🎉

Windows 家庭版用户注意:Windows 家庭版没有"远程桌面服务端",但"远程桌面客户端"(mstsc)是有的,而且我们这里连的是 Ubuntu,用到的只是客户端——所以家庭版完全没问题。
三、常见坑(排错)
1. 连不上
先确认 Windows 端 Tailscale 已登录、状态是绿色(在系统托盘看)。
用
ping <Ubuntu的Tailscale IP>测试两台机器是否互通。ping 不通说明虚拟局域网没建立,先解决 Tailscale 连接问题。
2. 黑屏 / 认证循环
多半是 GNOME 会话和 xrdp 的兼容问题。回到上面第 3 步,切换到 Xfce(写入
~/.xsession并重启 xrdp)基本就能解决。
3. 提示密码错误
用
sudo passwd $USER重新设置一下 Ubuntu 用户的密码。
4. 卡顿明显
确认用的 Xfce 而非 GNOME(GNOME 经 RDP 效率低)。
检查两端网络质量;Tailscale 两端尽量靠近公网质量好的网络。
5.(补充)能 ping 通但很卡 / 速度忽高忽低
在 Ubuntu 上执行:
它会列出到各个 DERP 中继的延迟。如果显示你正在用某个延迟很高的中继(而不是直连),视频和拖拽窗口就会明显卡。这种情况通常是两端网络环境太严(对称 NAT / 企业防火墙)导致打洞失败——换成结构简单的网络(比如家里的普通路由器)往往能恢复直连。
⚠️ 一个容易被忽略的安全问题
Tailscale 把设备拉进同一个虚拟局域网,是一件很爽也很危险的事:默认情况下,这个网络里的设备之间是互相可见、可以互相访问端口的。
也就是说,如果你哪天在笔记本、手机上也装了同一个账号的 Tailscale,那么这台 Ubuntu 的 3389 端口,对它们同样是敞开的。任何一台设备被入侵,都可能成为进入你整个 tailnet 的跳板。
两个务实的做法:
用 Tailscale 的 ACL(访问控制):可以把"谁能访问谁的哪个端口"写清楚,而不是默认全通。个人用户配置一两条规则就能收紧很多。
尽量别直接把裸服务暴露在 tailnet 里,尤其是没有认证的服务。如果服务本身没有登录功能,可以先给它套一层认证墙,思路和用 Lucky 给内网服务加一道登录墙是一样的——加一层 TOTP 二次验证后,即使虚拟网络被横向访问,对方也进不来。
我的结论
这套 Tailscale + xrdp 方案,是我目前用过最接近"原生远程桌面"且完全免费的组合了。它最大的价值就是解决了"没有公网 IP"这个硬伤——不用买服务器中转、不用折腾路由器端口,只要两台机器都装了 Tailscale 加入同一账号,剩下的体验跟本地局域网远程几乎没区别。
要说小缺点,就是需要在 Ubuntu 上装并切换到 Xfce(如果你习惯了 GNOME,会需要适应一下桌面样式)。但换来的是稳定流畅的远程体验,这点代价完全值得。
顺便提两个思路相近的方案,看你需要哪一类:
如果你想要的是**"在浏览器里操作另一台机器"**,连客户端都不想装,可以看用 Docker 部署 WeChat Selkies,在浏览器里使用网页版微信——它的思路是把整个桌面"流"到网页里。
如果你要远程的是手机而非电脑,那 scrcpy 那条线更合适:在 NAS 上部署 Web-Scrcpy,网页远程控制手机。
如果你也有一台 Ubuntu 机器(比如闲置笔记本、小主机),想随时随地用 Windows 远程连上去,强烈推荐这套方案——配一次,以后走到哪都能像在本地一样连过去。