ToDesk 远程桌面稳定性指南 (Ubuntu)

1. 安装与基础配置

1.1 下载与安装


# 从官网下载最新 deb 包
wget https://dl.todesk.com/linux/todesk-v4.7.2.0-amd64.deb

# 安装
sudo dpkg -i todesk-v4.7.2.0-amd64.deb
sudo apt-get install -f # 修复依赖

# 启动 daemon
sudo systemctl start todeskd.service
sudo systemctl enable todeskd.service

1.2 首次配置


# 启动 todesk 客户端
todesk

# 或通过命令行设置
# 设置登录密码(用于无人值守访问)
todesk --setpasswd <your_password>

1.3 服务管理


# 查看 ToDesk 服务状态
sudo systemctl status todeskd

# 查看日志
sudo journalctl -u todeskd -f

# 重启服务
sudo systemctl restart todeskd


2. ToDesk 与 Clash 代理的共存策略

2.1 核心问题

ToDesk 使用 UDP 协议进行 P2P 直连和中继传输,而 Clash 及其 TUN 模式可能会干扰 ToDesk 的网络连接,导致:

2.2 推荐策略:ToDesk 流量直连,不走代理

ToDesk 通过自己的中继服务器和 P2P 协议工作,完全不需要翻墙。确保 ToDesk 的流量走直连是保持稳定的关键。

2.3 Clash TUN 模式下的配置

如果在 Clash 中启用了 TUN 模式,需要在 config.yaml 的 rules 中排除 ToDesk 相关流量:


# ~/.local/share/io.github.clash-verge-rev.clash-verge-rev/config.yaml

rules:
# ★ ToDesk 相关域名走直连
- DOMAIN-SUFFIX,todesk.com,DIRECT
- DOMAIN-SUFFIX,todesk.net,DIRECT
- DOMAIN-KEYWORD,todesk,DIRECT

# ToDesk 使用 UDP,确保不受代理干扰
- DST-PORT,21115,DIRECT
- DST-PORT,21116,DIRECT
- DST-PORT,21117,DIRECT
- DST-PORT,21118,DIRECT
- DST-PORT,21119,DIRECT

# 其余规则...
- GEOIP,CN,DIRECT
- MATCH,Proxy

2.4 系统代理模式下的配置

如果使用系统代理(环境变量),确保 ToDesk 不被代理影响:


# ToDesk 不遵守 http_proxy 环境变量(因为它不是 HTTP 客户端)
# 通常不需要额外配置

# 但如果使用了全局透明代理(如 iptables REDIRECT)
# 需要确保 ToDesk 的 UDP 端口不被重定向

2.5 验证 ToDesk 的连通性


# 检查 ToDesk 使用的端口
sudo ss -unp | grep todesk

# 应该能看到类似:
# UNCONN 0 0 *:21116 *:* users:(("todeskd",...))

# 测试到 ToDesk 中继服务器的延迟
ping -c 4 relay.todesk.com

# 查看当前 ToDesk 的连接
sudo ss -anp | grep todesk | grep ESTAB


3. 系统基线快照

3.1 为什么需要基线快照

当 ToDesk 连接出现问题时,对比"正常时"和"异常时"的系统状态,可以快速定位根因。建议在 ToDesk 工作正常时保存一份完整的系统网络状态快照。

3.2 收集基线快照

创建脚本 /home/user/bin/network-baseline.sh


#!/bin/bash
# ==============================================
# 网络基线快照收集脚本
# 在系统网络正常时运行,保存当前状态
# ==============================================

BASELINE_DIR="/home/user/Documents/network-baseline"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT="${BASELINE_DIR}/baseline_${TIMESTAMP}.txt"

mkdir -p "$BASELINE_DIR"

{
echo "=========================================="
echo "Network Baseline Snapshot — $TIMESTAMP"
echo "=========================================="
echo ""

# 1. 网络接口
echo "=== ip addr ==="
ip addr show
echo ""

# 2. 路由表
echo "=== ip route ==="
ip route show table all
echo ""

# 3. DNS 配置
echo "=== /etc/resolv.conf ==="
cat /etc/resolv.conf
echo ""
echo "=== systemd-resolve ==="
systemd-resolve --status 2>/dev/null || resolvectl status
echo ""

# 4. 监听端口
echo "=== TCP 监听端口 ==="
ss -tlnp
echo ""
echo "=== UDP 监听端口 ==="
ss -ulnp
echo ""

# 5. 已建立的连接
echo "=== 已建立的连接 ==="
ss -tanp state established
echo ""

# 6. 代理环境变量
echo "=== 代理环境变量 ==="
env | grep -i proxy || echo "(无代理环境变量)"
echo ""

# 7. ToDesk 状态
echo "=== ToDesk 状态 ==="
sudo systemctl status todeskd --no-pager -l 2>/dev/null || echo "todeskd 未运行"
echo ""

# 8. Cloudflared 状态
echo "=== Cloudflared 状态 ==="
sudo systemctl status cloudflared --no-pager -l 2>/dev/null || echo "cloudflared 未运行"
echo ""

# 9. Clash 状态
echo "=== Clash 状态 ==="
systemctl --user status clash-verge.service --no-pager -l 2>/dev/null || echo "clash 未运行"
echo ""

# 10. 外网连通性
echo "=== 连通性测试 ==="
echo -n "ping google.com: "
ping -c 1 -W 2 google.com > /dev/null 2>&1 && echo "OK" || echo "FAIL"
echo -n "ping baidu.com: "
ping -c 1 -W 2 baidu.com > /dev/null 2>&1 && echo "OK" || echo "FAIL"
echo -n "ToDesk relay: "
ping -c 1 -W 2 relay.todesk.com > /dev/null 2>&1 && echo "OK" || echo "FAIL"
echo ""

echo "=== 快照完成 ==="

} > "$OUTPUT"

echo "基线已保存到: $OUTPUT"


chmod +x /home/user/bin/network-baseline.sh

3.3 对比分析

当出现问题时运行同样的脚本,然后用 diff 对比:


diff /home/user/Documents/network-baseline/baseline_normal.txt \
     /home/user/Documents/network-baseline/baseline_problem.txt

重点关注:


4. 常见断连原因与恢复

4.1 断连原因总结

现象 可能原因 诊断方法
连接后立即断开 密码错误 / 版本不兼容 检查日志 journalctl -u todeskd -f
运行几分钟后断开 Clash TUN 模式路由冲突 对比基线路由表
画面静止不动 网络丢包严重 mtr relay.todesk.com 查看路径质量
连接不上(始终显示 Connecting...) ToDesk daemon 未运行 sudo systemctl status todeskd
频繁重连 UDP 被代理/防火墙拦截 ss -unp \| grep todesk 检查 UDP 状态
只在家宽/移动网络能连 NAT 穿透失败,回退中继 ToDesk 自动处理,确保 UDP 21116 可达
代理开启后就连不上 ip route 被 clash TUN 覆盖 ip route get <peer_ip> 检查路由

4.2 恢复操作


# 情况 1: ToDesk daemon 挂了
sudo systemctl restart todeskd

# 情况 2: 怀疑是 TUN 模式干扰
# 临时关闭 Clash TUN:
# GUI → Settings → TUN Mode → 关闭
# 或杀掉 clash 进程:
# systemctl --user stop clash-verge.service

# 情况 3: 完全重置网络后重试
sudo systemctl restart NetworkManager
sleep 5
sudo systemctl restart todeskd

# 情况 4: 端口被占用
# 检查是否有其他程序占用 ToDesk 端口
sudo ss -ulnp | grep -E '2111[5-9]'
sudo lsof -i :21116

# 情况 5: DNS 问题导致无法解析中继服务器
# 测试 DNS
nslookup relay.todesk.com
# 如果不通,尝试更换 DNS
echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf

4.3 预防措施


# 1. 确保 todeskd 开机自启
sudo systemctl enable todeskd

# 2. 设置 systemd 自动重启
sudo mkdir -p /etc/systemd/system/todeskd.service.d/
sudo tee /etc/systemd/system/todeskd.service.d/override.conf << 'EOF'
[Service]
Restart=on-failure
RestartSec=10
EOF
sudo systemctl daemon-reload

# 3. 定期检查 ToDesk 版本更新
todesk --version
# 对比官网最新版本


5. 远程开发的显示配置

5.1 多显示器适配

ToDesk 通过虚拟显示驱动支持多显示器。如果远程主机没有物理显示器连接,Ubuntu 可能在无头(headless)模式下不启用 GUI。

解决方案:安装虚拟显示器驱动

# 安装 xserver-xorg-video-dummy(如果远程主机无显示器)
sudo apt install xserver-xorg-video-dummy

# 或者使用 HDMI 欺骗器(硬件方案)
# 购买一个 HDMI Dummy Plug,插入远程主机的 HDMI 口
# 系统会认为有显示器连接

配置虚拟显示器 (/etc/X11/xorg.conf.d/99-dummy.conf):

Section "Device"
    Identifier  "DummyDevice"
    Driver      "dummy"
    VideoRam    256000
EndSection

Section "Monitor"
Identifier "DummyMonitor"
HorizSync 28.0-80.0
VertRefresh 48.0-75.0
EndSection

Section "Screen"
Identifier "DummyScreen"
Device "DummyMonitor"
Monitor "DummyMonitor"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1920x1080" "2560x1440"
EndSubSection
EndSection

5.2 分辨率调整

在远程主机上

# 查看当前分辨率
xrandr

# 添加自定义分辨率(如果虚拟显示器不支持目标分辨率)
cvt 1920 1080 60
# 复制输出的 Modeline 参数

xrandr --newmode "1920x1080_60.00" <Modeline参数>
xrandr --addmode DUMMY0 "1920x1080_60.00" # DUMMY0 根据实际输出名替换
xrandr --output DUMMY0 --mode "1920x1080_60.00"

在 ToDesk 客户端(本地)

ToDesk 支持自适应分辨率。在客户端顶部工具栏 → 显示设置 → 选择"自适应窗口"或"原始分辨率"。

5.3 关闭/最小化处理

Ubuntu 的节能设置可能在"合上笔记本盖子"或"屏幕锁定"时影响远程桌面体验。


# 禁用自动锁屏和息屏
gsettings set org.gnome.desktop.screensaver lock-enabled false
gsettings set org.gnome.desktop.session idle-delay 0

# 禁用合盖休眠
sudo sed -i 's/#HandleLidSwitch=suspend/HandleLidSwitch=ignore/' /etc/systemd/logind.conf
sudo sed -i 's/#HandleLidSwitchExternalPower=suspend/HandleLidSwitchExternalPower=ignore/' /etc/systemd/logind.conf
sudo systemctl restart systemd-logind

5.4 SSH 备选方案(ToDesk 不可用时的保底)


# 保持 SSH 作为备用远程方式
sudo systemctl enable ssh
sudo systemctl start ssh

# 如果通过 Cloudflared Tunnel 暴露 SSH
# 在 cloudflared config.yml 中:
# ingress:
# - hostname: ssh.example.com
# service: ssh://localhost:22

# 然后通过 SSH 命令重启 ToDesk
ssh [email protected] "sudo systemctl restart todeskd"

5.5 性能优化


# 关闭 Ubuntu 的动画效果(减少远程传输带宽)
gsettings set org.gnome.desktop.interface enable-animations false

# 使用轻量桌面环境(如果性能问题严重)
# 考虑安装 XFCE:
sudo apt install xfce4

# 降低 ToDesk 编码质量以提升帧率
# ToDesk 客户端 → 设置 → 画质 → 选择"流畅优先"(而非"画质优先")


6. 快速诊断脚本

将以下内容保存为 /home/user/bin/todesk-check.sh


#!/bin/bash
# ==============================================
# ToDesk 快速诊断
# ==============================================

echo "=== ToDesk Daemon 状态 ==="
sudo systemctl is-active todeskd && echo " 运行中" || echo " 未运行!"

echo ""
echo "=== ToDesk 端口 ==="
ss -ulnp 2>/dev/null | grep 2111 || echo " (未发现 UDP 端口 — 可能已连接)"

echo ""
echo "=== Clash 代理 ==="
systemctl --user is-active clash-verge.service 2>/dev/null && echo " Clash 运行中 (检查 TUN 模式)" || echo " Clash 已停止"

echo ""
echo "=== TUN 接口 ==="
ip link show | grep -i tun && echo " TUN 接口存在 (可能干扰 ToDesk)" || echo " 无 TUN 接口"

echo ""
echo "=== 代理环境变量 ==="
env | grep -i proxy || echo " (无)"

echo ""
echo "=== ToDesk 中继可达性 ==="
ping -c 2 -W 2 relay.todesk.com 2>/dev/null && echo " 中继: OK" || echo " 中继: 不可达"

echo ""
echo "=== Cloudflared 状态 ==="
sudo systemctl is-active cloudflared 2>/dev/null && echo " Cloudflared: 运行中" || echo " Cloudflared: 已停止"

echo ""
echo "=== 到 Cloudflare 的路由 ==="
ip route get 1.1.1.1 | head -1

echo ""
echo "=== 完成 ==="


chmod +x /home/user/bin/todesk-check.sh


7. 参考