2017-11-13 10 views
1

서버 호스트 (S)와 많은 클라이언트 (C1, C2, C3, ...)가 있습니다. 나는 양방향 통신을 위해 S와 C1, C2, C3 사이의 연결을 각각 열고 싶습니다. 이상적으로 소켓을 사용하십시오. 인증 목적으로 SSH를 사용하는 것이 좋습니다. 이상적으로ssh 터널을 통한 소켓을 사용하는 양방향 통신

:

  1. 클라이언트 C1은 자신의 포트의대로 S에 액세스 할 수 있도록 C1의 포트 포워딩, S에 SSH 역방향 터널을 만듭니다.
  2. C1에서 실행되는 클라이언트 프로그램은 소켓을 만들고 전달 된 포트에 바인딩합니다.
  3. S에서 실행되는 서버 프로그램은 소켓을 만들고 전달 된 포트에 바인딩합니다.
  4. 클라이언트와 서버는 데이터를 교환 할 수 있습니다.

가능한가요? 첫째

, 나는 C1에서 실행 : 내가하지만 아무 소용이 파이썬을 사용하여 초안까지 코딩 시도 ssh -N -R 9999:localhost:15432 [email protected]을 - 서버에서

둘째 OK I 실행 :

import socket 

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
serversocket.bind(('localhost', 9999)) 
serversocket.listen(5) 

while True: 
    connection, address = serversocket.accept() 
    buf = connection.recv(64) 
    if len(buf) > 0: 
     print buf 
     break 

셋째, 클라이언트 I에 실행 :

import socket 

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
clientsocket.connect(('localhost', 15432)) 
clientsocket.send('hello') 

클라이언트에서 socket.error: [Errno 111] Connection refused이 표시됩니다. 또한 터널을 먼저 설정 한 다음 서버 프로그램을 실행하면 [Errno 98] Address already in use이 표시됩니다. 프로그램을 처음 시작한 다음 터널을 설정할 때만 작동합니다.

위의 개념이 이해가되지 않는다면 어떤 클라이언트가 서버의 쿼리를 수신하고 데이터로 응답 할 수 있도록 동기화 도구를 만드는 것이 좋습니다. (Python에서 선호).

미리 감사드립니다.

답변

0

-N 당신이 생각하는 것처럼 보이지 않습니다. 그것은 ssh-destination이 발신자에게 다시 연결할 수 있도록하기위한 것입니다. 그러나 그것은 원래 서버 측을 서버로 만들 것입니다.

-L을 사용하여 서버에서 ssh 터널을 통해 클라이언트와의 연결을 간단하게 만들 수있는 것 같습니다.

설명 : 'bree'라는 로컬 서버가 있습니다.

nc -l 9999 

지금 내 클라이언트 시스템에, 나는 하나 개의 창에서이 작업을 실행 (또는 배경에 넣을 수) : 그 기계에, 나는 (이 또한 파이썬 서버가 포트 9999에서 수신 할 수있다)을 실행

포트 9999에 로컬 (클라이언트) 컴퓨터에서 듣고, 그것에 연결이 이루어질 때, 터널을 통해 요청을 전달하고, 브리에 포트 9999에 연결 :
ssh -N -L 9999:bree:9999 bree 

이 말한다.

이제 클라이언트 시스템에 두 번째 창에, 나는 실행 :

nc localhost 9999 

nc 인스턴스가 연결되어 있습니다.