通过VNC的方式进行远程控制是我们经常会使用的主机管理方式之一,noVNC则解放了客户端的限制,不再局限于终端,随时随地通过网页进行操作。
ZeroTier则用于内网穿透,配合noVNC免去了控制终端需要在同一内网的限制,非常nice。

为什么是ZeroTier?

同类内网穿透的软件有很多,如FrpNPS等,但主打p2p的仅ZeroTier,通过官方的服务器进行内网隧道的打通后便不再依赖Server端,实现点对点连接,因此速度更快。

ZeroTier

  1. 注册并登录ZeroTier

  2. 创建私有内网
    默认已经给你创建好了一个,记下此处的Network ID

  3. 主机加入内网,这边演示2种加入的方式:

  • 安装官方提供的客户端,点击前往官网下载
    Windows10系统为例,安装完成后,点击Join Network...,然后填入Network ID即可

  • 通过docker安装,这里演示使用docker-compose的方式
    创建docker-compose.yml文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: "2.2"

services:
  zerotier:
    image: docker.io/bltavares/zerotier:latest
    restart: unless-stopped
    network_mode: "host"
    privileged: true
    volumes:
      - ./config:/var/lib/zerotier-one

docker-compose up -d启动容器

docker-compose exec zerotier zerotier-cli join [ZeroTier Network ID]执行该命令加入内网,[ZeroTier Network ID]替换为刚刚记下的Network ID

  1. 在将NAS和被管理主机加入内网后,ZeroTier管理页面就能看到了,在左边红框处打勾,稍等片刻后就能在右边看到该主机的内网IP了

  2. 测试内网的互通
    在一台主机上可以ping通另一台IP,内网建立完成

noVNC

  1. 在被控制的主机上安装VNC服务端并设置登录密码,Windows用户可以安装TightVNC,这边不再展开

  2. NAS通过docker的方式部署noVNC

目录结构如下:

1
2
3
4
novnc
 |-- token.conf
 |-- Dockerfile
 |-- docker-compose.yml

新建token.conf文件,[name]: [ip:port]以该格式填入你需要被控制的主机,可以有多个,如:

1
2
vnc1: 172.27.172.240:5900
vnc2: 192.168.1.11:5900

新建Dockerfile文件,内容如下:

1
2
3
4
5
6
7
8
9
FROM docker.io/ubuntu:20.04

RUN apt-get update && apt-get install -y git python3
RUN cd / && git clone https://github.com/novnc/noVNC.git && cd noVNC/utils && git clone https://github.com/novnc/websockify
RUN printf "#!/bin/sh -e \n\
if [ -f /noVNC/token.conf ]; then \n  /noVNC/utils/websockify/run --web /noVNC --target-config=/noVNC/token.conf 6080 \nelse \n\
  /noVNC/utils/websockify/run --web /noVNC 6080 ${REMOTE_HOST:-localhost}:${REMOTE_PORT:-5900} \nfi\n" > entrypoint.sh && chmod +x entrypoint.sh
EXPOSE 6080
CMD ["/entrypoint.sh"]

新建docker-compose.yml,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
version: "2.2"

services:
  novnc:
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    ports:
      - "${HTTP_PORT:-6080:6080}"
    volumes:
      - ./token.conf:/noVNC/token.conf
  1. 运行

在应用目录下,执行docker-compose up -d --build来构建容器并启动
docker-compose restart重启
docker-compose down关闭

  1. 启动后便可以通过浏览器访问[domain]/vnc.html?path=websockify/?token=[name],如http://192.168.1.11/vnc.html?path=websockify/?token=vnc1,更改[name]即可登录不同的主机
    点击“连接”后,输入密码便可以进行远程控制了

至此本教程结束。

扩展阅读

本文GitHub传送门