web | python反向代理tcp连接

web | python反向代理tcp连接

今天在思考如何把内网socket服务直接转发到本机的问题,说白了就是个反向代理的问题,网上一堆人写的乱七八糟,搞的相当复杂,就自己写了个tcp反向代理。

项目地址:https://github.com/Mz1z/Mrp.git

环境:
python3.7+

代码如下:

import asyncio
import sys


# 转发客户端到服务器的流量
async def trans_c2s(reader, r_writer):
	while not reader.at_eof():
		data = await reader.read(256)
		r_writer.write(data)
		await r_writer.drain()
	r_writer.close()
		
# 转发服务器到客户端的流量
async def trans_s2c(r_reader, writer):
	while not r_reader.at_eof():
		r_data = await r_reader.read(256)
		writer.write(r_data)
		await writer.drain()
	writer.close()

async def handle(reader, writer):
	addr = writer.get_extra_info('peername')
	print(f'> Receive connect: {addr}!')
	
	# 启动反向代理连接
	r_reader, r_writer = await asyncio.open_connection(r_addr, r_port)
	
	ret = await asyncio.gather(
		trans_c2s(reader, r_writer),
		trans_s2c(r_reader, writer)
	)

	print('close')
	
# 主服务器进程
async def main():
	server = await asyncio.start_server(
		handle, "0.0.0.0", port)
		
	addr = server.sockets[0].getsockname()
	print(f'Serving on {addr}')
	
	async with server:
		await server.serve_forever()
		


if __name__ == "__main__":
	if len(sys.argv) < 4:
		print('> usage: Mrp [your_port] [romote_addr] [remote_port]')
		exit(1)
	port = int(sys.argv[1])
	r_addr = sys.argv[2]
	r_port = int(sys.argv[3])
	asyncio.run(main())

posted @   Mz1  阅读(357)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示