使用 RustDesk 实现内网穿透

使用 RustDesk 实现内网穿透

RustDesk 是一款开源远程桌面软件,支持 TCP 隧道(tunneling)功能,这可以用于转发端口,从而允许从其他设备(Windows 或 macOS)通过 SSH 访问 Ubuntu 服务器。即使服务器无 GUI,RustDesk 也可以在 headless(无头)模式下运行作为服务端。TCP 隧道本质上是客户端发起的端口转发:客户端连接到服务器的 RustDesk 后,设置本地端口转发到服务器的 SSH 端口(默认 22),然后从客户端本地 SSH 到该端口即可访问服务器。

  • 此设置假设 Ubuntu 服务器的 SSH 服务已启用(sudo apt install openssh-server && sudo systemctl start ssh)。
  • 默认情况下,RustDesk 使用公共中继服务器。如果需要自托管中继服务器(例如防火墙限制),可以额外安装 RustDesk Server,但这里聚焦于基本设置。
  • TCP 隧道需要在客户端的 RustDesk GUI 中配置(Windows/macOS 有 GUI),服务器侧只需启用并运行 RustDesk 服务。
  • 安全提示:使用强密码,并考虑自托管以避免公共中继。

在 Ubuntu 服务器上安装和配置 RustDesk(CLI 操作)

  1. 更新系统包:

    1
    
    sudo apt update && sudo apt upgrade -y
    
  2. 下载最新 RustDesk deb 包(检查 RustDesk GitHub Releases 获取最新版本,例如 1.4.2):

    1
    
    wget https://github.com/rustdesk/rustdesk/releases/download/1.4.2/rustdesk-1.4.2-x86_64.deb
    
  3. 安装 deb 包:

    1
    
    sudo dpkg -i rustdesk-*.deb
    
  4. 修复任何依赖问题:

    1
    
    sudo apt-get install -f
    
  5. 安装 headless 支持所需包(虚拟显示驱动,可选):

    1
    
    sudo apt install ubuntu-desktop xserver-xorg-video-dummy lightdm -y
    
  6. 启用 headless 模式:

    1
    
    sudo rustdesk --option allow-linux-headless Y
    
  7. 作为系统服务启动 RustDesk(自动后台运行):

    1
    2
    
    sudo systemctl start rustdesk
    sudo systemctl enable rustdesk  # 开机自启
    
  8. 获取 RustDesk ID(用于客户端连接):

    1
    
    sudo rustdesk --get-id
    

    (输出类似:123456789)

  9. 设置永久密码(替换 <your_password> 为强密码):

    1
    
    sudo rustdesk --password <your_password>
    
  10. 启用 TCP 隧道(默认已启用,但可手动确认/设置):

    • 编辑配置文件(通常在 /root/.config/rustdesk/RustDesk.toml):
      1
      
      sudo vim /root/.config/rustdesk/RustDesk.toml
      
    • 添加或修改:
      1
      
      enable-tunnel = "Y"
      
    • 保存后,重启服务:
      1
      
      sudo systemctl restart rustdesk
      

在客户端设备上配置 RustDesk 和 TCP 隧道

各平台都可从 RustDesk GitHub Releases 下载并安装 RustDesk 客户端。安装完成后打开 RustDesk 客户端,输入服务器的 ID 和密码进行连接。连接成功后,在 RustDesk 界面中设置 TCP 隧道。

设置端口转发

点击已添加设备菜单中的 TCP Tunneling 按钮

RustDesk 已添加设备中的 TCP Tunneling 按钮

添加新隧道:

  • 本地端口:任意可用端口,例如 50002(本地监听端口)。
  • 远程主机:localhost(或服务器内网 IP,如果不同)。
  • 远程端口:22(SSH 端口)。

Port Forwarding 界面

上述端口转发设置将实时生效,在使用过程中请勿关闭端口转发窗口。

测试隧道

在客户端命令行(Windows: PowerShell 或 cmd;macOS: Terminal)运行:

1
ssh <ubuntu_username>@localhost -p 50002

输入 Ubuntu 服务器的 SSH 密码,即可连接。这会将客户端的本地 50002 端口流量转发到服务器的 22 端口,实现 SSH 访问。

或者可以通过 Visual Studio Code / Cursor 等支持 SSH 访问的软件进行上述测试,详细的 SSH 配置如下:

1
2
3
4
Host my-linux-rustdesk
  HostName localhost
  User root
  Port 50002

其他使用场景

除了上述的 SSH 连接之外,还可以通过将 Windows 设备的 Remote Desktop Protocol 端口(RDP 端口默认为 3389)映射到本地,例如在上述 Port Forwarding 窗口中配置本地 40002 端口转发到远端 3389 端口。然后使用 Windows APP 新建 RDP 远程桌面连接,Windows APP 中的设置如下图,设置远端 Windows 用户名和密码后,即可通过 RustDesk 端口转发的形式完成远程桌面访问。

Windows APP 中 IP 和端口设置为 localhost 以及转发的端口

但话说回来,RustDesk 本身就支持远程桌面访问,上述需求也许算是一个伪需求吧~

为 RustDesk 设置代理

在某些情况下穿透不太稳定,因此可以设置代理使远程连接更加丝滑。如果本机已经安装代理软件且默认开放局域网访问(如 Clash 系列软件,默认开启本机 7890 端口接收其他软件或设备的代理请求),因此可以将 RustDesk 的流量转发给 Clash(127.0.0.1:7890)使其托管,设置方法如下:

RustDesk 代理设置界面

常见问题排查

  • 连接失败:检查防火墙(sudo ufw allow 21114:21119/tcp && sudo ufw allow 21116/udp),或使用自托管服务器(参考 https://rustdesk.com/docs/en/self-host/)。
  • 无输出:CLI 命令需 sudo 执行。
  • 密码加密:如果配置文件中密码加密,可用 --get-temp-password 获取临时密码。
  • 多设备:每个客户端独立连接并设置隧道,支持同时多个。
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy