Мультисессионный VNC на CentOs 7 или делаем из Linux почти терминальник

VNC — система удалённого доступа к рабочему столу компьютера, использующая протокол RFB. Управление осуществляется путём передачи нажатий клавиш на клавиатуре и движений мыши с одного компьютера на другой и ретрансляции содержимого экрана через компьютерную сеть. Лично я считаю что этот протокол незаслуженно обходят стороной. Попробуем хоть немного устранить этот недостаток.
Итак, первым делов устанавливаем необходимые зависимости и сам VNC-сервер

# yum -y groupinstall "GNOME Desktop"
# yum -y install tigervnc-server

Рассмотрим пример с добавлением трёх пользователей. Собственно создаём их в системе

# useradd user1
# useradd user2
# useradd user3

Следующий шаг — создание сценарием запуска отдельного экземпляра для каждого пользователя

# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:2.service
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:3.service

Приводим конфиги к такому виду. Единственное что изменилось — логин пользователя
user1

# cat /etc/systemd/system/vncserver@:1.service | grep -v "#" | grep -v ^$
[Unit]
Description=Remote desktop service (VNC) for user1
After=syslog.target network.target
[Service]
Type=forking
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l user1 -c "/usr/bin/vncserver %i"
PIDFile=/home/user1/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target

user2

# cat /etc/systemd/system/vncserver@:2.service | grep -v "#" | grep -v ^$
[Unit]
Description=Remote desktop service (VNC) for user2
After=syslog.target network.target
[Service]
Type=forking
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l user2 -c "/usr/bin/vncserver %i"
PIDFile=/home/user2/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target

user3

# cat /etc/systemd/system/vncserver@:3.service | grep -v "#" | grep -v ^$
[Unit]
Description=Remote desktop service (VNC) for user3
After=syslog.target network.target
[Service]
Type=forking
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l user3 -c "/usr/bin/vncserver %i"
PIDFile=/home/user3/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target

Теперь для каждого пользователя установим пароль на учетку и пароль для подключения к VNC-серверу
user1

# su - user1
$ passwd
Changing password for user user1.
Changing password for user1.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
$ vncpasswd
Password:
Verify:
# exit

user2

# su - user2
$ passwd
Changing password for user user2.
Changing password for user2.
(current) UNIX password:
New password:
Retype new password:
$ vncpasswd
Password:
Verify:
# exit

user3

# su - user3
$ passwd
Changing password for user user3.
Changing password for user3.
(current) UNIX password:
New password:
Retype new password:
$ vncpasswd
Password:
Verify:
# exit

Добавляем в автозагрузку

# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@:1.service.
# systemctl enable vncserver@:2.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:2.service to /etc/systemd/system/vncserver@:2.service.
# systemctl enable vncserver@:3.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:3.service to /etc/systemd/system/vncserver@:3.service.

и стартуем

# systemctl start vncserver@:1.service
# systemctl start vncserver@:2.service
# systemctl start vncserver@:3.service

Проверим как это дело запустилось

# netstat -lntpu | grep vnc
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      4394/Xvnc
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN      5118/Xvnc
tcp        0      0 0.0.0.0:5903            0.0.0.0:*               LISTEN      6033/Xvnc
tcp        0      0 0.0.0.0:6001            0.0.0.0:*               LISTEN      4394/Xvnc
tcp        0      0 0.0.0.0:6002            0.0.0.0:*               LISTEN      5118/Xvnc
tcp        0      0 0.0.0.0:6003            0.0.0.0:*               LISTEN      6033/Xvnc
tcp6       0      0 :::5901                 :::*                    LISTEN      4394/Xvnc
tcp6       0      0 :::5902                 :::*                    LISTEN      5118/Xvnc
tcp6       0      0 :::5903                 :::*                    LISTEN      6033/Xvnc
tcp6       0      0 :::6001                 :::*                    LISTEN      4394/Xvnc
tcp6       0      0 :::6002                 :::*                    LISTEN      5118/Xvnc
tcp6       0      0 :::6003                 :::*                    LISTEN      6033/Xvnc

Отлично, сервисы запустились и готовы к соединению.
Завершающим шагом будет открытие портов в фаерволе

# firewall-cmd --permanent --zone=public --add-service vnc-server
# firewall-cmd --reload

Всё, можно соединяться и работать почти как за терминальным сервером, только с линукс.
На всякий случай скажу, что на Linux есть 1С-Предприятие и софт бесплатный. То есть если хотите что бы всё было прозрачно и честно, то стоит приобрести только ключик и пользоваться. Так, планы на будущее.

Добавить комментарий