1

У меня есть две машины, 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).

2 ответа2

5

Хорошо работающее решение - запустить собственный демон 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

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

ssh -R q2:m2bis:p m1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .