之前在组里面服务器上跑一些需要带界面信号的程序,老是有一些小细节要调试一下,今天系统的记录一下,方便后续查询。

背景是只对外暴露ssh22的端口,其他端口不可用,看一下大体过程,

  • 可以是产生信号,通过ssh端口转发到app,app直接显示,如MobaXterm的Xserver功能
  • 可以是带界面系统通过vncserver,再经过ssh端口转发vnc的590x信号,由界面程序展示,如PRemoteM功能
  • 可以是带界面系统通过vncserver,再经过ssh端口转发vnc的590x信号到另一个linux上面,另一个linux通过novnc提供server,最后客户端使用浏览器展示。

如果main server还有其他端口可用,可以直接在main server跑novnc,方便很多,过程相似不在此展开。

vncserver

安装

1
apt install tightvncserver

使用

使用vncservervncserver :1可以开启界面和vnc服务,端口会从5901依次往上加,

  • 注意:
    • 第一次启动会让输入密码,还会问是否设置view-only只可观察的密码,如果选择是,不要和前面那个密码设置一样,可能有奇奇怪怪问题
    • 如果配置/root/.vnc/xstartup~/.vnc/xstartup,里面要配置正确,如必须要启动一个界面,如xxx或xxxsession,没有的话要安装,否则不能完整启动,后续操作可能无法正常显示,
    • 比如:建了~/.vnc/xstartup,但是文件为空,则不能正确启动;比如配置文件里面没有启动界面的命令,也是无法启动的。
    • 如果默认使用/root/.vnc/xstartup,可以把~/.vnc/xstartup删掉。
    • 如果打开为全灰,可以等一会看看能不能连上,如果一直连不上可以看看配置文件有没有错误,比如是否启动界面进程。

其他

  • 停止使用vncserver -kill :1
  • 修改密码vncpasswd

ssh proxy

这个桥建立在转发的server上,即上面蓝色的服务器

记得提前保存登录密钥

1
2
ssh -L vnc云端端口:127.0.0.1:vnc映射到本地端口 -N -f -l 云端用户名 云端ip -p 云端ssh端口
ssh -L 5902:127.0.0.1:5902 -N -f -l zzr sun.host.zlogs.net -p 22

查看建立情况

1
ps aux | grep ssh

novnc

1
nohup ./novnc_proxy --vnc localhost:5902  &
  • 注意需要提前配置python环境
  • 如果暴露在公网,使用--listen 127.0.0.1:6080 的话可能会有些问题,可以--listen :6080或者--listen 公网ip:6080--listen 0.0.0.0:6080试试

误启动到后台,可以使用ps aux | grep novnc查看pid

direct-browser

如果不配置nginx代理的话

  • 打开 http://公网ip:6080/vnc.html
  • 加密:如果没有配置加密证书的话,加密不要勾选加密
  • 主机:公网ip
  • 端口:6080
  • 路径:不变

nginx-browser

如果配置反向代理到443或者80的话,需要把6080代理到80端口

  • 注意,/websockify要单独代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#PROXY-START/
location /websockify {
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:6080;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# VNC connection timeout
proxy_read_timeout 61s;

# Disable cache
proxy_buffering off;
}

location ~* \.(gif|png|jpg|css|js|woff|woff2)$
{
proxy_pass http://127.0.0.1:6080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
expires 12h;
}
location /
{
proxy_pass http://127.0.0.1:6080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;

add_header X-Cache $upstream_cache_status;

#Set Nginx Cache

add_header Cache-Control no-cache;
}

#PROXY-END/
  • 打开 http://公网ip:80/vnc.html (或复制vnc.html为index.html 后可以访问http://公网ip)
  • 加密:如果没有配置加密证书的话,加密不要勾选加密
  • 主机:公网ip
  • 端口:80
  • 路径:不变