基于 Twisted 条件的端口转发

Posted

技术标签:

【中文标题】基于 Twisted 条件的端口转发【英文标题】:Port Forward based on condition in Twisted 【发布时间】:2015-03-16 02:16:30 【问题描述】:

我正在尝试在 Twisted 中编写一个端口转发器,如果​​ IP 地址已经在缓存中,它将转发到端口 8000 并转发到另一个端口 - 如果没有,则说 4000。我已经编写了缓存,但是在使用 Twisted 向端口转发添加逻辑的位置时遇到了问题。

举个简单的例子:

class LoggingProxyServer(portforward.ProxyServer):
    def dataReceived(self, data):
        portforward.ProxyServer.dataReceived(self, data)

class LoggingProxyFactory(portforward.ProxyFactory):
    protocol = LoggingProxyServer

我应该重写什么扭曲的方法来添加缓存检查?

【问题讨论】:

@Jean-PaulCalderone 抱歉,我编辑了这个问题。用户只是 get 请求中的 ip 地址,至少最初是这样。 【参考方案1】:

ProxyServer.connectionMade 负责设置从代理进程传出的 TCP 连接。它使用其工厂的hostport 属性来决定它将使用什么作为连接尝试的目标。

如果您想改变代理的行为,这就是您需要覆盖的代码。

您可以轻松找到连接到ProxyServer 的客户端的IP 地址。 ProxyServer 实例有一个 transport 属性,该属性引用 ITransport 提供程序(如果您的代理正在侦听传入的 TCP 连接,则可能是一个 ITCPTransport 提供程序)。

Transports 有方法告诉你它们的两个端点的地址。 getHost 告诉你本地地址,getPeer 告诉你远程地址。

因此,例如,您可以编写一个条件,该条件对所有 IP 地址以 1 开头的 TCP 客户端具有一种行为,而对所有具有其他 IP 地址的 TCP 客户端具有其他行为:

if self.transport.getPeer().host.startswith("1"):
    ...
else:
    ...

【讨论】:

以上是关于基于 Twisted 条件的端口转发的主要内容,如果未能解决你的问题,请参考以下文章

Python 将 http post body 扭曲转发到 tcp 端口

基于udp端口转发程序设计

端口转发器

内网代理转发工具

基于adb的Android端口转发

ssh的代理和端口转发机制介绍