Вопрос или проблема
У меня есть сервер с 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, если адрес еще не сброшен:
Главная проблема здесь, возможно, в том, что когда я закрываю 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, что и объясняет вашу ошибку.
Применение
-
Изменение порта: Вместо использования порта 5901, укажите другой локальный порт, который не занят. Например:
ssh -L 15901:127.0.0.1:5901 -N -f -l username server_ip_address
В этом случае вы подключаетесь к VNC через
localhost:15901
, который будет направлен к удалённому порту 5901. -
Проверка занятого порта: Используйте команду
netstat -tulpn
илиss -tulpn
, чтобы убедиться, что выбранный вами локальный порт свободен. Если порт 5901 занят, вы увидите запись, как показано в вашем выводе. -
Управление SSH-сессиями: Если возникает необходимость закрыть предыдущие активные SSH-соединения, вы можете использовать команду
pkill ssh
, чтобы завершить все текущие сессии. Это гарантирует, что все занимаемые порты будут освобождены. -
Конфигурация PuTTY: Убедитесь, что при использовании PuTTY он корректно завершает сеанс, и призакрытии окна сессии. Это можно сделать, убедившись в использовании команды
exit
или настройке PuTTY на отправку сигнала завершения сессии.
Эти рекомендации помогут вам более эффективно управлять SSH-туннелями и предотвратить проблемы, связанные с занятыми портами. Удачного применения решений!