VNC 개요
VNC(Virtual Network Computing)은 원격 네트워크 제어를 위한 소프트웨어 세트입니다. 네트워크 제어 기술은 한 컴퓨터(컨트롤러)가 다른 컴퓨터(피어)를 제어하는 것을 의미하며, 컨트롤러가 작업할 때 마치 피어 앞에서 직접 작업하는 것처럼 피어의 애플리케이션을 실행하고 시스템 자원을 사용할 수 있습니다.
VNC 소프트웨어는 두 가지 주요 구성 요소로 구성됩니다: VNC 서버와 VNC 뷰어 클라이언트.
- 피어 컴퓨터에 VNC 서버를 설치한 후 컨트롤러에서 VNC 뷰어 클라이언트로 피어를 제어할 수 있습니다.
- VNC 서버와 VNC 뷰어 클라이언트는 Unix 계열, Windows 및 macOS와 같은 다양한 운영 체제를 지원하므로, 서로 다른 운영 체제에 VNC 서버와 뷰어를 설치하여 제어할 수 있습니다.
- 현재 컨트롤러 컴퓨터에 VNC 뷰어가 설치되지 않은 경우, 일반적인 웹 브라우저를 통해 접근하여 피어를 제어할 수 있습니다.
전체 VNC 작동 프로세스
- VNC 클라이언트는 브라우저나 VNC 뷰어 클라이언트를 통해 VNC 서버에 연결합니다.
- VNC 서버는 연결 암호와 VNC 서버 디스플레이 장치를 요청하는 대화 상자를 전송합니다.
- 클라이언트가 연결 암호를 입력하면 VNC 서버는 클라이언트가 액세스 권한을 가지고 있는지 확인합니다.
- VNC 서버의 인증을 통과한 후, 클라이언트는 즉시 VNC 서버의 데스크탑 환경을 요청합니다.
- VNC 서버는 얻은 데스크탑 환경을 VNC 통신 프로토콜을 통해 클라이언트에 전송하고, 클라이언트가 VNC 서버의 데스크탑 환경과 입력 장치를 제어할 수 있도록 합니다.
무료 VNC 도구
TigerVNC
TightVNC
RealVNC의 VNC 뷰어 클라이언트
예시 - CentOS 7.5에 VNC 서버 설치 및 설정
1- 시스템 환경 확인
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/system-release
CentOS Linux release 7.5.1804 (Core)
2- VNC 서버 설치
VNC 서버가 설치되어 있는지 확인하고, 설치되지 않은 경우 해당 rpm 패키지를 찾아 설치합니다.
yum -y install tigervnc-server tigervnc # VNC 서버 및 뷰어 설치
설치 완료:
[root@localhost ~]# rpm -qa |grep vnc
tigervnc-license-1.8.0-5.el7.noarch
tigervnc-1.8.0-13.el7.x86_64
tigervnc-icons-1.8.0-13.el7.noarch
tigervnc-server-minimal-1.8.0-5.el7.x86_64
gtk-vnc2-0.7.0-3.el7.x86_64
tigervnc-server-1.8.0-13.el7.x86_64
gvnc-0.7.0-3.el7.x86_64
[root@localhost ~]#
3- VNC 서버 설정
VNC 서버는 다양한 설정을 지원합니다:
- 단일 사용자 단일 인터페이스 설정(한 사용자가 접근, 하나의 인터페이스 사용)
- 다중 사용자 단일 인터페이스 설정(여러 사용자가 접근, 동일한 인터페이스 사용)
- 다중 사용자 다중 인터페이스 설정(여러 사용자가 접근, 각각의 인터페이스 사용)
구성 파일 생성 및 수정(단일 사용자 단일 인터페이스)
[root@localhost ~]# cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service
[root@localhost ~]# ll /etc/systemd/system/vncserver@.service
-rw-r--r-- 1 root root 1828 Jun 21 11:08 /etc/systemd/system/vncserver@.service
[root@localhost ~]#
[root@localhost ~]# vim /etc/systemd/system/vncserver@.service
[root@localhost ~]# cat /etc/systemd/system/vncserver@.service |grep -v "#"
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=root
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l UserA -c "/usr/bin/vncserver %i -geometry 1920x1080"
PIDFile=/home/UserA/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target
[root@localhost ~]#
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]#
참고
- 서비스 시작 사용자를 root로 설정하면 VNC 클라이언트가 메뉴 바를 볼 수 있습니다.
- 사용자는 UserA이며, 연결 시 UserA의 인터페이스에 로그인합니다.
이 예제에서는 단일 사용자 단일 인터페이스 설정만 설명합니다. 다중 사용자 단일 인터페이스 방식(다중 사용자가 동시에 접근)을 원하는 경우, 위의 "vncserver@:1.service"을 "vncserver@:2.service"로 변경하고 사용자 이름, 해상도 등의 매개변수를 구성한 후 다음 단계를 수행하면 됩니다. 다중 사용자 다중 인터페이스를 구성하려면 공식 정보를 참조하십시오: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-tigervnc
암호 설정
사용자 암호를 설정합니다. 이 단계에서는 구성 파일에 정의된 사용자인 UserA를 사용합니다. 주의: 이 단계는 사용자를 전환해야 합니다.
[root@localhost ~]# su - UserA
Last login: Fri Jun 21 11:25:07 CST 2019 on pts/0
[UserA@localhost ~]$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[UserA@localhost ~]$
VNC 서비스 시작 및 자동 시작 설정
[root@localhost ~]# systemctl start vncserver@:1.service
[root@localhost ~]# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@.service.
[root@localhost ~]#
VNC 서비스 상태 확인
[root@localhost ~]# systemctl status vncserver@:1.service -l
● vncserver@:1.service - Remote desktop service (VNC)
Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2019-06-21 13:15:55 CST; 18min ago
Main PID: 6556 (Xvnc)
CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
‣ 6556 /usr/bin/Xvnc :1 -auth /home/UserA/.Xauthority -desktop localhost.localdomain:1 (UserA) -fp catalogue:/etc/X11/fontpath.d -geometry 1920x1080 -pn -rfbauth /home/UserA/.vnc/passwd -rfbport 5901 -rfbwait 30000
Jun 21 13:15:51 localhost.localdomain systemd[1]: Starting Remote desktop service (VNC)...
Jun 21 13:15:55 localhost.localdomain systemd[1]: Started Remote desktop service (VNC).
[root@localhost ~]#
방화벽 설정
방법1: 방화벽 종료 및 부팅 시 자동 시작 해제
systemctl stop firewalld && systemctl disable firewalld
firewalld가 실행 중인지 확인:
[root@localhost ~]# firewall-cmd --state
not running
방법2: 방화벽에서 VNC 서비스 열기
$ firewall-cmd --permanent --add-service vnc-server
success
$ firewall-cmd --reload
5- 기타 정보
사용자 구성 파일
[UserA@localhost ~]$ ll -a .vnc
total 28
drwxrwxr-x 2 UserA UserA 120 Jun 21 13:15 .
drwx------. 20 UserA UserA 4096 Jun 21 13:44 ..
-rw-r--r-- 1 UserA UserA 332 Jun 21 13:15 config
-rw-rw-r-- 1 UserA UserA 4619 Jun 21 13:41 localhost.localdomain:1.log
-rw-rw-r-- 1 UserA UserA 5 Jun 21 13:15 localhost.localdomain:1.pid
-rw------- 1 UserA UserA 8 Jun 21 11:26 passwd
-rwxr-xr-x 1 UserA UserA 112 Jun 21 13:15 xstartup
[UserA@localhost ~]$
일부 명령어
[UserA@localhost ~]$ vncserver -h
usage: vncserver [:<number>] [-name <desktop-name>] [-depth <depth>]
[-geometry <width>x<height>]
[-pixelformat rgbNNN|bgrNNN]
[-fp <font-path>]
[-cc <visual>]
[-fg]
[-autokill]
[-noxstartup]
[-xstartup <file>]
<Xvnc-options>...
vncserver -kill <X-display>
vncserver -list
[UserA@localhost ~]$
[UserA@localhost ~]$ vncpasswd -h
usage: vncpasswd [file]
vncpasswd -f
[UserA@localhost ~]$
VNC 서비스 프로세스 중지
[UserA@localhost ~]$ vncserver -list
TigerVNC server sessions:
X DISPLAY # PROCESS ID
:1 6556
[UserA@localhost ~]$
[UserA@localhost ~]$ vncserver -kill :1
Killing Xvnc process ID 6556
[UserA@localhost ~]$
[UserA@localhost ~]$ vncserver -list
TigerVNC server sessions:
X DISPLAY # PROCESS ID
[UserA@localhost ~]$
VNC 뷰어 클라이언트를 사용하여 원격 연결
- Linux에서 vncviewer 명령을 실행하면 됩니다. 서버 주소는 192.168.1.11:1과 같이 작성합니다.
- Windows에서 Windows 버전의 vncviewer 클라이언트 프로그램을 실행하면 됩니다. Linux와 유사한 방법을 사용합니다.
- 브라우저를 통해 원격 연결도 가능하지만, 구성이 다소 복잡하여 일반적으로 사용하지 않습니다.
vncserver가 실행 중인지 확인
[UserA@localhost ~]$ vncserver -list
TigerVNC server sessions:
X DISPLAY # PROCESS ID
:1 1390
[UserA@localhost ~]$
Tiger VNC Viewer로 연결
다운로드 - Windows-64bit: https://bintray.com/tigervnc/stable/download_file?file_path=vncviewer64-1.9.0.exe
문제 해결
문제-1
문제 현상: vncserver 서비스 시작 시 오류 발생
[root@localhost ~]# systemctl start vncserver@:1.service
Job for vncserver@:1.service failed because the control process exited with error code. See "systemctl status vncserver@:1.service" and "journalctl -xe" for details.
[root@localhost ~]#
[root@localhost ~]# systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
Loaded: loaded (/etc/systemd/system/vncserver@.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2019-06-21 13:07:28 CST; 2min 14s ago
Process: 6104 ExecStart=/usr/sbin/runuser -l UserA -c /usr/bin/vncserver %i -geomotry 1920x1080 (code=exited, status=255)
Process: 6095 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: must supply to access the server (default=)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: rfbauth - Alias for PasswordFile
Jun 21 13:07:28 localhost.localdomain runuser[6104]: PasswordFile - Password file for VNC authentication (default=)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: SecurityTypes - Specify which security scheme to use (None, VncAuth, Plain,
Jun 21 13:07:28 localhost.localdomain runuser[6104]: TLSNone, TLSVnc, TLSPlain, X509None, X509Vnc, X509Plain)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (default=TLSVnc,VncAuth)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (EE)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: Fatal server error:
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (EE) Unrecognized option: -geomotry
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (EE)
[root@localhost ~]#
문제 해결
오류 메시지 "Unrecognized option: -geomotry"를 보면 구성 매개변수가 잘못되었음을 확인하고, 올바른 구성 " -geometry"로 수정하면 됩니다.
관련 디렉토리 파일 삭제: rm -rf /tmp/.X11-unix/.
문제-2
문제 현상
Tiger VNC Viewer가 CentOS7.5 시스템의 VNC 서버에 연결할 때 다음 메시지가 표시됩니다:
Authentication Required
Authentication is required to create a color profile.
문제 해결
/etc/polkit-1/rules.d/에 해당 rules 파일을 추가합니다.
[UserA@localhost ~]$ su - root
Password:
Last login: Mon Jun 24 10:36:25 CST 2019 on pts/0
[root@localhost ~]#
[root@localhost ~]# cd /etc/polkit-1/rules.d/
[root@localhost rules.d]# ll
total 12
-rw-r--r--. 1 root root 974 Jun 10 2014 49-polkit-pkla-compat.rules
-rw-r--r--. 1 root root 326 Apr 30 2013 50-default.rules
-rw-r--r-- 1 root root 547 Jun 24 10:50 gnome-vnc.rules
[root@localhost rules.d]# cat gnome-vnc.rules
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.color-manager.create-device" ||
action.id == "org.freedesktop.color-manager.create-profile" ||
action.id == "org.freedesktop.color-manager.delete-device" ||
action.id == "org.freedesktop.color-manager.delete-profile" ||
action.id == "org.freedesktop.color-manager.modify-device" ||
action.id == "org.freedesktop.color-manager.modify-profile") &&
subject.isInGroup("UserA")) {
return polkit.Result.YES;
}
});
[root@localhost rules.d]#
참고 정보
- https://wiki.archlinux.org/index.php/TigerVNC#"Authentication_is_required_to_create_a_color_managed_device"_dialog_when_launching_GNOME_3
- https://unix.stackexchange.com/questions/417906/authentication-is-required-to-create-a-color-profile
- https://c-nergy.be/blog/?p=12073
예시: RedHat Linux 5 엔터프라이즈 버전에서 VNCSREVER 설정
VNCSERVER 확인 및 설치
서버에 VNCSERVER가 구성되어 있는지 확인합니다.
[root@localhost: ~]#rpm -qa |grep vnc
vnc-4.1.2-14.el5
vnc-server-4.1.2-14.el5
VNCSERVER 서버 버전이 반환되어 VNCSERVER가 설치되었음을 나타냅니다. VNCSERVER가 설치되지 않은 경우, 설치 패키지를 찾아 설치합니다.
VNCSERVER 설정
첫 번째로 VNCSERVER를 시작할 때 암호를 입력하라는 메시지가 표시됩니다. 이는 관리자 계정과 일반 계정으로 나뉘며, 시작 방식은 약간 다릅니다. 관리자:
[root@localhost /]# VNC Server
You will require a password to access your desktops.
Password: 123456 #VNC 연결 암호 입력
Verify: 123456 #VNC 암호 확인
xauth: creating new authority file /root/.Xauthority
New ‘localhost.localdomain:1 (root)’ desktop is localhost.localdomain:1
Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/localhost.localdomain:1.log
일반 사용자:
[root@localhost /]#su userB #userB는 사용자 이름
[userB@localhost /]$ VNC Server
You will require a password to access your desktops.
Password: 123456 #VNC 연결 암호 입력
Verify: 123456 #VNC 암호 확인
xauth: creating new authority file /home/userB/.Xauthority
New ‘localhost.localdomain:2 (userB)’ desktop is localhost.localdomain:2
Creating default startup script /home/userB/.vnc/xstartup
Starting applications specified in /home/userB/.vnc/xstartup
Log file is /home/userB/.vnc/localhost.localdomain:2.log
참고:
- 각 사용자는 자신의 VNCSERVER 원격 데스크탑을 시작할 수 있으며, 각 사용자는 여러 개의 VNCSERVER 원격 데스크탑을 시작할 수 있습니다. 이들은 IP와 포트 번호: IP:1, IP:2, IP:3으로 구분되며, 동일한 포트 번호를 사용하면 다른 사용자가 자동으로 로그아웃됩니다.
- VNCSERVER의 대부분의 구성 파일 및 로그 파일은 사용자의 홈 디렉토리 아래 .vnc 디렉토리에 있습니다.
사용자는 시작 번호를 자체적으로 설정할 수 있습니다:
[userB@localhost /]$ VNC Server :2 #주의:2 앞에는 공백이 있어야 합니다.
A VNC Server is already running as :2
관련 데스크탑 설정
GNOME 데스크탑
RedHat Linux는 KDE 모드와 GNOME 모드의 두 가지 그래픽 모드를 지원합니다.
ps -A 명령어로 현재 실행 중인 모든 프로그램을 목록화하고, KDE 또는 GNOME 필드로 판단합니다.
GNOME 데스크탑인 경우 /root/.vnc/xstartup 구성 파일을 수정해야 합니다.
[root@localhost .vnc]# vi xstartup
#!/bin/sh
# 주석을 해제하여 일반 데스크탑을 시작합니다:
# unset SESSION_MANAGER #이 줄의 주석을 제거
# exec /etc/X11/xinit/xinitrc #이 줄의 주석을 제거
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80×24+10+10 -ls -title "$VNCDESKTOP Desktop" &
gnome-session gnome #이 줄을 추가하여 GNOME 데스크탑 환경을 사용합니다
twm &
설정 수정 후 재시작이 필요합니다. 그렇지 않으면 설정이 적용되지 않습니다. 방법은 VNCSERVER 프로세스를 종료한 후 VNCSERVER를 다시 실행하는 것입니다.
[root@localhost .vnc]# VNC Server -kill :1 #1은 VNCSERVER를 시작할 때의 포트 번호입니다
[root@localhost .vnc]# VNC Server :1 #재시작, 주의:1 앞에는 공백이 있어야 합니다.
사용자 정보 및 해상도 설정
/etc/sysconfig/VNC Servers 구성 파일을 수정합니다.
[root@localhost: ~]#vi /etc/sysconfig/VNC Servers
# VNCSERVERS 변수는 디스플레이:사용자 쌍의 목록입니다.
#
# 다음 줄을 주석 해제하여 디스플레이 :2에서 VNCSERVER를 시작합니다.
# ‘myusername’으로 변경하세요(자신의 이름으로 변경해야 합니다). 또한,
# VNC 암호를 설정해야 하며, ‘man vncpasswd’를 실행하여 어떻게 하는지 확인할 수 있습니다.
#
# 로컬 영역 네트워크가 신뢰할 수 없는 경우 이 서비스를 실행하지 마세요. VNC를 안전하게 사용하는 방법은
# <URL:http://www.uk.research.att.com/archive/vnc/sshvnc.html >를 참조하십시오.
# "-nolisten tcp"를 사용하여 TCP를 통해 VNCSERVER에 X 연결을 방지합니다.
# "-nohttpd"를 사용하여 웹 기반 VNC 클라이언트가 연결하는 것을 방지합니다.
# "-localhost"를 사용하여 안전한 터널을 통해 연결하지 않는 한 원격 VNC 클라이언트가 연결하는 것을 방지합니다. `man vncviewer` 매뉴얼 페이지의 "-via" 옵션을 참조하십시오.
VNCSERVERS="1:root 2:userB" #여기서 root와 userB 두 사용자를 추가했습니다.
VNCSERVERARGS[1]="-geometry 1024×768 -nolisten tcp -nohttpd -localhost" VNCSERVERARGS[2]="-geometry 1920×1080 -nolisten tcp -nohttpd -localhost"
참고: 위는 root와 userB 두 사용자의 해상도를 별도로 설정한 것입니다. 포트 번호로 구분됩니다. 명령줄을 통해 임시로 해상도 및 색 깊이를 수정할 수도 있으며, 이 방법은 재시작 후 손실됩니다. 명령어는 다음과 같습니다:
[root@localhost: ~]# VNC Server -geometry 1024×768 #VNC Server의 해상도 설정
[root@localhost: ~]# VNC Server -depth 24 #VNC Server의 색 깊이 설정
클라이언트 연결
접근 방법
- Linux에서 vncviewer 명령을 실행하면 됩니다. 서버 주소는 192.168.1.11:1과 같이 작성합니다.
- Windows에서 Windows 버전의 vncviewer 클라이언트 프로그램을 실행하면 됩니다. Linux와 유사한 방법을 사용합니다.
- 브라우저를 통해 원격 연결도 가능하지만, 구성이 다소 복잡하여 일반적으로 사용하지 않습니다.
주요 운영
- 암호 변경: vncpasswd 명령을 실행하면 됩니다.
- VNC 서버 중지: 명령어는
VNC Server -kill :1과 같으며, VNC Server는 시작한 사용자만 종료할 수 있습니다. - 안정성 설정: 여러 클라이언트가 동일한 VNC Server 디스플레이 포트에 연결할 때, VNC Server는 기존 연결을 종료하고 새 연결을 위해 포트를 제공합니다. "-dontdisconnect"를 사용하여 새 연결 요청을 거부하고 기존 연결을 유지할 수 있습니다.
- 동일한 디스플레이는 여러 클라이언트에 연결할 수 있습니다:
VNC Server -alwaysshared - 서비스 재시작:
service VNC Server restart - VNC 서버 자동 시작: VNC 연결로 RedHat Linux 그래픽 인터페이스에 로그인한 후, "시스템" → "관리" → "서버 설정" → "서비스"로 이동하여 "백그라운드 서비스"에서 VNC Server를 선택하고 저장하면 됩니다.