⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 https://github.com/ehang-io/nps 「ehang-io」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

nps 是一款轻量级、高性能、功能强大的内网穿透代理服务器。

目前支持 tcp、udp 流量转发,可支持任何 tcp、udp 上层协议(访问内网网站、本地支付接口调试、ssh 访问、远程桌面,内网 dns 解析等等……),此外还支持内网 http 代理、内网 socks5 代理、p2p 等,并带有功能强大的 web 管理端。

功能

  • 协议支持全面,兼容几乎所有常用协议,例如 tcp、udp、http(s)、socks5、p2p、http 代理…
  • 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务
  • 控制全面,同时支持服务端和客户端控制
  • https 集成,支持将后端代理和 web 服务转成 https,同时支持多证书
  • 操作简单,只需简单的配置即可在 web ui 上完成其余操作
  • 展示信息全面,流量、系统信息、即时带宽、客户端版本等
  • 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等)
  • 域名解析具备自定义 header、404 页面配置、host 修改、站点保护、URL 路由、泛解析等功能
  • 服务端支持多用户和用户注册功能

快速开始

安装

https://github.com/ehang-io/nps/releases

下载对应的系统版本即可,服务端和客户端是单独的

服务端启动

下载完服务器压缩包后,解压,然后进入解压后的文件夹

执行安装命令

对于 linux|darwin

sudo ./nps install

对于 windows,管理员身份运行 cmd,进入安装目录

nps.exe install

默认端口

  • nps 默认配置文件使用了 80,443,8080,8024 端口
  • 80 与 443 端口为域名解析模式默认端口
  • 8080 为 web 管理访问端口
  • 8024 为网桥端口,用于客户端与服务器通信

启动

对于 linux|darwin

sudo nps start

对于 windows,管理员身份运行 cmd,进入程序目录

nps.exe start

安装后 windows 配置文件位于 C:\Program Files\nps,linux 和 darwin 位于/etc/nps

如果发现没有启动成功,可以查看日志(Windows 日志文件位于当前运行目录下,linux 和 darwin 位于/var/log/nps.log)

  • 访问服务端 ip:web 服务端口(默认为 8080)
  • 使用用户名和密码登陆(默认 admin/123,正式使用一定要更改)
  • 创建客户端

客户端连接

点击 web 管理中客户端前的+号,复制启动命令

执行启动命令,linux 直接执行即可,windows 将./npc 换成 npc.exe 用 cmd 执行 如果需要注册到系统服务可查看注册到系统服务

https://ehang-io.github.io/nps/#/use?id=注册到系统服务

配置

客户端连接后,在 web 中配置对应穿透服务即可

可以查看使用示例

使用示例

统一准备工作(必做)

  • 开启服务端,假设公网服务器 ip 为 1.1.1.1,配置文件中bridge_port为 8024,配置文件中web_port为 8080
  • 访问 1.1.1.1:8080
  • 在客户端管理中创建一个客户端,记录下验证密钥
  • 内网客户端运行(windows 使用 cmd 运行加.exe)
./npc -server=1.1.1.1:8024 -vkey=客户端的密钥

注意:

运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的bridge_port端口,telnet,netcat 这类的来检查

域名解析

适用范围:

小程序开发、微 信公 众号开发、产品演示

注意:

域名解析模式为 http 反向代理,不是 dns 服务器,在 web 上能够轻松灵活配置

假设场景:

  • 有一个域名 proxy.com,有一台公网机器 ip 为 1.1.1.1
  • 两个内网开发站点 127.0.0.1:81,127.0.0.1:82
  • 想通过(http|https://)a.proxy.com访问127.0.0.1:81,通过(http|https://)b.proxy.com访问127.0.0.1:82

使用步骤:

将*.proxy.com 解析到公网服务器 1.1.1.1

点击刚才创建的客户端的域名管理,添加两条规则规则:

  • 域名:a.proxy.com,内网目标:127.0.0.1:81,
  • 域名:b.proxy.com,内网目标:127.0.0.1:82

现在访问(http|https://)a.proxy.com,b.proxy.com即可成功

tcp 隧道

适用范围:

ssh、远程桌面等 tcp 连接场景

假设场景:

想通过访问公网服务器 1.1.1.1 的 8001 端口,连接内网机器 10.1.50.101 的 22 端口,实现 ssh 连接

使用步骤:

  • 在刚才创建的客户端隧道管理中添加一条 tcp 隧道,填写监听的端口(8001)、内网目标 ip 和目标端口(10.1.50.101:22),保存。
  • 访问公网服务器 ip(1.1.1.1),填写的监听端口(8001),相当于访问内网 ip(10.1.50.101):目标端口(22),例如:ssh -p 8001 root@1.1.1.1

udp 隧道

适用范围:

内网 dns 解析等 udp 连接场景

假设场景:

内网有一台 dns(10.1.50.102:53),在非内网环境下想使用该 dns,公网服务器为 1.1.1.1

使用步骤:

  • 在刚才创建的客户端的隧道管理中添加一条 udp 隧道,填写监听的端口(53)、内网目标 ip 和目标端口(10.1.50.102:53),保存。
  • 修改需要使用的 dns 地址为 1.1.1.1,则相当于使用 10.1.50.102 作为 dns 服务器

socks5 代理

适用范围:

在外网环境下如同使用 vpn 一样访问内网设备或者资源

假设场景:

想将公网服务器 1.1.1.1 的 8003 端口作为 socks5 代理,达到访问内网任意设备或者资源的效果

使用步骤:

  • 在刚才创建的客户端隧道管理中添加一条 socks5 代理,填写监听的端口(8003),保存。
  • 在外网环境的本机配置 socks5 代理(例如使用 proxifier 进行全局代理),ip 为公网服务器 ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了

注意:

经过 socks5 代理,当收到 socks5 数据包时 socket 已经是 accept 状态。表现是扫描端口全 open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。

http 正向代理

适用范围:

在外网环境下使用 http 正向代理访问内网站点

假设场景:

想将公网服务器 1.1.1.1 的 8004 端口作为 http 代理,访问内网网站

使用步骤:

  • 在刚才创建的客户端隧道管理中添加一条 http 代理,填写监听的端口(8004),保存。
  • 在外网环境的本机配置 http 代理,ip 为公网服务器 ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了

注意:

对于私密代理与 p2p,除了统一配置的客户端和服务端,还需要一个客户端作为访问端提供一个端口来访问

私密代理

适用范围:

无需占用多余的端口、安全性要求较高可以防止其他人连接的 tcp 服务,例如 ssh。

假设场景:

无需新增多的端口实现访问内网服务器 10.1.50.2 的 22 端口

使用步骤:

  • 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥 secrettest 和内网目标 10.1.50.2:22
  • 在需要连接 ssh 的机器上以执行命令
./npc -server=1.1.1.1:8024 -vkey=vkey -type=tcp -password=secrettest -local_type=secret

如需指定本地端口可加参数-local_port=xx,默认为2000

注意:

password 为 web 管理上添加的唯一密钥,具体命令可查看 web 管理上的命令提示

假设 10.1.50.2 用户名为 root,现在执行ssh -p 2000 root@127.0.0.1即可访问 ssh

p2p 服务

适用范围:

大流量传输场景,流量不经过公网服务器,但是由于 p2p 穿透和 nat 类型关系较大,不保证 100%成功,支持大部分 nat 类型。nat 类型检测

假设场景:

想通过访问使用端机器(访问端,也就是本机)的 2000 端口—->访问到内网机器 10.2.50.2 的 22 端口

使用步骤:

在nps.conf中设置p2p_ip(nps 服务器 ip)和p2p_port(nps 服务器 udp 端口)

注:若 p2p_port 设置为 6000,请在防火墙开放 6000~6002(额外添加 2 个端口)udp 端口

在刚才刚才创建的客户端中添加一条 p2p 代理,并设置唯一密钥 p2pssh

在使用端机器(本机)执行命令

./npc -server=1.1.1.1:8024 -vkey=123 -password=p2pssh -target=10.2.50.2:22

如需指定本地端口可加参数-local_port=xx,默认为2000

注意:

password 为 web 管理上添加的唯一密钥,具体命令可查看 web 管理上的命令提示

假设内网机器为 10.2.50.2 的 ssh 用户名为 root,现在在本机上执行ssh -p 2000 root@127.0.0.1即可访问机器 2 的 ssh,如果是网站在浏览器访问 127.0.0.1:2000 端口即可。

开源地址

https://github.com/ehang-io/nps

文章目录
  1. 1. 功能
  2. 2. 快速开始
    1. 2.0.0.1. 安装
    2. 2.0.0.2. 服务端启动
    3. 2.0.0.3. 客户端连接
    4. 2.0.0.4. 配置
  • 3. 使用示例
    1. 3.0.0.1. 统一准备工作(必做)
    2. 3.0.0.2. 域名解析
    3. 3.0.0.3. tcp 隧道
    4. 3.0.0.4. udp 隧道
    5. 3.0.0.5. socks5 代理
    6. 3.0.0.6. http 正向代理
    7. 3.0.0.7. 私密代理
    8. 3.0.0.8. p2p 服务
  • 4. 开源地址