4 minute read

最近一两年因为疫情的影响,Work from Home 成为了大家的新常态。然而,工作代码和数据通常都存在公司/学校的机器上,这就导致了一个问题:如何在家里访问公司/学校的机器呢?最简单粗暴的方法自然是用 TeamViewer, AnyDesk, 向日葵这类软件来控制机器,并直接在远程桌面上进行开发。但是,一方面出于安全考虑,不少机构(例如我们实验室)会禁止使用这些软件;另一方面,直接用这些软件来进行远程开发的体验也不是很好,往往伴随着卡顿、延迟等问题。因此,我们需要一种更优雅的方案来解决远程开发的需求,那就是 VS Code + SSH + 内网穿透。

什么是内网穿透?

那么,什么是内网穿透呢?我们有请 ChatGPT 来解释一下吧!😆

ChatGPT-Answer-of-NAT-transveral

如何配置内网穿透?

ZeroTier 的免费版最大可支持 25 个节点设备的内网穿透,可以轻松满足简单的日常开发需求。

  • 我们首先需要在官网注册一个账号,登陆后点击 Create A Network 来创建一个新的网络,并记录下该网络的 Network ID。

    Network-ID
  • 然后分别在需要远程开发的两台机器上安装 ZeroTier 客户端,安装方法如下:

    我的主力机器是 Ubuntu 22.04 系统,可以按照以下方法安装 ZeroTier 客户端:

    curl -s https://install.zerotier.com | sudo bash
    

    我的笔记本是 Windows 11 系统,官网提供了 Windows 客户端的安装包,可以直接下载安装。如果你使用其他支持的系统,也可以在官网找到对应的安装包。

  • 安装完成后,我们需要将两台机器加入到同一个 ZeroTier 网络中,方法如下:

    • 在 Ubuntu 系统上,可以运行以下命令:

      sudo zerotier-cli join <Network ID>
      

      其中 <Network ID> 为刚刚创建的网络的 Network ID。

    • 在笔记本上,打开 ZeroTier 客户端,点击 Join New Network,在弹出的对话框中输入刚刚创建的网络的 Network ID,点击 Join

      Join-a-Network
    • 出于安全考量,ZeroTier 默认创建私有访问权限的网络,即只有加入该网络的设备才能互相访问。因此,我们需要将两台机器的访问权限设置为公开访问。我们只需要登陆 ZeroTier 网站,然后找到刚刚创建的网络,并在 Members 中找到已加入该网络的两台机器,并将 Auth? 栏打勾即可。我们可以在 Managed IPs 栏中看到给两台机器自动分配的内网 IP 地址(当然,你也可以手动设置不同的地址)。

      Tick-Auth
  • 至此,我们已经完成了内网穿透的配置。我们可以在两台机器上分别运行以下命令来测试一下:

    ping <IP Address>
    

    其中 <IP Address> 为刚刚在 Managed IPs 栏中看到的内网 IP 地址。如果能够正常 ping 通,说明内网穿透已经配置成功。

注意: 在 Ubuntu 系统中,如果之前已经安装过 ZeroTier 客户端,或通过其他方式,例如 Snap, 安装了 zerotier-cli 命令,则必须先卸载干净其他版本,并彻底删除 /var/lib/zerotier-one 目录,然后再按照上述方法安装 ZeroTier 客户端。

  • 如果遇到 401 join {} 错误,可以尝试运行以下命令清空 Authorization Token,并重启服务解决:

    rm -rf /var/lib/zerotier-one/authtoken.secret
    sudo systemctl restart zerotier-one
    
  • 如果遇到以下报错:

    zerotier-one.service: Service hold-off time over, scheduling rest
    zerotier-one.service: Scheduled restart job, restart counter is a
    Stopped ZeroTier One.
    zerotier-one.service: Start request repeated too quickly.
    zerotier-one.service: Failed with result 'exit-code'.
    Failed to start ZeroTier One.
    

    很可能是因为系统中存在多个版本的 ZeroTier 客户端,例如 Snap 版本,我们可以尝试卸载 Snap 版本的 ZeroTier 客户端:

    sudo snap remove zerotier-one
    

遇到其它问题也可以在 ZeroTier 的官方 Issue 中搜索。

如何通过 VS Code 进行远程开发?

VS Code 是一款非常优秀的开发工具,丰富的插件和功能极大地增加了它的可扩展性。通过 Remote Development 插件,我们可以在本地开发环境中,通过 SSH, Docker 或 WSL 等方式,连接到远程服务器并直接使用远程服务器的硬件资源进行开发。

Remote-Dev-Extension

安装完 Remote Development 插件后,我们就可以通过 SSH 的方式连接到远程服务器进行开发了:

  • 首先,我们需要配置 SSH 连接到远程服务器的信息。如下图我们可以依次打开 Remote Explorer 插件,并打开 SSH Config 文件。

    Remote-Dev-Extension

    然后,我们在打开的 SSH Config 文件中,添加以下内容:

    Host Work # 远程机器的别名
      HostName 192.168.194.174 # 分配的内网 IP 地址
      Port 2222 # 远程机器的 SSH 端口号
      User xinyu # 远程机器的用户名
    

    其中 HostName 是我们在内网穿透中给远程服务器分配的内网 IP 地址,Port 是远程服务器的 SSH 端口号(使用 Zotier 进行内网穿透时,默认服务器的 SSH 端口号为 2222),User 是远程服务器的用户名。配置完成后,我们可以在 Remote Explorer 插件中看到我们刚刚添加的服务器了!双击即可连接到远程服务器,然后我们就可以像在本地一样流畅地使用远程机器进行开发了。

💡 另外,为了方便起见,我们可以配置 SSH 的免密登录,这样就不需要每次连接远程服务器时都输入密码了。

# 在本地生成 SSH 密钥对
ssh-keygen
# 将公钥复制到远程服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub xinyu@192.168.194.174

至此,我们就可以愉快地使用 VS Code 进行远程开发了!🎉🎉🎉

Example-Remote-Dev

Leave a comment