ssh на сервер без публичного IP с сервера без публичного IP, который скрыт за сервером с публичным IP

ssh на сервер без публичного IP с сервера без публичного IP, который скрыт за сервером с публичным IP

У меня следующая настройка: я хотел бы получить доступ к машине A с машины C, но ни у одной из них нет публичного IP-адреса. Однако машина C находится в той же сети, что и машина B, у которой есть публичный IP-адрес, поэтому я могу получить доступ к машине C из любой точки мира, сначала подключившись по ssh к машине B, а оттуда по ssh к машине C. У меня нет доступа root к машине B, тогда как у A и CI он есть. Для пояснения см. следующую схему:

machine A          machine B      machine C
no public IP       public IP      no public IP
root access        no root access root access     
how to access?    '---------------------------'
                           same network
                       hence both accessible

Глупым решением было бы заставить машину A регулярно прослушивать файл на машине C (с помощью двухэтапного доступа по ssh, описанного выше) и всякий раз, когда в этом файле появляется команда, выполнять ее и записывать выходные данные по ssh куда-нибудь на машину C. Мне, однако, интересно, может ли ssh как-то «обратить» соединение, так чтобы машина A подключалась за два шага к машине C, а затем соединение «обратилось», так что машина C на самом деле имела удаленную оболочку машины A? И если да, как мне это сделать?

решение1

Вам может потребоваться machineAоткрыть SSH-туннель к machineBс опцией удаленной пересылки, что позволит вам подключаться по SSH machineAк machineB.

Если у вас есть права root на machineB, установите GatewayPortsпараметр конфигурации на yesin /etc/ssh/sshd_config, затем выполните следующую команду на machineA:

ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B

Это откроет порт 2222 на machineBи перенаправит любой трафик с этого порта на себя, на порт 22. Обратите внимание, что это будет прослушиваться на всех интерфейсах, включая публичный, поэтому вы можете захотеть заблокировать порт 2222 (но, вероятно, у вас machineBи так включен брандмауэр). Пока этот туннель активен, вы можете подключиться по SSH к machineBпорту 2222, и это приведет вас к machineA. Поскольку machineBи machineCнаходятся в одной подсети, вы можете войти в , machineAза machineCодин шаг.

Если у вас нет доступа root на machineB, то процесс тот же самый, за исключением адреса прослушивания. Если GatewayPortsустановлено значение no(что является значением по умолчанию), то первый аргумент ( 0.0.0.0) будет просто проигнорирован, а адрес прослушивания будет привязан к 127.0.0.1. В этом случае вы все равно можете использовать команду выше, и переадресация будет работать так же, но открытый порт будет доступен только из machineB. Поэтому вы должны подключиться по SSH к machineB, затем по SSH к localhost, порт 2222, что приведет вас к machineA.

Однако вы можете рассмотреть возможность использования чего-то более надежного, например VPN.

Связанный контент