在连接请求中包裹数据包,直到到达最后一个代理

时间:2017-09-03 08:10:04

标签: python python-3.x sockets proxy

我总是问自己,代理链如何构建这样的代理链:

我的电脑 - > proxy1 - > proxy2 - > proxy3 - > proxy4 - > proxy5 - >站点

这个程序怎样才能使所有这些链都链接起来,并且请求通过所有这些代理发送到网站,并且答案通过所有这些代理转到我的电脑上?这可能是使用套接字库创建代理链:

mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

或其他类似的图书馆?

我想知道它是如何工作的,因为我知道代理链是用C语言编写的,因为我只知道Python,所以我无法分析源代码。

1 个答案:

答案 0 :(得分:2)

代理链背后的主要思想是代理允许您构建到另一个系统的隧道。例如,如果要通过HTTP代理A和SOCKS4代理B访问系统T,请执行以下操作:

  • 创建代理A的TCP连接(即套接字)。
  • 执行HTTP CONNECT请求以建立代理B的隧道 - 有关CONNECT的详细信息,请参阅RFC 2817。建立此隧道后,您的套接字仍然连接到代理A,但代理A会将所有数据发送到代理B,反之亦然。
  • 在套接字上发送SOCKS4标头以通过代理B建立另一个隧道。此SOCKS4标头将通过套接字从您的系统发送到代理A,代理A然后将其转发给代理B.然后,B将连接到代理B.最终目标T基于此标题中的信息,然后将其收到的任何数据(通过代理A从程序中获取)转发给T,反之亦然。有关SOCKS协议的更多信息,请参阅Wikipedia

从那时起,您从套接字发送到代理A的任何数据都将转发到代理B,然后转发到目标T.类似的T会将其响应发送回B,然后将其发送回A,然后将其发送给你的申请。

  

这是否可以使用套接字库创建代理链:

    mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
     

或其他类似的图书馆?

从上面的描述中可以看出,需要采取措施

  • 创建一个套接字
  • 将套接字连接到代理A
  • 通过A创建隧道代理B - 使用HTTP或SOCKS协议
  • 类似通过[A,B]创建隧道代理C
  • 类似地通过[A,B,C]到D
  • 创建隧道
  • ...直到您的最后一个代理被指示将隧道构建到最终目标T

只要您具备HTTP和SOCKS协议的相关知识,就可以在Python中轻松实现。或者你可以简单地将你的python程序包装到类似于任何其他程序的代理链中。这将神奇地挂钩连接并为您构建隧道。