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

如何在python中创建简单而安全的Socks5代理?,python,socks,Python,Socks,几天前,我想建立一个代理,可以让我安全和匿名地连接到网站和服务器。起初,这似乎是一个非常简单的想法,我将创建一个HTTP代理,在客户端和代理之间使用SSL,然后它将创建一个与客户端请求的任何网站/服务器的SSL连接,然后将该信息转发给客户端和服务器。我花了大约一天的时间来研究和编写代码。但我后来意识到,有人可能会破坏代理,使用代理必须解密和读取发送到服务器和从服务器读取数据的会话密钥 经过更多的研究,我似乎需要一个袜子代理。然而,关于socks代理的python版本的文档并不多(主要是如何连接到

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

经过更多的研究,我似乎需要一个袜子代理。然而,关于socks代理的python版本的文档并不多(主要是如何连接到socks代理)。我能够找到并读取Socks.py文件。它看起来非常适合创建客户端,但我不知道如何使用它来创建代理


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

我建议使用
requesocks
以及
stem
(假设任务)。下面是一个基于我编写的scraper的简化示例,该scraper还使用了
false\u 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将TORC文件放入
/usr/local/etc/Tor/torrc
,如果您安装了预编译包,则将TORC文件放入
/etc/Tor/torrc
。如果您安装了Tor Browser,请查找
Browser/TorBrowser/Data/Tor/torrc
在Tor浏览器目录中(在Mac OS X上,必须右键单击或命令单击Tor浏览器图标并选择“显示软件包内容”,才能显示Tor浏览器目录) 可见)

找到
torrc
文件后,需要取消注释相应的行:

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
用于密码“password”。如果要设置不同的密码(推荐),请在
torrc
文件中替换
HashedControlPassword
,注意
tor--hash password”“
的输出,其中
是要设置的密码

一旦您更改了
torrc
文件,您将需要重新启动tor以使更改生效(请注意,您实际上只需要向tor发送HUP信号,而不是重新启动它)。要重新启动它,请执行以下操作:

sudo service tor restart

我希望这对您有所帮助,至少可以让您开始寻找您想要的内容。

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

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


我已经多次阅读了一本名为O'Reilly的关于asyncio的电子书“在Python 2020中使用asyncio”,并时不时地重读一遍,试图掌握多个连接。我还刚刚开始使用Flask搜索解决方案,因为我希望我的代理服务器与Web服务器一起运行。

有多个socks服务器。在pypi.python.org上,我投入了大量的精力。我不知道这是否有什么好处,但这是一个开始。这里有非python服务器,所以您不需要自己运行。@user2458048只是想知道您是否能够找到一种方法来创建自己的socks5代理服务器,因为我正在尝试相同的方法?找到了,但尚未检查。感谢您提供了非常全面的答案,我非常感谢。问题是,我真的很想创建自己的代理。由于tor是一个非常好的软件,我可能正在用我自己的代理做什么,我喜欢自己创建东西,这样我可以更好地理解它们。