当前位置: 首页 > 软件库 > 程序开发 > 网络工具包 >

EntDIY-NAT

基于 Netty 实现的 NAT 内网穿透访问软件
授权协议 Apache
开发语言 Java
所属分类 程序开发、 网络工具包
软件类型 开源软件
地区 国产
投 递 者 仇和蔼
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

EntDIY-NAT 是一个类似 Ngrok ,基于 Netty 实现的NAT内网穿透访问软件。

entdiy-nat-common - 公共组件类代码模块

entdiy-nat-server - Server服务端代码模块

entdiy-nat-client - Client客户端代码模块

entdiy-nat-tester - 可选模块,作为client穿透的目标测试服务,开发调试用途

devops - 提供一套简单的脚本和配置实现软件快速部署运行

项目托管同步更新GIT资源库:

https://github.com/xautlx/entdiy-nat

https://gitee.com/xautlx/entdiy-nat

快速开始

特别提示:以下相关命令基于Mac或Linux等环境,Windows系统请参考相关脚本自行转换命令执行。

  • 获取整个项目,并进入项目主目录

  • 运行构建:

mvn install
  • 查阅 devops/entdiy-nat-server/application-server.yml 中相关配置参数,可按照注释含义按需调整。 如果要体验实际效果可把entdiy-nat-server目录整体复制到公网服务器,简单体验也可以在当前机器直接运行。 启动运行Server端:
./devops/entdiy-nat-server/nat-server-cli.sh restart
  • 查阅 devops/entdiy-nat-client/application-client.yml 中相关配置参数, 默认穿透访问当前主机的22端口SSH服务和3306MySQL服务,可按照注释含义按需调整。 启动运行Client端:
./devops/entdiy-nat-client/nat-client-cli.sh restart
  • TCP协议穿透访问测试,以 122 端口SSH访问穿透内容主机或者用工具以 13306 端口访问MySQL:
ssh -p 122 root@127.0.0.1

功能列表

已实现功能列表:

  • TCP协议穿透 - TCP协议网络访问穿透,如常见的SSH、MySQL等,当然不局限于这些服务,只要是TCP协议理论均可穿透访问
  • HTTP协议穿透 - 典型网页服务HTTP协议穿透支持
  • 连接池处理 - Server端与Client端的Proxy Channel采用简化连接池实现,提升穿透连接的初始化连接速度和效率
  • Client重连机制 - 由于网络异常或Server端重启,需要Client重连机制来实现连接中断后自动重连Server
  • Client/Secret&Token安全认证机制 - 基于client和secret及token机制实现基础的访问认证支持

路线计划

待实现功能列表:

  • HTTPS协议穿透 - 典型网页服务HTTPS协议穿透支持
  • Server端Tunnel定义控制 - 典型的内网穿透都是由Client定义隧道,但是对于一些业务场景需要由Server进行全局的各Client端的隧道定义实现灵活的Server端管控支持
  • SSL证书支持 - 引入SSL证书支持,提升穿透访问数据安全性

项目故事

关于内网穿透

对于内网穿透本身是一个很通用的需求概念, 目前比较主流常用的有 NgrokFRP 以及 花生壳、向日葵 之类的软件,在此不再赘述,具体可以自行网上搜索了解。

那内网穿透这个概念和这个项目有什么关系呢?且继续往下看:

关于物联设备接入

以典型的人脸门禁设备接入,不同厂商提供不同SDK实现与设备通讯,不外乎两种典型访问模式:

  • 在设备配置定义服务端的IP和端口,通俗讲就是设备找服务器

  • 在服务端配置定义设备的IP和端口,通俗讲就是服务器找设备

应该说两种模式各有优缺点很好理解不再细说,不同厂商一般也就是两种模式二选一,例如海康设备就是典型的服务器找设备模式。

一般项目规模初期或是企业内部应用环境,服务器和各物联设备都在一个局域网体系,通过厂商SDK实现了各种设备接入服务运作良好。 但是突然有一天出现需求:需要把当前网络之外的设备,诸如其他异地厂区的设备接入到总部系统。 例如以往通过局域网IP和端口访问的海康门禁设备,突然走不通了,公网IP服务器如何访问到其他网络的设备成了个问题。

当然,对于土豪企业通过VPN来解决此问题的方式不在我们讨论之列。 通过向海康客服咨询得到的反馈也是通过端口映射、为设备分配公网IP、或者采用海康的平台软件中转对接等几种方式, 基于公网IP和端口映射这类方式涉及软硬件成本问题,一般实际可操作性不强,一般很自然的方式就会联想到在异地设备所在局域网络架设一个中转服务来实现。

无论是通过厂商的中转对接软件,亦或是基于厂商SDK实现一套部署在设备所在局域网的中转服务程序,我们可以俗称为物联网关程序,其部署所在硬件可俗称物联网关设备, 可以理解为是一种典型的"胖客户端"模式,而这种模式主要问题是:

  • 胖客户端模式升级更新很麻烦,客户端中转程序有任何Bug修复那都需要把所有网关设备都手工更新一遍或者实现一套完善的自动更新分发机制;

  • 例如原先已经完整实现了海康SDK设备接入程序,但是现在新增胖客户端中间层,势必又得基于这套网关程序额外定制开发一套接入程序;

因此,有必要尝试一种极简的"瘦客户端"模式来解决上述问题,结合作者多年Ngrok的使用经验,感觉以内网穿透的概念来实现这个"瘦客户端"是一个比较合适的选择: 服务端以内网穿透的方式访问设备,"感觉上"就好像是之前连接局域网设备一样, 客户端唯一做的事情就是实现内网穿透通讯数据转发,不做任何业务处理,程序稳定无需频繁更新, 同时直接沿用原先已成型局域网设备接入程序,无需客户端或服务端新增定制接入开发。

为啥重复造轮子呢?

既然上面已经有类似这样的内网穿透的成熟软件,为啥又重复造个轮子呢?原因如下:

  • 诸如开源版本Ngrok基本都是以Client端定义Tunnel穿透隧道,而从上述业务背景来看,一般是需要从Server服务端集中管理设备穿透配置信息, 以及后期业务扩展支持更多高级管理特性,有必要定制一个持续可维护的项目;

  • 主流开源的ngrok、frp等都是基于go语言的,作为一个Java技术栈人员,面对Netty的火热,也算是乎手痒痒造就了这个项目 :)

因此,如果你是对于Java/Netty感兴趣、对于内网穿透感兴趣,可以关注探讨。 当然,项目时间不长,还没有Ngrok和FRP之类软件的完整和成熟,请注意斟酌评估应用风险。

  • 目录 一丶静态NAT---一对一的NAT 二丶动态NAT---多对多的NAT 三丶NAPT (PAT)---网络地址端口转换 四丶端口映射   在IP地址空间中,A, B, C三类地址中各有一部分地址,他们被称为私有地址(私网IP地址),其余的被称为公有地址(公网IP地址)。 A: 10.0.0.0 - 10.255.255.255 —相当于一个完整的A类网段 B:172.16.0.0 - 172

  • 配置地址池 : &ltH3C&gtsystem-view [H3C]nat address-group group-number start-add end-add 配置一对一静态地址转换 1. &ltH3C&gtsystem-view [H3C]nat static local-ip(本地IP) global-ip(通用IP) [H3C]interface (端口号) [H3C-inter]na

  • iptables -t nat -vnL是什么命令? 用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号 iptables -L 粗略列出 filter 表所有链及所有规则 iptables -t nat -vxnL PREROUTING 用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解 iptables -t nat -F PREROUTIN

  • 错误原因:  在防火墙中默认 nat 是 REJECT的,所以端口映射被拒绝。 解决方法: vim /etc/sysconfig/iptables ##注释掉下面这一行,这行的意思是拒绝掉所有的FORWARD,拒绝的提示信息是icmp-host-prohibited(禁止) #-A FORWARD -j REJECT --reject-with icmp-host-prohibited #重启i

  • src-nat定义与作用 src-nat是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址。 snat中几个参数的含义 action 这是说明用的哪种转换方式,通常我们用masqurade,nat这两种,在特殊情况下用accept(主要是内网中有公网地址存在的情况)方法 参数 说明 protocol 说明对哪些传输协进行转换(通常有tcp,udp等) out-interface 说明通过

  • 故障原因: 利用tomct镜像启动容器时报错: [root@localhost Tomcat]# docker run -d --name tomcat2 -p 1217:8080 tomcat:centos 0556dfeca0ba77452a7d93546cf65b8b96d3e294916dab798438caedd1efb8dc docker: Error response from da

  • docker启动容器的时候报错: Error response from daemon: driver failed programming external connectivity on endpoint gitlab (ae0173d5b30d37059a2a6bf9dabff6055f8024606252d7290f21f4772767655f): (iptables failed: ip

 相关资料
  • 我知道这个话题并不新鲜。虽然存在各种信息,但健壮的解决方案并没有出现(至少我没有找到)。我有一个用python3编写的P2P守护进程,pie上的最后一个元素是通过TCP连接NAT后面的两个客户端。我得此主题得参考资料: https://bford.info/pub/net/P2pnat/ 如何使两个客户机在连接了一个汇点服务器后直接连接? TCP穿孔问题 到目前为止我所做的: 服务器: 现在,当前

  • 问题内容: 我试图在Java中实现UDP-Holepunching的简单草图以测试其概念,并稍后在我的C / C ++应用程序中使用它。 从Wikipedia来说,我的理解是:A和B是未定义网络结构背后的客户端,C是著名的公共可访问服务器。 A将数据包发送到服务器C,服务器保存其IP地址和端口。C将获得A的NAT的公共IP地址。这样做,A前面的NAT将创建一条路由,该路由会将此端口上的所有数据包传

  • 我正在尝试用Boost::ASIO实现NAT打孔。根据我的理解,NAT穿孔器的工作原理是这样的(UDP/TCP): 客户端A绑定到端口并连接到服务器S,客户端B执行相同操作。 当S同时接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A。 a和B接收对方的ip和端口,现在它们从同一端口向对方发送消息并形成连接(因为它们正在等待回复?) 如果没有成功的或,我似乎无法运行任何。当然,当目标端口没

  • NAT网关能够为公有云VPC网络中虚拟机提供IP地址转换功能,使虚拟机可以访问外网或提供互联网服务。 NAT网关能够为公有云VPC网络中虚拟机提供IP地址转换功能,使虚拟机可以共享弹性公网IP访问Internet或使虚拟机提供互联网服务。目前支持纳管阿里云和华为云平台的NAT网关。 NAT网关提供SNAT(Source Network Address Translation,源网络地址转换)、DN

  • 本文向大家介绍SSH端口转发实现内网穿透的实现,包括了SSH端口转发实现内网穿透的实现的使用技巧和注意事项,需要的朋友参考一下 我们局域网的机器能够访问外网,但是外网不能访问内网。因为内网访问互联网时候能确定外网的地址,外网却不能确定我们局域网内的具体地址。(ip地址有限)如果 我们在访问外网的时候,这个链接让他保持、不断,那么这个链接就相当于我们建了一条路,内网数据能出去,外网数据能进来,ssh

  • nat

    �� Natls �� Why Natls? Showing file permissions Showing file size Showing the date that the file was modified last Showing the user that the file belongs to Showing the group that the file belongs to