Python穿越http代理
在有http代理的网络中,如公司的内网,链接外部网络都会有一层防火墙,拦截一些非工作网站。
如果要越过防火墙的拦截,可以通过在http代理上创建一层socket加密通道实现。
越过http代理链接socket
通常的socket链接是客户端直接请求链接服务端;在有http代理的网络中,
socket的建立方式会有所不同。如下代码:
# echo server code
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 9980 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
服务端代码不用针对http代码做任何修改,因为服务端本身不知道客户端是否是通过http代码来的链接。
# echo client code
import socket
import time
HOST = 'proxy.server.com' # The remote host
PORT = 8080 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT)) # connect http proxy server
proxy_data = 'CONNECT %s:%s HTTP/1.0\n\n' % ('106.106.106.71', '9980')
s.sendall(proxy_data.encode())
data = s.recv(1024)
# if b'HTTP/1.0 200 ' in data: connect to server success
print('connect result: ', repr(data))
while True:
s.sendall(b'hello world')
data = s.recv(1024)
print('Received', repr(data))
time.sleep(2)
s.close()
客户端通过http代理,只需修改socket的建立地址。比如要连接192.168.1.88:1234这个地址,中间有层http代理,代理地址为proxy.server.com:8080。客户需要创建socket连接到proxy.server.com:8080,并发送”CONNECT 106.106.106.71:9980 HTTP/1.0\n\n”新建立的socket,在接收到200 OK的结果码,表示代理服务器连接106.106.106.71:9980成功。之后通过socket发送的数据,代理服务器都会发送到目标地址中。