Динамическое перенаправление портов на уровне приложения с помощью SOCKS с использованием библиотеки paramiko в Python

Я пытаюсь подключиться к SSH-серверу следующим образом:

import paramiko
import socks
sock = socks.socksocket()
sock.setproxy(socks.PROXY_TYPE_SOCKS5, 'localhost', 22, True)
sock.connect((**IP address of SSH server**, 22))
t = paramiko.Transport(sock)
t.connect( None, 'username', 'password')

И получите следующую ошибку

> Traceback (most recent call last): ...
>     sock.connect((**IP address of SSH server**, 22))   File "C:\Python27\lib\site-packages\socks.py", line 368, in connect
>     _orgsocket.connect(self,(self.__proxy[1],portnum))   File "C:\Python27\lib\socket.py", line 224, in meth
>     return getattr(self._sock,name)(*args) socket.error: [Errno 10061] No connection could be made because the target machi ne actively
> refused it

Моя цель - смоделировать способ Putty при создании прокси-сервера SSH SOCKS, как здесь: Настроить PuTTY для создания SSH SOCKS Прокси-сервер для безопасного просмотра. Или эквивалент

ssh -D [localhost] порт

для локальной динамической переадресации портов на уровне приложения.

Может кто-нибудь объяснить, пожалуйста, что не так и как правильно делать с помощью paramiko? Спасибо.

P.S. Я нашел этот https://stackoverflow.com/a/5823383/1264304 Однако мне не удалось реализовать это. Кто-то?


person rok    schedule 21.05.2013    source источник
comment
Кто-нибудь может мне помочь? Putty подключается к серверу, а paramiko - нет.   -  person rok    schedule 22.05.2013


Ответы (1)


Paramiko может напрямую подключаться к ssh. Вам не нужна библиотека SOCKS для подключения к ssh-серверу. Кроме того, при попытке удаленный сервер отказывается подключаться, потому что вы не аутентифицируетесь.

Правильный способ сделать это - подключиться к sshClient paramiko:

import paramiko
ssh = paramiko.SSHClient()
ssh.connect('yourServer', username='you', 
    password='yay!')

А затем получите базовый транспорт:

trans = ssh.get_transport()

Наконец, попросите ssh-клиент перенаправить tcp-порт с помощью открытого канала:

trans.open_channel("forwarded-tcpip", dest_addr=('serverIP',8000), src_addr=('localhost'),8000))

Это приведет к тому, что любые соединения на порту 8000 локально будут перенаправлены на порт 8000 удаленно через этот сеанс ssh.

person Spencer Rathbun    schedule 21.05.2013
comment
Спасибо за быстрый ответ. Я попробовал ваш код с небольшими изменениями dest_adrr = (IP, port) и src_addr = (IP, port), но все равно получил исключение: chan = trans.open_channel('forwarded-tcpip', dest_addr = ('132.72.80.162', 2 2), src_addr = ('localhost', 22)) File "C:\Python27\lib\site-packages\paramiko\transport.py", line 773, in open_ channel raise e paramiko.ChannelException: Administratively prohibited - person rok; 21.05.2013
comment
@ user1264304 Вам может потребоваться сначала позвонить request_port_forward. Или ваш сервер может не разрешать переадресацию любого порта, который вы выбрали. Или вообще никаких портов. - person Spencer Rathbun; 21.05.2013
comment
@ Спенсер Рэтбан, я думаю, ты прав. Я добавил вызов request_port_forward (serverIP, 22) и получил paramiko.SSHException: запрос пересылки TCP отклонен, однако переадресация портов Putty работает с тем же сервером. Непонятно почему. - person rok; 21.05.2013