使用 python 3.6 异步的 UDP 代理服务器

Posted

技术标签:

【中文标题】使用 python 3.6 异步的 UDP 代理服务器【英文标题】:UDP Proxy server using python 3.6 async 【发布时间】:2017-01-31 19:39:46 【问题描述】:

我很想知道如何使用异步模块创建 UDP 代理服务器。我今天早些时候尝试使用 Twisted,但没有取得太大进展。我确实在这里直接使用套接字在***上找到了一些简单的解决方案,但我想知道这是否可以使用异步库。

为了清楚起见,我正在寻找的是:

第 1 步:客户端 A(可以有多个)与代理 B 通话 第 2 步:代理 B 将请求发送到服务器 C。 第三步:服务器 C 响应代理 B 9 月 4 日:代理 B 响应客户端 A。

这是我目前所拥有的:

import asyncio

class EchoServerProtocol(asyncio.DatagramProtocol):
    def connection_made(self, transport):
        self.transport = transport

    def datagram_received(self, data, addr, args=None):
        message = data
        server_addr = ('localhost', 27015)
        print('Received %r from %s' % (message, addr))
        print('Send %r to %s' % (message, server_addr))
        self.transport.sendto(data, server_addr)

loop = asyncio.get_event_loop()
print("Starting UDP server")
# One protocol instance will be created to serve all client requests
listen = loop.create_datagram_endpoint(
    EchoServerProtocol,
    local_addr=('0.0.0.0', 27016),
)
transport, protocol = loop.run_until_complete(listen)

try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

transport.close()
loop.close()

上面基本上是这样的:

https://docs.python.org/3/library/asyncio-protocol.html#udp-echo-server-protocol

我所拥有的会让你进入第 3 步,但在第 4 步当然会失败。它将它发送回服务器 C。

您会注意到,其他协议示例之一,EchoServerClientProtocol,为每个连接创建一个新实例。我认为我需要为每个连接创建一个新实例,因为我可以将原始地址存储在实例中,然后返回它。我认为这不适用于create_datagram_endpoint,或者我不知道该怎么做。

不过可能有更好的方法。

【问题讨论】:

服务器 B 应该如何知道将服务器 C 的回复转发到哪里?此外,UDP 对请求/回复模式没有多大意义,因为数据包可能会丢失。 @Vincent 我是一个 UDP 新手,但是否可以使用 socks5 保留原始发件人? 我不太了解,但是用socks5中继UDP包需要a TCP connection to the proxy and special headers for the datagrams。 @JamesR 我需要在您在此处描述的 UDP 代理实现上进行构建。你能分享什么对你有用吗? 【参考方案1】:

您需要服务器 B 的本地端点,以及每个客户端 A 的服务器 C 的远程端点。

这里是a possible implementation。

另外,你可能对this module providing high-level UDP endpoints for asyncio.感兴趣

【讨论】:

以上是关于使用 python 3.6 异步的 UDP 代理服务器的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.6 异步函数以最简单的方式循环

(转)新手写爬虫v2.5(使用代理的异步爬虫)

python asyncio异步代理池

Parrot 3.6 安装mitmproxy

python_udp_socket问题

[python]新手写爬虫v2.5(使用代理的异步爬虫)