개인 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
예
내가 네트워크에서이 컴퓨터를 가지고 lappy
와 remotey
. 따라서 다음 명령을 실행합니다 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 터널이 다음과 같이 작동하고 있음을 알 수 있습니다.
-
로그인
remotey
[user@lappy ~]$ ssh remotey
-
리버스 터널 포트 테스트
[user@remotey ~]$ ssh -p 12345 localhost
-
이제 기저귀에 다시 있어야합니다
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에 연결할 필요가 없다는 것입니다!
-
로그인
remotey
[user@lappy ~]$ ssh remotey
-
역방향 연결 테스트
[user@remotey ~]$ ssh -p 12345 remotey
-
이제 기저귀에 다시 있어야합니다
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