搜索

python实现内网穿透

发表于 2026-10-17 02:33:03 来源:烟消火灭网

我的实现树莓派放在老家客厅角落,跑着家庭监控脚本。内网人在上海,穿透想看一眼画面,实现得先让电信光猫做端口映射,内网再找运营商要公网IP——折腾一晚上,穿透发现宽带套餐压根不提供。实现这就是内网内网穿透要解决的问题:让外网设备直接访问内网服务,不需要公网IP,穿透不需要改路由器配置。实现

Python写穿透工具其实不复杂,内网核心就一个思路:让内网机器主动向外网服务器建立一条长连接,穿透外网服务器再把这个连接“借”给想要访问内网的实现客户端。打比方的内网话,你家门牌号外人找不到,穿透但你家有个电话线一直通到小区保安室,访客打保安室电话,保安再把话筒递给你。

具体实现,需要三部分代码。外网服务器用socket监听两个端口:一个等客户端连,一个等内网节点连。内网节点启动后,主动连服务器的8000端口,然后进入死循环,不断收发数据。客户端想访问内网服务,就连服务器的9000端口。服务器收到客户端请求,就把这条socket和内网节点的socket对接起来——用两个线程互相转发数据。Python的socket库原生支持这种双向转发,代码量不到100行。

有个细节容易踩坑:TCP是流协议,没有消息边界。你从内网节点读数据,可能一次读半截,也可能一次读了两段拼一起。转发时最好固定缓冲区大小,比如每次读4096字节,写出去,再读再写。别想一次性把整个HTTP请求读完再转发,那样会卡死——内网服务端是持续输出的,穿透层必须做成管道,而不是仓库。

我自己的实现里加了个心跳机制。内网节点每30秒给服务器发一个字节的“保活包”,服务器如果90秒没收到心跳,就断开这条连接,等着内网节点重连。不然家里路由器NAT表超时,长连接被静默切断,你还蒙在鼓里。用Python的threading模块给每条转发链路起两个线程,一个管上行一个管下行,主线程只管accept。

性能方面,Python的GIL确实让并发上限不高,但穿透场景下,单条连接转发1MB/s的流量没问题。我拿它转发过SSH会话,延迟体感在50ms左右,敲命令不觉得卡。要是拿来传大文件,建议加一层zlib压缩,代价是CPU占用升高,但树莓派跑得动。

安全性得自己补。穿透服务器暴露在公网上,任何人都能连你的9000端口。至少加个token验证:内网节点连接时先发一段预设密钥,客户端连接时也发,服务器校验通过才转发。用hmac模块做哈希,别明文存密钥。要是给公司用,最好再套一层TLS,Python的ssl模块直接包在socket外面就行,改动不大。

写完后我把它丢在树莓派上跑了一个月,期间老家断电两次,重启后脚本用systemd守护进程自动拉起,没出过岔子。后来发现一个尴尬事:监控画面是看到了,但树莓派摄像头对着客厅,我在上海看的是我妈在沙发上嗑瓜子——她完全不知道我能看到。这工具确实好用,但用之前最好想清楚,你穿透出去的到底是什么。

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

Copyright © 2016 Powered by python实现内网穿透,烟消火灭网   sitemap

回顶部