Не удается подключиться к серверу VNC с использованием SSH-туннеля.

Вопрос или проблема

У меня есть сервер с Linux, на котором работает xtightvnc на Ubuntu 18.04. Используя мой ноутбук, я могу установить SSH туннель с помощью PuTTY на Windows и подключиться к VNC через localhost:5901. Это работает без проблем. На том же ноутбуке, если я загружаюсь в Debian 9, чтобы попытаться повторить подключение с использованием:

ssh -L 5901:127.0.0.1:5901 -N -f -l username server_ip_address

Я получаю ошибку:

bind: Cannot assign requested address

Запуская ту же команду с опцией verbose:

ssh -v -L 5901:127.0.0.1:5901 -N -f -l username server_ip_address

Выдает следующий вывод (я сократил вывод):

debug1: Local connections to LOCALHOST:5901 forwarded to remote 
address 127.0.0.1:5901
debug1: Local forwarding listening on 127.0.0.1 port 5901.
bind: Address already in use
debug1: Local forwarding listening on ::1 port 5901.
bind: Cannot assign requested address
channel_setup_fwd_listener_tcpip: cannot listen to port: 5901
Could not request local forwarding.
debug1: Requesting [email protected]
debug1: forking to background
debug1: Entering interactive session.
debug1: pledge: network

Я не уверен, что это значит, но похоже на то, что предыдущее подключение, которое я открыл под Windows, каким-то образом все еще активно?

Я также попытался создать туннель на Debian с помощью PuTTY и тех же настроек, что у меня есть под Windows. Кажется, я могу подключиться, используя те же настройки, и могу подключиться к VNC, хотя это не работало ранее. (Возможно, есть некая настройка задержки, о которой я не знаю, после закрытия соединения, которая все еще сохраняет соединение открытым/адрес закрепленным?)

редактировать: Это ошибка, которую я получаю, используя PuTTY на Linux, если адрес еще не сброшен:

vnc error

Главная проблема здесь, возможно, в том, что когда я закрываю PuTTY, соединение все еще активно (я только что проверил это, так как все еще мог подключиться к VNC, используя localhost:5901). Я выхожу из сеансов PuTTY с помощью exit.

Вывод netstat -tulpn также может быть релевантен:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
PID/Program name    
tcp        0      0 127.0.0.1:6342          0.0.0.0:*               LISTEN      
21618/megasync      
tcp        0      0 127.0.0.1:5901          0.0.0.0:*               LISTEN      
21527/Xtightvnc     
tcp        0      0 0.0.0.0:6001            0.0.0.0:*               LISTEN      
21527/Xtightvnc     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      
796/systemd-resolve 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
874/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      
874/sshd            
udp    33024      0 127.0.0.53:53           0.0.0.0:*                           
796/systemd-resolve 

Обновление:

Кажется, что все работает, но после закрытия соединения через PuTTY необходимо подождать некоторое время, прежде чем можно будет вновь установить соединение из другого экземпляра Windows или Linux. Если кто-то знает способ, как ускорить этот процесс, буду признателен за решение.

Обновление 2:

В Linux, похоже, я могу эффективно удалить ssh-туннель, например, используя pkill ssh (чтобы убить все текущие ssh-соединения). Следовательно, оказывается, что PuTTY имеет тенденцию неправильно закрывать туннель к серверу при выходе.

Похоже, у вас есть какой-то процесс, который уже слушает на порту 5901. Вы можете использовать другой порт:

ssh -L 15901:127.0.0.1:5901 login@host

Эта команда будет перенаправлять ваш локальный порт 15901 на удаленный порт 5901. Поэтому вам нужно подключиться к 127.0.0.1:15901 с вашим VNC-клиентом.

Ответ или решение

Проблема, с которой вы столкнулись, связана с невозможностью установить SSH-туннель для подключения к VNC-серверу на Linux-системе. Разберёмся подробно в причинах и решениях данной ситуации.

Теория

Основной причиной ошибки bind: Cannot assign requested address является попытка локального SSH использовать порт, который уже занят другим процессом. При использовании SSH-туннелей необходимо, чтобы указанный локальный порт был свободен. Ваша попытка подключения через порт 5901 на Debian завершается неудачей, так как этот порт уже занят.

Пример

Вы используете SSH-команду:

ssh -L 5901:127.0.0.1:5901 -N -f -l username server_ip_address

При её выполнении вы получаете сообщение об ошибке, что адрес недоступен (bind: Address already in use). Из вывода команды netstat видно, что порт 5901 уже используется процессом Xtightvnc, что и объясняет вашу ошибку.

Применение

  1. Изменение порта: Вместо использования порта 5901, укажите другой локальный порт, который не занят. Например:

    ssh -L 15901:127.0.0.1:5901 -N -f -l username server_ip_address

    В этом случае вы подключаетесь к VNC через localhost:15901, который будет направлен к удалённому порту 5901.

  2. Проверка занятого порта: Используйте команду netstat -tulpn или ss -tulpn, чтобы убедиться, что выбранный вами локальный порт свободен. Если порт 5901 занят, вы увидите запись, как показано в вашем выводе.

  3. Управление SSH-сессиями: Если возникает необходимость закрыть предыдущие активные SSH-соединения, вы можете использовать команду pkill ssh, чтобы завершить все текущие сессии. Это гарантирует, что все занимаемые порты будут освобождены.

  4. Конфигурация PuTTY: Убедитесь, что при использовании PuTTY он корректно завершает сеанс, и призакрытии окна сессии. Это можно сделать, убедившись в использовании команды exit или настройке PuTTY на отправку сигнала завершения сессии.

Эти рекомендации помогут вам более эффективно управлять SSH-туннелями и предотвратить проблемы, связанные с занятыми портами. Удачного применения решений!

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

Капча загружается...