banner
约 1,800 字
6 分钟

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 终端执行:

Shell
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

安装 Tailscale

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

Tailscale 登录链接

把它复制到浏览器打开,用 Google / GitHub / Microsoft 账号登录(随便选一个)。登录成功后,这台 Ubuntu 会获得一个 100.x.x.x 的虚拟 IP,就说明已经加入你的虚拟局域网了。

2. 安装 xrdp

Ubuntu 桌面版可以直接用默认环境,但有个坑要注意:GNOME 桌面经 xrdp 很容易黑屏/卡顿。所以我推荐装轻量的 Xfce,远程体验更流畅。

Shell
sudo apt update
sudo apt install -y xfce4 xfce4-goodies xrdp

为什么偏偏是 GNOME 出问题? GNOME 的默认会话(GNOME Shell)依赖 3D 硬件加速来渲染界面;而 xrdp 提供的是一套没有真实 GPU 加速的虚拟显示后端,两者凑在一起就容易黑屏、卡在登录界面或者画面撕裂。Xfce 本身不依赖 3D 合成,对这类"软件模拟显示"环境天然友好——所以远程用 Xfce,不是它不好,而是它用对了地方。

3. 让 xrdp 使用 Xfce

装完 Xfce 后,要告诉 xrdp 用 Xfce 会话,并启动服务:

Shell
echo "xfce4-session" > ~/.xsession
sudo systemctl enable --now xrdp
sudo systemctl restart xrdp

这一步是避免黑屏/认证循环的关键,别跳过。

~/.xsession 的作用是"告诉 xrdp:给我这个用户起会话时,跑哪个桌面程序"。不写这行,xrdp 不知道你要哪个桌面环境,就会回退到系统默认(也就是那个会黑屏的 GNOME)。注意这个文件是按用户的——多用户机器上,每个用户都得配一次。

4. 放行端口(若开了 UFW 防火墙)

如果你给 Ubuntu 开了 UFW 防火墙,需要放行 RDP 端口 3389:

Shell
sudo ufw allow 3389/tcp

注意:我们之所以能"不开路由器端口",是因为 Tailscale 走的是它自己的加密隧道,不需要你在公网路由器上转发 3389;这里的 ufw allow 只是放行 Tailscale 虚拟网卡到你本机的访问。

5. 记下 Ubuntu 的 Tailscale IP

Shell
tailscale ip
# 比如我的是 100.102.53.68

查看 Ubuntu 的 Tailscale IP

把这个 IP 记下来,等会儿 Windows 端就连它。

二、Windows 端设置(你的电脑)

Ubuntu 端配好后,到你的 Windows 电脑上操作。

  1. 去 https://tailscale.com/download 安装 Windows 版 Tailscale。

安装 Windows 版 Tailscale
  1. 登录同一个账号(和 Ubuntu 那步用的账号一致)——这样两台机器才能在同一个虚拟局域网里互相看到。

  2. 打开 Windows 自带的**「远程桌面连接」**(按 Win+R 输入 mstsc 回车即可)。

  3. 在"计算机"栏填 Ubuntu 的 Tailscale IP(如 100.102.53.68)。

远程桌面连接填写 Tailscale IP
  1. 用户名 / 密码填 Ubuntu 的登录账密。

  2. 点连接,看到 Xfce 桌面就成功了 🎉

成功远程连接到 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 上执行:

Shell
tailscale netcheck

它会列出到各个 DERP 中继的延迟。如果显示你正在用某个延迟很高的中继(而不是直连),视频和拖拽窗口就会明显卡。这种情况通常是两端网络环境太严(对称 NAT / 企业防火墙)导致打洞失败——换成结构简单的网络(比如家里的普通路由器)往往能恢复直连。

⚠️ 一个容易被忽略的安全问题

Tailscale 把设备拉进同一个虚拟局域网,是一件很爽也很危险的事:默认情况下,这个网络里的设备之间是互相可见、可以互相访问端口的。

也就是说,如果你哪天在笔记本、手机上也装了同一个账号的 Tailscale,那么这台 Ubuntu 的 3389 端口,对它们同样是敞开的。任何一台设备被入侵,都可能成为进入你整个 tailnet 的跳板。

两个务实的做法:

  • 用 Tailscale 的 ACL(访问控制):可以把"谁能访问谁的哪个端口"写清楚,而不是默认全通。个人用户配置一两条规则就能收紧很多。

  • 尽量别直接把裸服务暴露在 tailnet 里,尤其是没有认证的服务。如果服务本身没有登录功能,可以先给它套一层认证墙,思路和用 Lucky 给内网服务加一道登录墙是一样的——加一层 TOTP 二次验证后,即使虚拟网络被横向访问,对方也进不来。

我的结论

这套 Tailscale + xrdp 方案,是我目前用过最接近"原生远程桌面"且完全免费的组合了。它最大的价值就是解决了"没有公网 IP"这个硬伤——不用买服务器中转、不用折腾路由器端口,只要两台机器都装了 Tailscale 加入同一账号,剩下的体验跟本地局域网远程几乎没区别。

要说小缺点,就是需要在 Ubuntu 上装并切换到 Xfce(如果你习惯了 GNOME,会需要适应一下桌面样式)。但换来的是稳定流畅的远程体验,这点代价完全值得。

顺便提两个思路相近的方案,看你需要哪一类:

如果你也有一台 Ubuntu 机器(比如闲置笔记本、小主机),想随时随地用 Windows 远程连上去,强烈推荐这套方案——配一次,以后走到哪都能像在本地一样连过去。

END