6

次のような「-R」ポート転送リクエストのみを処理する paramiko を使用して、ssh サーバーを実装する必要があります。

ssh -N -T -R 40005:destination_host:22 user@example.com

私が理解していることとはかけ離れて、 ServerInterface.check_port_forward_request を実装し、その後のある時点で、ソケットを作成して指定されたポートをリッスンする必要があります。Channel/Connection を経由するデータは、それぞれ Connection/Channel に移動します。

class Server (paramiko.ServerInterface):
    .
    .
    .
    def check_port_forward_request(self, address, port):
        'Check if the requested port forward is allowed'
        ...
        return port

def handler(chan, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('', port))
    sock.listen(1)
    conn, addr = s.accept()    

    while True:
        r, w, x = select.select([conn, chan], [], [])
        if conn in r:
            data = conn.recv(1024)
            if len(data) == 0:
                break
            chan.send(data)
        if chan in r:
            data = chan.recv(1024)
            if len(data) == 0:
                break
            conn.send(data)
    chan.close()
    conn.close()
    verbose('Tunnel closed from %r' % (chan.origin_addr,))

thr = threading.Thread(target=handler, args=(chan,server_port))
thr.setDaemon(True)
thr.start()

これは、サーバー側の paramiko ssh ポート転送の実装の背後にある一般的な考え方ですか? check_port_forward_request 内または他の場所でスレッドを開始する必要がありますか?

4

1 に答える 1

1

Paramiko のリバース ポート フォワーディングのソースからの実例を次に示します。

https://github.com/paramiko/paramiko/blob/master/demos/rforward.py

于 2016-10-03T18:00:05.593 に答える