Что означает ошибка "Connection refused" в VNC
Ошибка "Connection refused" (Отказ в соединении) при подключении к VNC-серверу в Linux означает, что клиент не смог установить TCP-соединение с сервером, потому что сервер активно отклонил запрос. Это происходит, когда сервер не прослушивает указанный порт (по умолчанию 5900 + номер дисплея, например, 5901 для :1), или когда промежуточное устройство (например, firewall) блокирует соединение. В отличие от таймаута, "Connection refused" — это немедленный ответ от целевого хоста, указывающий на отсутствие сервиса на порту.
Причины возникновения
Ошибка "Connection refused" обычно вызвана одной из следующих причин:
- VNC-сервер не запущен — серверное приложение (например, Xvnc, TigerVNC) не активно, поэтому порт закрыт.
- Сервер привязан только к localhost (127.0.0.1) — по умолчанию многие VNC-серверы слушают только локальные интерфейсы для безопасности, запрещая удалённые подключения.
- Firewall блокирует порт VNC — правила firewall (ufw, firewalld, iptables) не разрешают входящие соединения на порт VNC.
- Неправильный порт или IP-адрес в клиенте — клиент подключается к неверному адресу или порту (например, использует 5900 вместо 5901 для дисплея
:1). - Конфликт портов — другой процесс уже занимает порт, который пытается использовать VNC-сервер, поэтому он не может запуститься.
- Ошибки в конфигурации VNC — в файлах конфигурации (например,
~/.vnc/config) указаны неверные параметры, ограничивающие подключения. - Недостаточно прав у пользователя — VNC-сервер требует определённых прав (например, root) для привязки к порту, и при запуске от обычного пользователя может отказать.
Способы решения
Способ 1: Проверка и запуск VNC-сервера
Первым делом убедитесь, что VNC-сервер запущен. Для систем, использующих systemd (Ubuntu, Debian, CentOS, Fedora):
sudo systemctl status vncserver@:1
Если служба неактивна (не показана как "active (running)"), запустите её:
sudo systemctl start vncserver@:1
sudo systemctl enable vncserver@:1 # для автозапуска при загрузке
Для систем без systemd или при ручном запуске проверьте процессы:
ps aux | grep Xvnc
Если процесс не найден, запустите сервер вручную (от имени пользователя, который будет использовать VNC):
vncserver :1
После запуска перейдите к следующему шагу.
Способ 2: Проверка настроек прослушивания
Убедитесь, что VNC-сервер слушает на всех сетевых интерфейсах (0.0.0.0 для IPv4, :: для IPv6), а не только на localhost.
Проверьте, на каком адресе и порту работает сервер:
sudo ss -tulpn | grep :5901 # для дисплея :1 (порт 5901)
Пример корректного вывода:
tcp LISTEN 0 128 0.0.0.0:5901 0.0.0.0:* users:(("Xvnc",pid=1234,fd=3))
Если видите 127.0.0.1:5901 или ::1:5901, сервер привязан только к loopback-интерфейсу.
Чтобы разрешить внешние подключения, запустите VNC-сервер с параметром -localhost no:
vncserver :1 -localhost no
Или измените конфигурационный файл (например, ~/.vnc/config), добавив строку:
localhost=no
После изменений перезапустите сервер (sudo systemctl restart vncserver@:1 или остановите и запустите заново).
Способ 3: Настройка firewall
Если на системе активен firewall, он может блокировать входящие соединения на порт VNC. Откройте порт, соответствующий номеру дисплея (для :1 — 5901).
Для ufw (Ubuntu/Debian):
sudo ufw allow 5901/tcp
sudo ufw reload
Для firewalld (CentOS/Fedora):
sudo firewall-cmd --permanent --add-port=5901/tcp
sudo firewall-cmd --reload
Для iptables (старые системы):
sudo iptables -A INPUT -p tcp --dport 5901 -j ACCEPT
sudo service iptables save # или sudo iptables-save > /etc/iptables/rules.v4
Убедитесь, что правило применяется только к доверенным IP-адресам, если безопасность критична. Проверьте статус firewall:
sudo ufw status # для ufw
sudo firewall-cmd --list-all # для firewalld
Способ 4: Проверка конфигурации VNC
Ошибки в конфигурационных файлах могут ограничивать подключения. Расположение файлов зависит от дистрибутива и VNC-сервера:
- Пользовательская конфигурация:
~/.vnc/config - Системная конфигурация:
/etc/vnc.confили/etc/tigervnc/vncserver-config-defaults(для TigerVNC)
Откройте соответствующий файл и проверьте параметры:
localhost=no— должно быть установлено для удалённых подключений.SecurityTypes=None— отключение аутентификации не рекомендуется, но может мешать подключению, если клиент ожидает пароль.rfbport— убедитесь, что порт соответствует номеру дисплея (5900 + N).
Если вы вносите изменения, перезапустите VNC-сервер.
Способ 5: Проверка на конфликты портов
Если порт VNC уже занят другим процессом, сервер не сможет его использовать, что приведёт к отказу в соединении.
Узнайте, какой порт использует VNC-сервер (если он запущен):
sudo ss -tulpn | grep Xvnc
Если порт не отображается, возможно, сервер не запустился из-за конфликта. Найдите процесс, занимающий порт 5901:
sudo lsof -i :5901
Завершите конфликтующий процесс (если он не нужен):
sudo kill <PID>
Или запустите VNC-сервер на другом дисплее, например:
vncserver :2 # использует порт 5902
Обновите клиент для подключения к новому порту.
Профилактика
Чтобы избежать повторения ошибки "Connection refused":
- Явно настройте VNC-сервер на прослушивание внешних интерфейсов — используйте
-localhost noилиlocalhost=noв конфигурации. - Настройте firewall точечно — открывайте порт VNC только для необходимых IP-адресов или подсетей, а не для всех (
0.0.0.0/0). - Регулярно обновляйте VNC-сервер — устанавливайте обновления безопасности для предотвращения уязвимостей.
- Используйте SSH-туннелирование — для защиты трафика VNC, настройте туннель через SSH вместо прямого открытия порта.
- Мониторьте логи VNC — проверяйте файлы логов в
~/.vnc/*.logпри проблемах с запуском или подключением. - Проверяйте автозапуск — убедитесь, что служба VNC включена в автозагрузку (
sudo systemctl enable vncserver@:1), особенно после перезагрузок.