# 从官网下载最新 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
# 启动 todesk 客户端
todesk
# 或通过命令行设置
# 设置登录密码(用于无人值守访问)
todesk --setpasswd <your_password>
# 查看 ToDesk 服务状态
sudo systemctl status todeskd
# 查看日志
sudo journalctl -u todeskd -f
# 重启服务
sudo systemctl restart todeskd
ToDesk 使用 UDP 协议进行 P2P 直连和中继传输,而 Clash 及其 TUN 模式可能会干扰 ToDesk 的网络连接,导致:
ToDesk 通过自己的中继服务器和 P2P 协议工作,完全不需要翻墙。确保 ToDesk 的流量走直连是保持稳定的关键。
如果在 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
如果使用系统代理(环境变量),确保 ToDesk 不被代理影响:
# ToDesk 不遵守 http_proxy 环境变量(因为它不是 HTTP 客户端)
# 通常不需要额外配置
# 但如果使用了全局透明代理(如 iptables REDIRECT)
# 需要确保 ToDesk 的 UDP 端口不被重定向
# 检查 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
当 ToDesk 连接出现问题时,对比"正常时"和"异常时"的系统状态,可以快速定位根因。建议在 ToDesk 工作正常时保存一份完整的系统网络状态快照。
创建脚本 /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
当出现问题时运行同样的脚本,然后用 diff 对比:
diff /home/user/Documents/network-baseline/baseline_normal.txt \
/home/user/Documents/network-baseline/baseline_problem.txt
重点关注:
| 现象 | 可能原因 | 诊断方法 |
|---|---|---|
| 连接后立即断开 | 密码错误 / 版本不兼容 | 检查日志 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> 检查路由 |
# 情况 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
# 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
# 对比官网最新版本
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
# 查看当前分辨率
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 支持自适应分辨率。在客户端顶部工具栏 → 显示设置 → 选择"自适应窗口"或"原始分辨率"。
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
# 保持 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"
# 关闭 Ubuntu 的动画效果(减少远程传输带宽)
gsettings set org.gnome.desktop.interface enable-animations false
# 使用轻量桌面环境(如果性能问题严重)
# 考虑安装 XFCE:
sudo apt install xfce4
# 降低 ToDesk 编码质量以提升帧率
# ToDesk 客户端 → 设置 → 画质 → 选择"流畅优先"(而非"画质优先")
将以下内容保存为 /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