VNC (SSH)
Вводная: на руках имеется чистый Debian 8 и жгучее желание получить на выходе защищенный vnc-доступ к серверу.
Приступим
Обновим список доступных пакетов.
# apt-get update
Если система свежеустановленная — стоит обновиться.
# apt-get -y upgrade
(!)Бездумно запускать данную команду не на свежеустановленном сервере не стоит, чревато сломанными зависимостями и перспективой работы напильником.
# apt-get install xfce4 xfce4-goodies tightvncserver
Создаем пользователя от которого будем запускать vnc сервер.
# adduser vnc
Устанавливаем sudo (в Debian данный пакет не установлен по умолчанию).
# apt-get install sudo
Добавляем пользователя vnc в группу sudo.
# gpasswd -a vnc sudo
Переходим под пользователя vnc.
# su - vnc
Запускаем vnc сервер.
$ vncserver
Если это первый запуск vnc сервера, будет создан конфиг файл и запрошены некоторые параметры:
$ vncserver
You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? n xauth: file /home/vnc/.Xauthority does not exist New 'X' desktop is my.server:1 Creating default startup script /home/vnc/.vnc/xstartup Starting applications specified in /home/vnc/.vnc/xstartup
Log file is /home/vnc/.vnc/my.server:1.log
по умолчанию порт vnc сервера будет 5901, порт каждого следующего дисплея будет увеличиваться на 1 (5902,5903,...).
Проверить запущен ли VNC сервер и на каком порту слушает можно следующей командой.
$ netstat -nltp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 1054/Xtightvnc
Убить конкретный дисплей можно так:
$ vncserver -kill :1 Killing Xtightvnc process ID 3246
- 1 — какой дисплей нужно убить.
Создание скрипта автостарта vnc сервера.
Сначала убьем запущенный дисплей :1 (если он запущен).
$ vncserver -kill :1
создаем скрипт запуска
$ sudo nano /usr/local/bin/myvnc
Добавляем следующие строки в файл:
#!/bin/bash PATH="$PATH:/usr/bin/" DISPLAY="1" DEPTH="16" GEOMETRY="1024x768" OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"
case "$1" in start) /usr/bin/vncserver ${OPTIONS} ;; stop) /usr/bin/vncserver -kill :${DISPLAY} ;; restart) $0 stop $0 start ;; esac exit 0
если требуется — в скрипте можно изменить глубину цвета или разрешение экрана.
Делаем файл исполняемым.
$ sudo chmod +x /usr/local/bin/myvnc
Использование созданного нами скрипта
$ myvnc start ###запустить vnc сервер $ myvnc stop ###остановить vnc сервер $ myvnc restart ###перезапустить vnc сервер
Теперь нужно позаботиться о том, чтобы настроенный нами vnc стартовал после загрузки сервера (запланированной и не очень).
Для этого создаем файл по следующему пути.
$ sudo nano /lib/systemd/system/myvnc.service
Добавляем следующий текст в файл:
[Unit] Description=MyVnc
[Service] Type=forking ExecStart=/usr/local/bin/myvnc start ExecStop=/usr/local/bin/myvnc stop ExecReload=/usr/local/bin/myvnc restart User=vnc
[Install] WantedBy=multi-user.target
Пояснение [Unit] — указываем описание скрипта (так же можно указать требуемые зависимости и порядок запуска при загрузке).
[Service] — указываем какими командами запускать сервис, под каким пользователем, и тип сервиса.
[Install] — указываем на каком уровне должен запускаться скрипт (runlevel 3 — многопользовательский режим без графики).
Включаем юнит в автозагрузку при старте системы.
$ sudo systemctl enable myvnc.service Created symlink from /etc/systemd/system/multi-user.target.wants/myvnc.service to /lib/systemd/system/myvnc.service.
Смотрим статус созданного нами юнита.
$ sudo systemctl -l status myvnc.service ? myvnc.service - MyVnc Loaded: loaded (/lib/systemd/system/myvnc.service; enabled) Active: inactive (dead)
Дергаем systemd для поиска новых или измененных юнитов.
$ sudo systemctl daemon-reload
Шифрование трафика
Голый VNC не шифрует трафик, и оставлять его в таком виде не стоит. Кроме того, если на Ваш IP выйдут боты из Китая и начнут стучатся по портам, даже если пароль установлен действительно качественный (учтите, что пароль на vnc сессию ограничен 8 символами) и его не взломают, попасть на сервер посредством VNC будет затруднительно, из-за постоянной ошибки на количество неверных попыток авторизации.
vncpasswd
$ vncpasswd Using password file /home/vnc/.vnc/passwd Password: Warning: password truncated to the length of 8. Verify: Would you like to enter a view-only password (y/n)? n
Пускаем VNC поверх SSH
$ sudo nano /usr/local/bin/myvnc
Изменяем строку:
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"
на
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost"
Теперь для подключения к серверу сначала нужно создать тунель.
Под *nix:
# ssh [email protected] -L 5901:localhost:5901
Теперь возможно подключение посредством vnc клиента, указав вместо IP удаленного сервера localhost и порт на котором слушает vnc-server.
# vncviewer localhost:5901
При использовании Windows и putty агента
После запуска putty переходим Connection -> SSH -> Tunnels. В поле Source Port вбиваем порт на котором слушает VNC сервер — 5901, в поле Destination вписываем — localhost:5901 и жмем кнопку Add. должно получиться как на картинке
Теперь возвращаемся на вкладку Session вписываем IP сервера и порт 22 (тут же можно и сохранить конфигурацию подключения), жмем Open.
К осторожности нужно приучать сразу, хоть теперь и попасть на наш сервер посредством VNC извне невозможно (для начала нужно залогиниться по ssh и создать тунель), все же стоит задуматься о дополнительной безопасности ssh подключений (помните — китайские боты не дремлют).