[unix] ssh to private-ip

개인 IP 10.150.5.141 (제한된 방화벽 사용)을 갖도록 구성된 CentOS (컴퓨터 A)가있는 컴퓨터가 있으며 실제 IP wxyz를 사용하여 인터넷 및 내 ArchLinux VPS (컴퓨터 B)에 액세스 할 수 있습니다.

컴퓨터 B에 액세스하여 컴퓨터 A에 연결할 수있는 다른 PC (컴퓨터 C)를 만들 수 있지만 컴퓨터 A는 컴퓨터 A에 직접 연결할 수 없습니다 (A 자신의 개인 네트워크에 있기 때문에)?

터널이 다른 컴퓨터 : 포트에 대한 로컬 포트를 열 수 있지만 그 반대의 방법은 무엇입니까?

ssh컴퓨터 B 를 통해 컴퓨터 A에 액세스하고 싶지만 컴퓨터 A 의 네트워크가 제한적이므로 (내가 할 수는 있지만 들어갈 수는 없습니다. 라우터에 액세스 할 수 없기 때문에) 컴퓨터 B가 컴퓨터 A에 액세스 할 수 없습니다.

나는 이런 것을 원한다.

ssh -connect-to w.x.y.z:22 -open-port vvv -forward-to 10.150.5.141 -port 22

따라서 ssh w.x.y.z:vvv컴퓨터 C에서 개인 네트워크로 전달됩니다 10.150.5.141:22.



답변

당신이 찾고있는 것을 리버스 터널이라고합니다. 스위치를 ssh통해 제공합니다 -R.

-R [bind_address:]port:host:hostport
       Specifies that the given port on the remote (server) host is to
       be forwarded to the given host and port on the local side.  This
       works by allocating a socket to listen to port on the remote side,
       and whenever a connection is made to this port, the connection is
       forwarded over the secure channel, and a connection is made to host
       port hostport from the local machine.

OP가 답변으로 발견 한 구문은 다음과 같습니다.

$ ssh -f -N -R vvv:localhost:22 w.x.y.z

내가 네트워크에서이 컴퓨터를 가지고 lappyremotey. 따라서 다음 명령을 실행합니다 lappy.

$ ssh -f -N -R 12345:localhost:22 remotey

작동하는지 확인할 수 있습니다.

$ ps -eaf|grep "[l]ocalhost:22"
saml     27685     1  0 11:10 ?        00:00:00 ssh -f -N -R 12345:localhost:22 remotey

이제 ssh원격 시스템으로 분리 remotey하여이 명령을 실행하면 원격 시스템의 로컬 인터페이스에서 포트 12345의 연결을 수락하고 있음을 알 수 있습니다.

$ netstat -an|grep :12345
tcp        0      0 127.0.0.1:12345             0.0.0.0:*                   LISTEN
tcp        0      0 ::1:12345                   :::*                        LISTEN

연결 테스트

역방향 ssh 터널이 다음과 같이 작동하고 있음을 알 수 있습니다.

  1. 로그인 remotey

    [user@lappy ~]$ ssh remotey
    
  2. 리버스 터널 포트 테스트

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. 이제 기저귀에 다시 있어야합니다

    user@localhost's password:
    Last login: Thu Aug  1 17:53:54 2013
    /usr/bin/xauth:  creating new authority file /home/user/.Xauthority
    [user@lappy ~]$
    

localhost ( lo) 이외의 인터페이스에있는 포트 ?

이와 같은 명령을 시도해도 작동하지 않거나 항상 localhost ( lo) 인터페이스 의 포트에 바인딩되면 머리가 긁힐 수 있습니다 .

예를 들면 다음과 같습니다.

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

참고 : 이 명령은 포트 12345 @ remotey를 열고 포트 22 @ lappy에 대한 연결을 터널링하도록 지시합니다.

그런 다음 원격에서 :

remotey$ netstat -an|grep 12345
tcp        0      0 127.0.0.1:12345              0.0.0.0:*                   LISTEN

진행중인 것은 sshd의 구성 으로이 작업을 수행 할 수 없다는 것입니다. 실제로이 기능을 사용하지 않으면 ( GatewayPorts) ssh터널 포트를 localhost 이외의 다른 것에 바인딩 할 수 없습니다 .

GatewayPort 활성화

remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no

사용하려면 다음 파일을 편집하십시오 /etc/ssh/sshd_config.

GatewayPorts clientspecified

그리고 다시 시작하십시오 sshd.

remotey$ sudo service sshd restart

이제 다시 시도하면 다음과 같은 효과가 나타납니다.

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

이번에는 원격에서 다시 확인하십시오.

remotey$ netstat -anp | grep 12345
tcp        0      0 192.168.1.3:12345           0.0.0.0:*                   LISTEN      9333/sshd

참고 : 위에서 sshd포트 12345의 연결을 위해 IP 주소가 192.168.1.3 인 인터페이스 에서 프로세스가 수신되고 있음을 알 수 있습니다 .

연결 테스트 (부품 deux)

이번에 테스트 할 때 변경된 설정으로. 가장 큰 차이점은 더 이상 localhost에 연결할 필요가 없다는 것입니다!

  1. 로그인 remotey

    [user@lappy ~]$ ssh remotey
    
  2. 역방향 연결 테스트

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. 이제 기저귀에 다시 있어야합니다

    root@remotey's password:
    Last login: Wed Aug 21 01:49:10 2013 from remotey
    [user@lappy ~]$
    

참고 문헌


답변

컴퓨터 B가 컴퓨터 A에 액세스 할 수 없으므로 먼저 컴퓨터 A에서 원격 터널을 열어야합니다.

ssh user@computerB -R vvv:localhost:22


답변

신경 쓰지 마, 나는 대답을 찾았다.

ssh -f -N -R vvv:localhost:22 w.x.y.z

컴퓨터 A에서

편집 : TL; DR, 올바른 해결책 :

ssh -f -N -R w.x.y.z:vvv:localhost:22 w.x.y.z


답변