Python穿越http代理

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发送的数据,代理服务器都会发送到目标地址中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值