Да, отчего-то не все клиенты хотят работать в таком удобном и черном терминале, панель полностью не удовлетворяет их эстетические потребности, и вообще — «где мой такой любимый и удобный VNC?».
В данной статье будет рассмотрен пример установки и настройки VNC server и графической оболочки (GUI) на примере OC Debian 8 jessie.
Вводная: на руках имеется чистый Debian 8 и жгучее желание получить на выходе защищенный vnc-доступ к серверу.
Приступим
Обновим список доступных пакетов.
# apt-get update
Если система свежеустановленная — стоит обновиться.
# apt-get -y upgrade
(!)Бездумно запускать данную команду не на свежеустановленном сервере не стоит, чревато сломанными зависимостями и перспективой работы напильником.
Устанавливаем Xfce и VNC server (любители GNOME, KDE, LXDE, etc. устанавливают оболочку по своему вкусу).
# 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 — многопользовательский режим без графики).
[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
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 vnc@xxx.xxx.xxx.xxx -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.
Установим и настроим fail2ban.
По умолчанию защита от брутфорса для SSH включена, что нам собственно и требуется.
при превышении заданного числа неудачных вводов пароля подряд (по умолчанию — 6) бан IP, с которого были попытки подбора на заданное время (по умолчанию — 600 секунд).
Устанавливаем пакет из репозитория.
$ sudo apt-get install fail2ban
Основной интересующий нас файл настроек находится по пути /etc/fail2ban/jail.conf
Блок настроек для подключения по ssh:
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
Синтаксис
ignoreip — IP адреса, которые не должны быть заблокированы. Можно задать список IP адресов разделённых пробелами, маску подсети, или имя DNS сервера.
bantime — время бана в секундах, по истечении которого IP адрес удаляется из списка заблокированных.
maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте ssh — это число неудавшихся попыток логина, после которых происходит блокировка.
enabled — значение true указывает что данный jail активен, false выключает действие изолятора.
port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH сервера — 22, или его буквенное наименование — ssh.
filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.
logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log файл /var/log/auth.log.
bantime — время бана в секундах, по истечении которого IP адрес удаляется из списка заблокированных.
maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте ssh — это число неудавшихся попыток логина, после которых происходит блокировка.
enabled — значение true указывает что данный jail активен, false выключает действие изолятора.
port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH сервера — 22, или его буквенное наименование — ssh.
filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.
logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log файл /var/log/auth.log.
Дефолтная настройка удовлетворяет наши требования (6 неверных попыток авторизации по shh и IP летит в бан на 600 секунд), но я бы советовал добавить свой IP в доверенный список.
Обидно будет ждать почти два часа, в случае шестикратной ошибки ввода пароля со своего IP (шанс данного кейса отнюдь не нулевой).
Открываем конфиг файл.
$ sudo nano /etc/fail2ban/jail.conf
В строке ignoreip = 127.0.0.1/8, адрес 127.0.0.1/8 заменяем на свой IP.
ignoreip = Your.IP
Выходим из редактора nano (ctrl+x, отвечаем y на вопрос сохранения внесенных изменений).
Перегружаем сервис для применения изменений в правилах.
$ sudo service fail2ban restart
В случае срабатывания бана в логах fail2ban, можно заметить строку предупреждения:
$ sudo tail -100 /var/log/fail2ban.log | less
2015-12-17 09:08:54,894 fail2ban.actions[7496]: WARNING [ssh] Ban
И попытки подключения с данного адреса будут отбиваться сервером автоматически до истечения срока бана.
bash-3.2# ssh my.vnc -l vnc
ssh: connect to host 37.48.90.203 port 22: Connection refused
Готово, настройка VNC сервера завершена.
Комментарии (15)
hungry_ewok
18.12.2015 00:41+2Клиент vnc есть практически под всё.
Клиент x2go под, например, андроид сходу как-то не находится.
n01d
18.12.2015 07:36+1Есть x11vnc и к нему клиент ssvnc под Windows/Unix/Mac.
Использовали именно его при необходимости настройки подключения с виндовых компьютеров к линуксовым.
Очень понравилась возможность подключаться, сразу создавая себе отдельный дисплей, не мешая пользователю.
Himura
18.12.2015 09:54+1Отличная всеобъемлющая инструкция, которая даже помогает немного лучше понять пути решения многих проблем, иногда возникающих. Спасибо.
3vi1_0n3
18.12.2015 12:18(!)Бездумно запускать данную команду не на свежеустановленном сервере не стоит, чревато сломанными зависимостями и перспективой работы напильником.
Вы с Убунту не перепутали? В стабильной ветке Дебиана такое очень маловероятно, тем более на свежеустановленном сервере, где список пакетов инсталлер умеет обновлять прямо во время установки и, соответственно, ставит свежие пакеты.
ValdikSS
18.12.2015 15:19+1Зачем вам скрипт, когда вы и так пишите systemd unit? Сделали бы что-то вроде:
[Unit] Description=Remote desktop service (VNC) After=syslog.target network.target [Service] Type=forking User=sharer Environment=HOME=/home/sharer ExecStartPre=-/usr/bin/vncserver -kill :1 ExecStart=/usr/bin/vncserver -geometry 1280x720 -dpi 96 -localhost -nolisten tcp ExecStop=/usr/bin/vncserver -kill :1 [Install] WantedBy=multi-user.target
inkvizitor68sl
Во-первых, есть x2go.
Во-вторых, есть x2go и vnc не нужен.
n1nj4p0w3r
xrdp звучит лучше, у него как минимум клиенты на всех популярных платформах есть.
да и vnc нужен хотя-бы из-за простоты реализации благодаря которой он доступен практически сразу для всех платформ в т.ч., а если там браузер хоть сколь-нибудь современный, то доступен сразу благодаря noVNC.
mihmig
Что vnc, что xrdp — в них уже работу клавиатуры
починилисделали нормальной? (Я имею в виду нормальную работу с двумя раскладками и их переключение)n1nj4p0w3r
Вы уверены что вопрос касается xrdp, а не конкретной реализации клиента?
mihmig
Уверен. Если при подключении с помощью mstsc.exe у Windows-серверу всё работает, а при подключении к linux+xrdp не работает банальное переключение раскладки клавиатуры, то да — вопрос к xrdp.
Я вижу аналогию с Wine (Ethersoft, CrossOver и иже с ними) — худо-бедно запускающаяся RDP-сессия показывает рабочий стол пользователя, даже «потыкать» можно. А вот если в продакшене работать надо — пожалуйста — вот коммерческий продукт.
n1nj4p0w3r
Вы хоть дистрибутив и DE укажите, что-бы посмотреть.
mihmig
Пробовал на Ubuntu 14.04 (XFCE) пе первому попавшемуся мануалу:
apt-get -y install xrdp
Если у Вас есть интерес чтоб помочь/показать — то буду безмерно рад продолжить общение в ЛС/skype
P.S. Прошу прощения за попытку «троллига» выше — просто не могу перешагнуть пропасть между «в линуксе можно по RDP» и «вот смотрите — работает»
n1nj4p0w3r
Для всех кто хочет попробовать, проверялось на ubuntu 14.04.3(но обещают, что будет работать на любой современной deb-based):
sudo su
apt-get install xubuntu-desktop xvfb git
git clone https://github.com/scarygliders/X11RDP-o-Matic.git
cd X11RDP-o-Matic
# Процедура долгая, собирает актуальные xrdp и x11rdp из исходников
./X11rdp-o-matic.sh --justdoit
# Необходимо как минимум одного юзера настроить, т.к. скрипт вносит довольно большие изменения в /etc/xrdp/xrdp.ini для работы через x11rdp
./RDPsesconfig.sh
После этого ребутаемся и пробуем зайти под настроенным юзером
В отличии от использования xvnc бекэнда проблем со сменой раскладки клавиатуры нет, сессии «липкие», так-что при отвале соединения пользователь подключается к уже существующей сессии
Так-же X11rdp-o-matic.sh может просто собрать пакеты
d7s2di
Поддерживаю. X2go гораздо толковее: например, поддерживает изменение разрешение с клиентской стороны без плясок с бубном вокруг версии и реализации vnc (привет, tightvnc). И я уж не говорю про такие полезные штуки, как проброс звука и принтеров.