Переадресация обратного порта SSH без включенных GatewayPorts

482
a3nm

У меня есть две машины, m1 и m2, и машина m2 может подключаться к m1 с помощью SSH. Есть машина m1bis, которая может подключаться только к m1, и есть машина m2bis, к которой может подключиться только m2. Я хотел бы, чтобы m1bis мог подключиться к машине m2bis на некотором порту q, подключившись к некоторому порту p машины m1. Допустим, что и p, и q являются непривилегированными портами, т. Е. Они больше 1024. На рисунках:

+-------+ q +----+ SSH +----+ p +-------+ | m1bis | ----> | m1 | <------ | m2 | ----> | m2bis | +-------+ +----+ +----+ +-------+ 

У меня есть доступ к оболочке m1 и m2. Обычный способ сделать это будет с обратным портом SSH, запустив следующее на m2:

ssh -R *:q:m2bis:p m1 

Это заставляет демона SSH на m1 прослушивать порт q на всех интерфейсах и ретранслировать любые входящие соединения на порт p компьютера m2bis. Таким образом, когда m1bis подключается к порту q машины m1, соединение маршрутизируется по SSH от m1 до m2, и соединение фактически происходит через порт p машины m2bis. Все идет нормально.

Проблема заключается в том, что для этого необходимо, чтобы этот параметр GatewayPorts=yesбыл включен в конфигурации сервера SSH на m1. Однако он не включен, и я не являюсь пользователем root на m1, поэтому не могу его включить.

Тем не менее, мне кажется, что на самом деле ничто не мешает мне обойти это и, тем не менее, выполнить переадресацию портов: у меня есть доступ к оболочке m1, я могу иметь SSH-соединение между m1 и m2, я могу запустить процесс на m1, который прослушивает через порт q на всех интерфейсах (вместо прослушивания выполняет демон SSH), который маршрутизирует соединение через SSH. Поэтому, по сути, у меня есть все необходимые разрешения для создания своего собственного порта вперед.

Могу ли я на самом деле сделать это, и есть ли простой способ сделать это?

Дополнительные требования:

  • Поскольку я не root на m1, я бы предпочел решение без сложных зависимостей, в идеале какой-нибудь bash-скрипт с распространенными утилитами, такими как netcat, socatи т. Д., Или некоторую автономную C-программу.
  • Я рут на м2, если это помогает (но в принципе я не думаю, что мне это тоже нужно).
  • Я не доверяю соединению между m1 и m2, поэтому пересылка должна быть зашифрована между m1 и m2 (т. Е. Она должна действительно передаваться по SSH).
1

2 ответа на вопрос

5
Mc-

Хорошо работающее решение - запустить собственный демон SSH на m1, который можно выполнить без рута. Вот как запустить демон SSH, будучи обычным пользователем.

Сначала сгенерируйте ключи хоста:

ssh-keygen -f test_host_rsa -N '' -t rsa ssh-keygen -f test_host_dsa -N '' -t dsa ssh-keygen -f test_host_ed25519 -N '' -t ed25519 

Затем напишите файл конфигурации для вашего sshd, где 2222 - это какой-то непривилегированный порт, который не используется на m1 и к которому можно подключиться m2, и где вам также необходимо указать абсолютный путь к текущей папке:

cat >sshd_config <<EOF Port 2222 HostKey /folder/where/the/files/are/test_host_rsa HostKey /folder/where/the/files/are/test_host_dsa HostKey /folder/where/the/files/are/test_host_ed25519 GatewayPorts yes 

Теперь запустите ваш демон SSH:

/usr/sbin/sshd -f sshd_config 

Теперь m2 может подключиться к порту 2222 m1 и запустить обратный порт вперед, потому что GatewayPorts включен на вашем демоне SSH. Другими словами, на м2 вы можете запустить:

ssh -p 2222 -R *:q:m2bis:p m1 
2
a3nm

Друг предложил другое решение: если socatкоманда установлена ​​на m1, вы можете сделать обратный порт SSH вперед, прослушивая адрес обратной связи, на некотором порте q2, то есть выполнив следующее на m2:

ssh -R q2:m2bis:p m1 

И используйте socatна m1 следующее, которое перенаправит входящие соединения через порт q на переадресацию портов, которая прослушивает адрес обратной связи:

socat tcp-listen:q,reuseaddr,fork tcp:localhost:q2