2017-11-13 31 views
1

私はサーバホスト(S)とクライアント(C1、C2、C3、...)の束を持っています。私は、双方向通信のために、SとC1、C2、C3との間の接続をそれぞれ開きたいと思う。理想的にはソケットを使用する。認可の目的でSSHを使用することをお勧めします。理想的sshトンネル経由のソケットを使用した双方向通信

  1. クライアントC1は、それ自身のポートのように、それはSでアクセス可能であるように、C1のポートを転送し、SにSSH逆方向トンネルを作成します。
  2. C1で実行されているクライアントプログラムはソケットを作成し、転送されたポートにバインドします。
  3. Sで実行されているサーバープログラムはソケットを作成し、転送されたポートにバインドします。
  4. クライアントとサーバーはデータを交換できます。

可能なことはありますか?私は、Pythonを使ってドラフトをアップコーディング試みたが、無駄に:まず

、私はC1上で実行します。ssh -N -R 9999:localhost:15432 [email protected] - OK

を第二に、私は実行して、サーバー上:

第三
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 

、クライアント上で、私は実行:

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 

今私のクライアントマシン上で、私は1つのウィンドウでこれを実行する(またはバックグラウンドでそれを置くことができ):そのマシン上で、私は(これはまたあなたのpythonサーバーがポート9999でリッスンすることができる)を実行

ssh -N -L 9999:bree:9999 bree 

これは言う:ポート9999をローカル(クライアント)マシンに耳を傾け、そしてそれへの接続が行われたとき、トンネルを経由して要求を転送し、ブリー上のポート9999に接続します。

は今、クライアントマシン上の第二のウィンドウでは、私が実行します。

nc localhost 9999 

2つのncのインスタンスが接続されています。

関連する問題