news 2026/1/2 8:50:18

用 Netty 实现一个“内网穿透”工具:无需公网 IP,在家也能访问公司的数据库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 Netty 实现一个“内网穿透”工具:无需公网 IP,在家也能访问公司的数据库

🚀 前言:周末加班的痛

周末在家,老板突然打来电话:“线上的测试环境出 Bug 了,赶紧连一下数据库查查数据。”

你打开电脑,准备连接公司的 MySQL,突然意识到一个尴尬的问题:公司的数据库在内网,没有公网 IP。

怎么办?

  1. 跑去公司?(太惨了)
  2. 用 TeamViewer 远程控制公司电脑?(卡顿,体验极差)
  3. 买花生壳/Ngrok?(要钱,限速,还不稳定)

作为一个 Java 程序员,求人不如求己。我们手里的Netty可是高性能网络通信的神器。
今天,我就带大家用 Netty 手搓一个**“私有版 Ngrok”**。只需一台几十块钱的云服务器,就能让你在家像在公司一样,丝滑访问内网的所有服务!


🧠 核心原理:外网是怎么“钻”进内网的?

一般来说,外网无法直接访问内网,因为有 NAT(网络地址转换)网关挡着。但是,内网是可以主动访问外网的

内网穿透的核心逻辑就是:反向代理 (Reverse Proxy) + 长连接

我们需要三个角色:

  1. Proxy Server (中转站):部署在有公网 IP 的云服务器上。
  2. Proxy Client (内网助手):运行在公司的电脑上,能访问公司内网服务(如 MySQL)。
  3. User (你):在家里的电脑。

数据流向图解:

家里的你公网服务器公司内网助手公司数据库1. 建立长连接通道主动连接 Server (7000端口)认证通过,保持连接2. 发起请求连接 Server (8080端口)3. 转发请求收到 User 请求,通过长连接转发给 Client4. 内网代理Client 连接本地数据库 (3306)返回查询结果5. 转发响应将结果发回给 Server6. 响应用户Server 将结果发给 User家里的你公网服务器公司内网助手公司数据库

一句话总结:
内网 Client 像一根管子,一头插在公司的数据库上,一头插在公网 Server 上。你在家访问 Server,Server 就通过这根管子把数据“偷”回来。


💻 实战开发:Netty 代码撸起来

我们将项目分为serverclient两个模块。

1. Server 端开发 (公网中转)

Server 需要监听两个端口:

  • 7000 端口:用于接收内网 Client 的注册和长连接。
  • 8080 端口:暴露给 User 使用(也就是你在家访问的端口)。

核心 Handler 逻辑:

publicclassUserRequestHandlerextendsChannelInboundHandlerAdapter{privatefinalChannelclientChannel;// 指向内网 Client 的连接publicUserRequestHandler(ChannelclientChannel){this.clientChannel=clientChannel;}@OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){// 收到 User 发来的数据(比如 MySQL 的握手包)// 直接转发给内网 Clientif(clientChannel.isActive()){clientChannel.writeAndFlush(msg);}}}
2. Client 端开发 (内网搬运工)

Client 启动后,主动连接 Server 的 7000 端口。
当 Server 发来数据时,Client 创建一个新的连接去连本地的 MySQL (3306),然后当个**“双向搬运工”**。

publicclassProxyClientHandlerextendsChannelInboundHandlerAdapter{@OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){// 收到 Server 转发来的 User 请求// 这里的 msg 就是 ByteBuf 数据// 建立连接去连本地 MySQLBootstrapb=newBootstrap();b.group(ctx.channel().eventLoop())// 复用 EventLoop.channel(NioSocketChannel.class).handler(newChannelInitializer<SocketChannel>(){@OverrideprotectedvoidinitChannel(SocketChannelch){ch.pipeline().addLast(newLocalProxyHandler(ctx.channel()));}});ChannellocalChannel=b.connect("localhost",3306).sync().channel();// 将数据发给 MySQLlocalChannel.writeAndFlush(msg);}}

注意:这里的重点是流量透传。我们不需要解析协议(HTTP/MySQL),只需要把ByteBuf原封不动地从 A 搬到 B。


🛡️ 进阶优化:让轮子更稳

简单的转发很容易断开,我们需要加亿点点细节。

1. 心跳检测 (HeartBeat)

公网环境复杂,长连接很容易被防火墙切断。
利用 Netty 的IdleStateHandler,每隔 30 秒发送一个心跳包。

// Server 端管道添加pipeline.addLast(newIdleStateHandler(60,0,0));// Client 端管道添加pipeline.addLast(newIdleStateHandler(0,30,0));
2. 断线重连

Client 端需要监听连接断开事件channelInactive。一旦断开,开启一个定时任务,每隔 5 秒尝试重新连接 Server。

@OverridepublicvoidchannelInactive(ChannelHandlerContextctx){System.out.println("❌ 与服务器断开,5秒后重连...");ctx.channel().eventLoop().schedule(()->{connectToServer();},5,TimeUnit.SECONDS);}

🚀 效果演示

  1. 部署:把 Server 包丢到阿里云(IP: 1.2.3.4),启动。
  2. 启动:在公司电脑启动 Client,配置目标指向localhost:3306
  3. 连接
    回到家,打开 Navicat。
    • 主机:1.2.3.4(Server IP)
    • 端口:8080(暴露端口)
    • 用户名/密码:公司的数据库账号。

点击“测试连接” —— 连接成功!
速度取决于你的云服务器带宽。一般 5Mbps 的带宽足够跑满查询,体验吊打免费版的花生壳。


📝 总结

通过这个项目,我们不仅解决了一个实际痛点,更深入理解了:

  1. TCP 长连接与反向代理原理
  2. Netty 的 ByteBuf 零拷贝特性(透传数据的核心)。
  3. 多路复用(一个端口处理 N 个连接)。

技术本该如此,既要有底层的深度,也要有解决生活的温度。
以后再也不用担心回家加班连不上库了!(虽然这听起来像个悲伤的故事…)


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/1 22:41:08

ADVANCE Day22_复习日

浙大疏锦行 &#x1f4dd; Day 22 实战作业&#xff1a;全流程机器学习流水线 (The Pipeline) 1. 作业背景 经过 Day 19-21 的高强度训练&#xff0c;我们已经掌握了从数据清洗、特征工程到模型解释的核心技能。 今天&#xff08;Day 22&#xff09;是一个里程碑。我们将不再…

作者头像 李华
网站建设 2025/12/29 0:17:06

Wan2.2-T2V-A14B在太空探索主题视频生成中的宏大叙事

Wan2.2-T2V-A14B&#xff1a;当AI执笔&#xff0c;书写宇宙的视觉史诗 &#x1f30c; 你有没有想过——有一天&#xff0c;只需写下一段文字&#xff0c;就能看到“星海号”探测器穿越木星风暴的画面&#xff1f;不是CG动画师一帧帧渲染出来的&#xff0c;也不是科幻电影里的特…

作者头像 李华
网站建设 2025/12/11 14:28:24

Wan2.2-T2V-A14B模型对中医经络理论的可视化探索

Wan2.2-T2V-A14B模型对中医经络理论的可视化探索 你有没有想过&#xff0c;“气”在体内是怎么流动的&#xff1f; 我们常听老中医说“肝气郁结”“心火上炎”&#xff0c;可这“气”看不见、摸不着&#xff0c;学生背了十几年经络走向&#xff0c;还是只能靠想象。&#x1f4d…

作者头像 李华
网站建设 2026/1/1 15:13:09

MoviePilot重磅升级:PTLGS站点认证完全指南

MoviePilot重磅升级&#xff1a;PTLGS站点认证完全指南 【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot MoviePilot作为专业的影视资源管理工具&#xff0c;近期迎来了重要更新——正式支持PTLGS站点认证…

作者头像 李华
网站建设 2025/12/31 6:59:13

GenomeScope终极指南:快速掌握基因组分析工具的核心技巧

GenomeScope终极指南&#xff1a;快速掌握基因组分析工具的核心技巧 【免费下载链接】genomescope Fast genome analysis from unassembled short reads 项目地址: https://gitcode.com/gh_mirrors/ge/genomescope GenomeScope作为一款专业的基因组分析工具&#xff0c;…

作者头像 李华