论如何用Python实现反向代理1024 · Issue #5 · bieberg0n/blog · GitHub

您所在的位置:网站首页 python反向代理教程 论如何用Python实现反向代理1024 · Issue #5 · bieberg0n/blog · GitHub

论如何用Python实现反向代理1024 · Issue #5 · bieberg0n/blog · GitHub

2023-07-04 03:10| 来源: 网络整理| 查看: 265

现在实现反向代理主要都是使用Nginx,google一下用Python实现的版本,多数都是靠Flask+requests.这样实现,too young.遇到post请求怎么办?

下面示范一下如何用无脑tcp转发实现反向代理,实例网站为1024,基于Python3.

首先,开一个tcp server服务器,监听1024端口:

import socket s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('0.0.0.0', 1024)) s.listen(1500)

然后,接受一个浏览器发来的连接,无脑接收http请求包:

while 1: conn ,addr = s.accept() headers = '' while 1: buf = conn.recv(2048).decode('utf-8') headers += buf if len(buf) < 2048: break

修改一下headers,把目标host(127.0.0.1:1024)改成1024的域名,关闭长连接和压缩,方便修改服务器返回的网页:

headers = headers.replace('127.0.0.1:1024', 't66y.com')\ .replace('keep-alive', 'close')\ .replace('gzip','')

新开一个tcp,连接1024,发送http请求:

s1 = socket.socket() s1.connect(('t66y.com', 80)) s1.sendall(headers.encode())

接收网页:

while 1: try: buf = s1.recv(1024*8) except socket.timeout as e: print(e) break resp += buf if not buf or\ buf.startswith(b'WebSocket') and buf.endswith(b'\r\n\r\n'): break

修改网页内容,替换host为本机:

resp = resp.replace(b'Content-Encoding: gzip\r\n', b'')\ .replace(b'Transfer-Encoding: chunked\r\n', b'')\ .replace(b't66y.com', b'bjgong.tk:1024')

最后,把网页返回给浏览器:

conn.sendall(resp) conn.close()

代码跑起来后,浏览器打开 http://127.0.0.1:1024/index.php ,呈现出来的就是1024的主页,excited! 代码全文如下:

import socket def main(): s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('0.0.0.0', 1024)) s.listen(1500) while 1: conn, addr = s.accept() print(addr) headers = '' while 1: buf = conn.recv(2048).decode('utf-8') headers += buf if len(buf) < 2048: break headers = headers.replace('127.0.0.1:1024', 't66y.com')\ .replace('keep-alive', 'close')\ .replace('gzip','') print(headers) s1 = socket.socket() s1.connect(('t66y.com', 80)) s1.sendall(headers.encode()) resp = b'' while 1: try: buf = s1.recv(1024*8) except socket.timeout as e: print(e) break resp += buf if not buf or\ buf.startswith(b'WebSocket') and buf.endswith(b'\r\n\r\n'): break resp = resp.replace(b'Content-Encoding: gzip\r\n', b'')\ .replace(b't66y.com', b'bjgong.tk:1024') print('send to', addr) conn.sendall(resp) conn.close() main()

这个简陋的反向代理不支持https的网站,性能也不好,有待优化.自己在家示范时请把1024的域名(t66y.com)改成其他网站,不然是上不去的2333 想挂到vps上的话改127.0.0.1为你的域名或ip(没有域名的话)就行了.

EOF



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3