Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2016 22:55:15

methaqualon
Зарегистрирован: 2016-06-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

[Python3] socks5 сервер и https

Добрый день!

В общем, дело такое, пишу простенький socks5 сервер.
Всё работает в идеале, шлётся туда-обратно до единого байта, грузятся сайты, но одна проблема - не грузятся сайты по https.

Прошу объяснить, в чём моя ошибка. Код прилагается.
На качество кода прошу не смотреть, нет обработчиков ошибок, многих функций протокола - позже оптимизирую и доделаю. (или в этом и есть всё дело?)

import socket, ipaddress, threading
from struct import unpack
 
def socks5server():
    client = socket.socket()
    client.bind(('', 9050))
    client.listen(100)
    
    while True:
        conn, add = client.accept()
        th = threading.Thread(name="socks5", target=socks5, args=(conn, add))
        th.start()
    client.close        
        
def socks5(c, ad): #с - сокет, ad - адрес
    ip = ''
    ipbytes = []        
    
    print("\nConnection from "+str(ad[0]), end=" ")
 
    hellop = c.recv(512)    #hello packet from client
        
    
    if hellop[0] != 5 or hellop[1] != 1 or hellop[2] != 0:
        c.close()
        return
        
    c.send(bytes([5, 0]))   #hello packet from me
    
    comm = c.recv(512)  #command from client
    
    if comm[3] == 1:    #здесь я проверяю, ipv4 или ipv6 адрес был предоставлен для коннекта
        ipbytes = comm[4:8]         
        ip = '.'.join([str(i) for i in comm if i > 5][0:4])
    elif comm[3] == 4:
        print('ipv6 connection registered.')
        ipbytes = comm[5:21]            
        ip = ipaddress.IPv6Address(comm[5:21])
    
    
    port = int(unpack('>H', comm[len(comm)-2:len(comm)])[0])    #здесь вытаскиваем порт
    
    print("to "+str(ip)+':'+str(port))
    
    c.send(bytes([5,0,0])+comm[3:4]+ipbytes+comm[len(comm)-2:len(comm)])    #request from me        
    
    ask = c.recv(8192)      
    
    dest = None 
    
    if comm[3] == 4:
        dest = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)    #здесь опять же, настраиваем коннекшн, по ipv4 или ipv6 он будет происходить
        dest.connect((str(ip), port))
    elif comm[3] == 1:
        dest = socket.socket()
        dest.connect((ip, port))
 
    dest.send(ask)          
 
    while True:
        rpl = dest.recv(4096)
        if len(rpl)>0:
            c.send(rpl)
        else:
            break
    
    dest.close()
    c.close()       
    
if __name__ == "__main__":
    socks5server()

Кстати, ещё вопрос! Загружаю я сайт по http, он полностью прогрузился, но на вкладке в браузере продолжается бесконечная загрузка. Чем это может быть вызвано?

Благодарю всех кто не пройдёт мимо!

Офлайн

#2 Июнь 2, 2016 00:38:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

[Python3] socks5 сервер и https

methaqualon
while True:
        conn, add = client.accept()
        th = threading.Thread(name="socks5", target=socks5, args=(conn, add))
        th.start()
    client.close
А что close без скобок? Так было задумано?



Офлайн

#3 Июнь 2, 2016 01:33:18

code_ua
Зарегистрирован: 2016-05-30
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

[Python3] socks5 сервер и https

Перед dest.send(ask) добавь

 
import ssl
dest = ssl.wrap_socket(dest, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacert.pem")

Файлик сертификата качать здесь https://curl.haxx.se/docs/caextract.html

Так пишут в интеретах, код не пробовал запускать


Офлайн

#4 Июнь 2, 2016 14:07:02

methaqualon
Зарегистрирован: 2016-06-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

[Python3] socks5 сервер и https

code_ua
Перед dest.send(ask) добавь…
Благодарю, уже в нужном направлении капаем, но теперь проблема в том, что наверное нужно врапить и клиентский сокет?… Он ведь тоже не http запросы на мой socks шлёт, верно?
Плюс показывать ему сертификат…

И кстати, вопрос созрел, неужели блин socks протокол по стандарту не поддерживает шифрованные протоколы, допустим тот же SSL?

Офлайн

#5 Июнь 2, 2016 15:46:36

code_ua
Зарегистрирован: 2016-05-30
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

[Python3] socks5 сервер и https

methaqualon
Благодарю, уже в нужном направлении капаем, но теперь проблема в том, что наверное нужно врапить и клиентский сокет?… Он ведь тоже не http запросы на мой socks шлёт, верно?
Плюс показывать ему сертификат…

вот целая статья https://habrahabr.ru/post/260085/

methaqualon
И кстати, вопрос созрел, неужели блин socks протокол по стандарту не поддерживает шифрованные протоколы, допустим тот же SSL?

socks вообще все-равно что ты будешь передавать: ssh http или https, его задача только быть посредником между клиентом и сервером, а то как ты будешь обращаться ему одинаково. Но без сертификатов ты не сможешь сделать соединение https, т.к. нужно сгенерировать ключи https://www.youtube.com/watch?v=xK3hGUOq-6w

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version