如何在python中创建一个简单而安全的Socks5代理?

时间:2016-03-04 03:55:13

标签: python socks

几天前我想建立一个代理,可以让我安全地匿名连接到网站和服务器。起初,这似乎是一个非常简单的想法,我会创建一个在客户端和代理之间使用SSL的HTTP代理,然后它将创建一个SSL客户端请求的网站/服务器连接,然后将信息转发到客户端和服务器。我花了一天时间研究和编写可以做到这一点的代码。但后来我意识到有人可能会破坏代理并使用代理必须解密的会话密钥并读取发送到服务器和从服务器发送的数据。

经过一番研究后,似乎袜子代理就是我所需要的。但是,没有太多关于python版本的socks代理的文档(主要是如何连接到一个)。我能够找到The PySocks Module并阅读Socks.py文件。它对于创建客户端看起来很棒,但我不知道如何使用它来创建代理。

我想知道是否有人有一个关于socks5代理的简单示例,或者是否有人可以指出一些可以帮助我开始学习和构建一个的材料?

2 个答案:

答案 0 :(得分:1)

您创建一个python服务器以侦听端口并侦听IP 127.0.0.1。当您连接到服务器时,您发送:“ www.facebook.com:80”。没有网址路径或http方案。如果连接失败,您将发送一条失败消息,该消息可能类似于“无法连接到主机的数量”。其中number是表示失败的尝试连接的特定代码。连接成功后,您将发送“ 200连接已建立”。然后,正常发送和接收数据。您不想使用http代理,因为它仅接受网站流量。

您可能要为代理服务器使用框架,因为它应该处理多个连接。

我已经多次阅读有关Osynco的电子书,名为O'Reilly“在Python 2020中使用Asyncio”,并不时地重新阅读它,以尝试掌握多个连接。我还刚刚开始使用Flask搜索解决方案,因为我希望我的代理服务器可以与网络服务器一起运行。

答案 1 :(得分:0)

我建议使用requesocksstem(假设Tor)。 The official stem library is provided by Tor。这是一个基于我编写的刮刀的简化示例,它也使用fake_useragent,因此您看起来像浏览器:

import requesocks

from fake_useragent import UserAgent
from stem import Signal
from stem.control import Controller


class Proxy(object):
    def __init__(self, 
                 socks_port=9050,
                 tor_control_port=9051,
                 tor_connection_password='password')

        self._socks_port = int(socks_port)
        self._tor_control_port = int(tor_control_port)
        self._tor_connection_password = tor_connection_password
        self._user_agent = UserAgent()
        self._session = None
        self._update_session()

    def _update_session(self):
        self._session = requesocks.session()

        # port 9050 is the default SOCKS port
        self._session.proxies = {
            'http':  'socks5://127.0.0.1:{}'.format(self._socks_port),
            'https': 'socks5://127.0.0.1:{}'.format(self._socks_port),
        }

    def _renew_tor_connection(self):
        with Controller.from_port(port=self._tor_control_port) as controller:
            controller.authenticate(password=self._tor_connection_password)
            controller.signal(Signal.NEWNYM)

    def _sample_get_response(self, url):
        if not self._session:
            self._update_session()

        # generate random user agent string for every request
        headers = {
            'User-Agent': self._user_agent.random,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'en-us,en;q=0.5',
        }  # adjust as desired

        response = self._session.get(url, verify=False, headers=headers)
        return response

在执行此脚本之前必须运行Tor服务,并且还必须修改torrc文件以启用控制端口(9051)。

如果您从源代码编译Tor,则 Tor将torrc文件放在/usr/local/etc/tor/torrc中;如果您安装了预构建的软件包,则将/etc/tor/torrc/etc/torrc放入Browser/TorBrowser/Data/Tor/torrc。如果您安装了Tor Browser,请查找 Tor Browser目录中的torrc(在Mac OS X上,您必须右键单击或按住Command键并单击Tor浏览器图标,然后在Tor浏览器目录之前选择“显示包内容” 可见)。

找到ControlPort 9051 ## If you enable the controlport, be sure to enable one of these ## authentication methods, to prevent attackers from accessing it. HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE 文件后,您需要取消注释相应的行:

HashedControlPassword

请注意,上面的HashedControlPassword用于输入密码“password”。如果要设置不同的密码(推荐),请通过注明torrc的输出来替换tor --hash-password "<new_password>"文件中的<new_password>,其中torrc是您想要的密码集。

一旦更改了sudo service tor restart 文件,就需要重新启动tor才能使更改生效(请注意,实际上只需要向Tor发送HUP信号,而不是实际重启它)。要重新启动它:

function check

我希望这会有所帮助,至少可以让你开始寻找你想要的东西。