Вопрос или проблема
Учитывая ServerB и ServerA, я запускаю следующую команду на ServerB, чтобы настроить удаленное пересылку портов, чтобы запросы, поступающие на порт 4000 на serverA, пересылались на ServerB:22.
ssh -R 4000:localhost:22 user@serverA
Теперь на моем локальном компьютере я могу подключиться к ServerB через переход к ServerA на порту 4000.
ssh -J user@serverA user@localhost -p 4000
Это работает.
Я пытаюсь понять, почему вывод следующей команды (при запуске на ServerA)
sudo lsof -i -P -n
Не соответствует моим ожиданиям.
Вместо того чтобы увидеть вывод вроде…
...
sshd TCP 127.0.0.1:4000->serverB:22 (ESTABLISHED)
...
Я вижу следующее…
...
sshd TCP [::1]:4000 (LISTEN)
sshd TCP 127.0.0.1:4000 (LISTEN)
sshd TCP 127.0.0.1:4000->127.0.0.1:4340 (ESTABLISHED)
...
Эти строки не упоминают ServerB, и особенно последняя строка просто предполагает локальное соединение с другим случайным портом.
Почему это так, и учитывая описанный выше сценарий, как можно получить осмысленное описание этого?
Ответ или решение
Понимание вывода lsof для удаленной переадресации портов SSH
Удаленная переадресация портов с помощью SSH — это мощный инструмент для управления сетевыми соединениями между серверами. В данном случае мы рассмотрим настройки, выполненные на ServerB и ServerA, а также вывод утилиты lsof
, чтобы понять их взаимодействие.
Сценарий настройки
Вы выполняете команду на ServerB:
ssh -R 4000:localhost:22 user@serverA
Эта команда настроивает удаленную переадресацию порта, что означает, что SSH соединение на ServerA, которое направляется на порт 4000, будет пересылаться на 22 порт ServerB (где запущен SSH-сервер).
На вашем локальном компьютере вы затем используете следующую команду, чтобы подключиться к ServerB через ServerA:
ssh -J user@serverA user@localhost -p 4000
Это работает, потому что вы используете промежуточное соединение с ServerA для доступа к ServerB через указанный порт.
Вывод lsof и ожидания
Когда вы выполняете команду:
sudo lsof -i -P -n
на ServerA, вы ожидаете увидеть что-то подобное:
sshd TCP 127.0.0.1:4000->serverB:22 (ESTABLISHED)
Тем не менее, реальный вывод выглядит следующим образом:
sshd TCP [::1]:4000 (LISTEN)
sshd TCP 127.0.0.1:4000 (LISTEN)
sshd TCP 127.0.0.1:4000->127.0.0.1:4340 (ESTABLISHED)
Этот вывод не содержит информации о ServerB и вместо этого показывает, что ServerA слушает на порту 4000 для локальных подключений.
Почему такой вывод?
-
Локальная переадресация: Когда вы устанавливаете удаленную переадресацию, соединение идет через SSH туннель, и SSH демон (
sshd
) на ServerA принимает соединение на порту 4000 только для локальных запросов. Таким образом, он отображается какLISTEN
на локальном интерфейсе. -
Перенаправление трафика: Соединение, указанное в
127.0.0.1:4000->127.0.0.1:4340
, указывает на то, что соединение идет из порта 4000 на сервере ServerA на другой локальный порт (4340). Это может происходить, если вы запускали дополнительные процессы, которые используют этот порт для связи. -
Отсутствие информации о сервере-цели: Из-за конфигурации SSH туннеля и его инкапсуляции,
sshd
на ServerA не имеет информации о конечном сервере (ServerB) на этом уровне, что и приводит к отсутствию вывода с установленным соединением.
Как получить более информативный вывод?
Если вы хотите получить более полезное представление о текущих соединениях, включая промежуточные узлы, вы можете рассмотреть использование утилиты netstat
или анализ SSH-трафика с помощью tcpdump
. Например, для получения списка всех состояний соединений вы можете выполнить:
sudo netstat -tulnp
или
sudo ss -tulnp
Это даст вам более полную картину сетевых соединений, включая статус локальных и удаленных соединений.
Заключение
Когда вы настраиваете удаленную переадресацию портов SSH, важно понимать, как работают локальные и удаленные подключения и какие данные выводит утилита lsof
. Несмотря на то, что ожидаемые данные могут не совпадать с действительными, глубокое понимание сетевого взаимодействия и инструментов мониторинга поможет вам в дальнейшем администрировании системы и обнаружении проблем.