실제 IP wxyz를 사용하여 인터넷과 ArchLinux VPS(컴퓨터 B)에 액세스할 수 있는 개인 IP 10.150.5.141(제한된 방화벽 포함)로 구성된 CentOS 컴퓨터(컴퓨터 A)가 있습니다.
컴퓨터 B에 액세스할 수 있는 다른 컴퓨터(컴퓨터 C)를 컴퓨터 A에 연결하지만 컴퓨터 C는 컴퓨터 A에 직접 연결할 수 없습니다(A의 자체 개인 네트워크에 있기 때문에).
터널이 다른 컴퓨터의 로컬 포트:포트로 열릴 수 있다는 것을 알고 있지만 그 반대는 어떻습니까?
컴퓨터 B를 통해 컴퓨터 A에 액세스 하고 싶지만 ssh
컴퓨터 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
.
답변1
당신이 찾고 있는 것을 역방향 터널링이라고 합니다. 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
예
네트워크에 2대의 컴퓨터가 있고 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
이외의 인터페이스에 포트가 있습니까 ?
이와 같은 명령을 시도했지만 작동하지 않는 것 같거나 항상 lo
localhost( ) 인터페이스의 포트에 바인딩되어 있으면 머리가 긁힐 수 있습니다.
예를 들어:
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
구성이 이 작업을 허용하지 않는다는 것입니다. 실제로 이 기능( )을 활성화하지 않으면 터널 포트를 localhost 이외의 다른 포트에 바인딩 GatewayPorts
할 수 없습니다 .ssh
게이트웨이 포트 활성화
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의 인터페이스에서 수신 대기하고 있음 을 알 수 있습니다 .
테스트 연결(이중 부분)
이제 이 테스트에 대한 설정을 변경했습니다. 가장 큰 차이점은 더 이상 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 ~]$
인용하다
답변2
컴퓨터 B는 컴퓨터 A에 연결할 수 없으므로 먼저 컴퓨터 A에서 원격 터널을 열어야 합니다.
ssh user@computerB -R vvv:localhost:22
답변3
그것은 중요하지 않습니다. 나는 답을 찾았습니다.
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