공인 IP가 있는 서버 뒤에 숨겨진 공인 IP가 없는 서버에서 공인 IP가 없는 서버로 SSH를 통해 접속

공인 IP가 있는 서버 뒤에 숨겨진 공인 IP가 없는 서버에서 공인 IP가 없는 서버로 SSH를 통해 접속

다음과 같은 설정이 있습니다. 머신 C에서 머신 A에 액세스하고 싶지만 둘 다 공용 IP 주소가 없습니다. 그러나 머신 C는 공용 IP 액세스가 있는 머신 B와 동일한 네트워크에 있으므로 먼저 머신 B에 SSH를 연결하고 거기에서 머신 C로 SSH를 통해 어디서나 머신 C에 액세스할 수 있습니다. 머신 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의 파일을 스니핑하고(위에서 설명한 2단계 SSH 액세스를 통해) 해당 파일에 명령이 나타날 때마다 이를 실행하고 머신 C의 어딘가에 SSH를 통해 출력을 쓰도록 하는 것입니다. 하지만 ssh가 어떻게든 연결을 "역전"하여 시스템 A가 시스템 C에 2단계로 연결되고 연결이 "역전"되어 시스템 C가 실제로 시스템 A의 원격 셸을 갖도록 할 수 있습니까? 그렇다면 어떻게 해야 합니까?

답변1

원격 전달 옵션을 사용하여 machineA에 대한 SSH 터널을 열어야 할 수 있으며 , 이를 통해 에서 로 SSH를 수행할 수 있습니다 .machineBmachineAmachineB

에 대한 루트 액세스 권한이 있는 경우 구성 옵션을 in 으로 machineB설정한 후 다음 명령을 실행하십시오 .GatewayPortsyes/etc/ssh/sshd_configmachineA

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

그러면 에서 포트 2222가 열리고 machineB해당 포트의 모든 트래픽이 포트 22로 전달됩니다. 이는 공개 인터페이스를 포함한 모든 인터페이스에서 수신 대기하므로 포트 번호 2222를 방화벽으로 설정하는 것이 좋습니다. 어쨌든 방화벽이 켜져 있습니다 machineB). 이 터널이 활성화되어 있는 동안 machineB포트 2222에서 SSH를 통해 연결할 수 있습니다 machineA. machineB과 은( 는 ) machineC동일한 서브넷에 있으므로 한 단계로 machineA에서 로그인할 수 있습니다.machineC

에 대한 루트 액세스 권한이 없는 경우 machineB수신 주소를 제외하고 프로세스는 동일합니다. 가 (기본값) GatewayPorts로 설정된 경우 첫 번째 인수( )는 무시되고 수신 주소는 에 바인딩됩니다 . 이 경우에도 위의 명령을 사용할 수 있으며 전달은 동일하게 작동하지만 열린 포트는 . 따라서 에 SSH를 연결한 다음 에 SSH를 통해 포트 2222를 연결하면 으로 연결됩니다 .no0.0.0.0127.0.0.1machineBmachineBlocalhostmachineA

그러나 VPN과 같이 보다 강력한 기능을 사용하는 것이 좋습니다.

관련 정보