
Tenho a seguinte configuração: gostaria de acessar a máquina A da máquina C, mas nenhuma delas possui um endereço IP público. A máquina C está, no entanto, na mesma rede que a máquina B, que tem acesso IP público, portanto, posso acessar a máquina C de qualquer lugar, primeiro fazendo ssh na máquina B e de lá ssh na máquina C. Não tenho acesso root na máquina B, enquanto em A e CI o fazem. Veja o diagrama a seguir para esclarecimentos:
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
Uma solução idiota seria fazer com que a máquina A detectasse regularmente um arquivo na máquina C (pelo acesso ssh em duas etapas descrito acima) e sempre que um comando aparecer nesse arquivo, execute-o e escreva as saídas sobre ssh em algum lugar da máquina C. I , porém, pergunto-me, o ssh pode de alguma forma "reverter" a conexão, de modo que a máquina A se conecte em 2 etapas à máquina C e, em seguida, a conexão seja "invertida" para que a máquina C realmente tenha o shell remoto da máquina A? E se sim, como faço isso?
Responder1
Você pode ter que machineA
abrir um túnel SSH para machineB
, com uma opção de encaminhamento remoto, que permitiria fazer SSH para machineA
from machineB
.
Se você tiver acesso root ativado machineB
, defina a GatewayPorts
opção de configuração como yes
in /etc/ssh/sshd_config
e emita este comando em machineA
:
ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B
Isso abrirá a porta 2222 machineB
e encaminhará qualquer tráfego nessa porta para si mesma, para a porta 22. Observe que isso escutará em todas as interfaces, incluindo a pública, então você pode querer usar o firewall da porta número 2222 (mas provavelmente você tem um firewall ativado machineB
de qualquer maneira). Enquanto este túnel estiver ativo, você pode usar SSH machineB
na porta 2222, e isso o levará para machineA
. Como machineB
e machineC
estão na mesma sub-rede, você pode fazer login machineA
em machineC
uma única etapa.
Se você não tiver acesso root machineB
, o processo será o mesmo, com exceção do endereço de escuta. Se GatewayPorts
estiver definido como no
(que é o padrão), o primeiro argumento ( 0.0.0.0
) será simplesmente ignorado e o endereço de escuta será vinculado a 127.0.0.1
. Nesse caso, você ainda pode usar o comando acima, e o encaminhamento funcionará da mesma forma, mas a porta aberta não estará disponível em qualquer lugar, exceto em machineB
. Portanto, você deve usar SSH para machineB
, depois SSH para localhost
, porta 2222, que o levará para machineA
.
No entanto, você pode considerar o uso de algo mais robusto, como uma VPN.