搜索

python内网穿透源代码

发表于 2026-10-17 06:17:52 来源:烟消火灭网

用Python写内网穿透,内网核心代码其实不到100行。穿透很多人以为这事得靠frp、源代ngrok这类工具,内网但底层原理就是穿透两个socket对接——一个对外监听,一个对内转发。源代我去年在一个客户现场,内网他们内网有台Windows Server跑着ERP,穿透外网要临时访问,源代装frp又过不了杀软。内网最后用Python写了个简易穿透,穿透跑了一周没掉线。源代

先说清楚结构。内网公网服务器上跑一个服务端,穿透监听两个端口:一个给外部客户端连,源代一个给内网机器连。内网机器主动连上服务端的控制端口,保持长连接。外部请求进来时,服务端通过这条长连接把数据转给内网机器,内网机器再请求本地服务,原路返回。

服务端代码大致这样:

import socket, threading def handle_client(client, target_conn): while True: data = client.recv(4096) if not data: break target_conn.send(data) def handle_target(target, client_conn): while True: data = target.recv(4096) if not data: break client_conn.send(data) def main(): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('0.0.0.0', 8000)) server.listen(5) print('等待内网机器连接...') target_conn, addr = server.accept() print(f'内网机器已连接: { addr}') public = socket.socket(socket.AF_INET, socket.SOCK_STREAM) public.bind(('0.0.0.0', 9000)) public.listen(5) print('等待外部请求...') while True: client_conn, caddr = public.accept() print(f'外部请求来自: { caddr}') t1 = threading.Thread(target=handle_client, args=(client_conn, target_conn)) t2 = threading.Thread(target=handle_target, args=(target_conn, client_conn)) t1.start() t2.start() 

这里有个坑:两个线程同时读写同一个target_conn,数据会串。实际用的时候得加锁,或者用队列做缓冲。我当时图省事,直接上了个queue.Queue,每个方向一个队列,读写分离。

内网端代码更简单,连上服务端后,收到请求就转发给本地服务:

import socket, threading def forward(local, remote): while True: data = local.recv(4096) if not data: break remote.send(data) def main(): remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM) remote.connect(('公网IP', 8000)) while True: # 收到服务端转来的请求,连本地服务 local = socket.socket(socket.AF_INET, socket.SOCK_STREAM) local.connect(('127.0.0.1', 8080)) t1 = threading.Thread(target=forward, args=(local, remote)) t2 = threading.Thread(target=forward, args=(remote, local)) t1.start() t2.start() 

实际跑起来会发现一个问题:每个请求都新建本地连接,HTTP短连接还行,长连接就崩了。后来我改成复用本地连接,用select做多路复用,代码量翻倍但稳定多了。

带宽是另一个瓶颈。Python的socket转发,单线程吞吐大概20MB/s,加密后掉到5MB/s。如果只是远程桌面或SSH,完全够用。传大文件就得考虑asyncio或者直接上C扩展。

安全方面,裸奔的socket谁都能连。至少加个握手验证,比如内网端连上后先发个预共享密钥,服务端校验通过才建立转发通道。再狠一点,用ssl.wrap_socket套一层TLS,性能损失大概30%,但能防嗅探。

这套代码我用了半年,后来换成了基于asyncio的版本,并发从50涨到2000。Python写内网穿透,入门容易,调优得靠实际压测。别指望它能替代frp,但临时救急、学习原理,足够了。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by python内网穿透源代码,烟消火灭网   sitemap

回顶部