diff --git a/README.md b/README.md index 6233fe7..050e54a 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,8 @@ # nps ![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) ![](https://img.shields.io/github/license/cnlh/nps.svg) -nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**,可实现在非内网环境下如同使用vpn一样访问内网资源和设备的效果。 +nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 -目前市面上提供类似服务的有花生壳、TeamView、GoToMyCloud等等,但要使用第三方的公网服务器就必须为第三方付费,并且这些服务都有各种各样的限制,此外,由于数据包会流经第三方,因此对数据安全也是一大隐患。 - - -go语言编写,无第三方依赖,各个平台都已经编译在release中。 ## 背景 ![image](https://github.com/cnlh/nps/blob/master/image/web.png?raw=true) @@ -28,6 +24,16 @@ go语言编写,无第三方依赖,各个平台都已经编译在release中 * [安装](#安装) * [编译安装](#源码安装) * [release安装](#release安装) +* [使用示例(以web主控模式为主)](#使用示例) + * [统一准备工作](#统一准备工作) + * [http|https域名解析](#域名解析) + * [内网ssh连接即tcp隧道](#tcp隧道) + * [内网dns解析即udp隧道](#udp隧道) + * [内网socks5代理](#socks5代理) + * [内网http正向代理](#http正向代理) + * [内网安全私密代理](#私密代理) + * [p2p穿透](#p2p服务) + * [简单的内网文件访问服务](#文件访问模式) * [服务端](#web管理模式) * [服务端启动](#服务端启动) * [服务端测试](#服务端测试) @@ -35,13 +41,7 @@ go语言编写,无第三方依赖,各个平台都已经编译在release中 * [web管理](#web管理) * [服务端停止或重启](#服务端停止或重启) * [配置文件说明](#服务端配置文件) - * [详细使用说明](#详细说明) - * [http|https域名解析](#域名解析) - * [tcp隧道](#tcp隧道) - * [udp隧道](#udp隧道) - * [socks5代理](#socks5代理) - * [http正向代理](#http正向代理) - * [私密代理](#私密代理) + * [使用https](#使用https) * [与nginx配合](#与nginx配合) * [关闭http|https代理](#关闭代理) @@ -121,6 +121,135 @@ go语言编写,无第三方依赖,各个平台都已经编译在release中 > go build cmd/npc/npc.go +## 使用示例 + +### 统一准备工作(必做) +- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中`bridgePort`为8284,配置文件中`httpport`为8080 +- 访问1.1.1.1:8080 +- 在客户端管理中创建一个客户端,记录下验证密钥 +- 内网客户端运行(windows使用cmd运行加.exe) + +```shell +./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 +``` + +### 域名解析 + +**适用范围:** 小程序开发、微信公众号开发、产品演示 + +**假设场景:** +- 有一个域名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 +- 点击刚才创建的客户端的域名管理,添加两条规则规则:1、域名:`a.proxy.com`,内网目标:`127.0.0.1:81`,2、域名:`b.proxy.com`,内网目标:`127.0.0.1:82` + +现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 + +**https:** 如需使用https请在配置文件中将https端口设置为443,和将对应的证书文件路径添加到配置文件中,上面添加的这条记录将会把http、https都转发到内网目标 + +#### 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为127.0.0.1,则相当于使用10.1.50.202作为dns服务器 + +#### socks5代理 + + +**适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 + +**假设场景:** +想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果 + +**使用步骤** +- 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。 +- 在外网环境的本机配置socks5代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了 + +#### http正向代理 + +**适用范围:** 在外网环境下使用http正向代理访问内网站点 + +**假设场景:** +想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站 +**使用步骤** + +- 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。 +- 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了 + +#### 私密代理 + +**适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。 + +**假设场景:** +无需新增多的端口实现访问内网服务器10.1.50.2的22端口 + +**使用步骤** +- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥和内网目标10.1.50.2:22 +- 在需要连接ssh的机器上以配置文件模式启动客户端,内容如下 + +```ini +[common] +server=1.1.1.1:8284 +tp=tcp +vkey=123 +[secret_ssh] +password=1111 +port=1000 +``` +**注意:** secret前缀必须存在,password为web管理上添加的唯一密钥 + +假设用户名为root,现在执行`ssh -p 1000 root@127.0.0.1`即可访问ssh + +#### p2p服务 + +**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,成功率一般,可穿透所有非对称型nat。 + +**假设场景:** +内网1机器ip为10.1.50.2 内网2机器ip为10.2.50.2 + +想通过访问机器1的2001端口---->访问到内网2机器的22端口 + +**使用步骤** +- 在`nps.conf`中设置`serverIp`和`p2pPort` +- 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh +- 在需要连接的机器上(即机器1)以配置文件模式启动客户端,内容如下 + +```ini +[common] +server=1.1.1.1:8284 +tp=tcp +vkey=123 +[p2p_ssh] +password=p2pssh +port=2001 +``` +**注意:** p2p前缀必须存在,password为web管理上添加的唯一密钥 + +假设机器2用户名为root,现在在机器1上执行`ssh -p 2001 root@127.0.0.1`即可访问机器2的ssh + + + + ## web管理模式 ![image](https://github.com/cnlh/nps/blob/master/image/web2.png?raw=true) @@ -180,161 +309,6 @@ cryptKey | 获取服务端authKey时的aes加密密钥,16位 serverIp| 服务端Ip,使用p2p模式必填 p2pPort|p2p模式开启的udp端口 -### 详细说明 - -#### 域名解析 - -**适用范围:** 小程序开发、微信公众号开发、产品演示 - -**假设场景:** -- 有一个域名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 -- 例如配置文件中bridgePort为8284 - -**使用步骤** -- 将*.proxy.com解析到公网服务器1.1.1.1 -- 在客户端管理中创建一个客户端,记录下验证密钥 -- 点击该客户端的域名管理,添加两条规则规则:1、域名:`a.proxy.com`,内网目标:`127.0.0.1:81`,2、域名:`b.proxy.com`,内网目标:`127.0.0.1:82` -- 内网客户端运行 - -```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 - -**https:** 如需使用https请在配置文件中将https端口设置为443,和将对应的证书文件路径添加到配置文件中,上面添加的这条记录将会把http、https都转发到内网目标 - -#### tcp隧道 - - -**适用范围:** ssh、远程桌面等tcp连接场景 - -**假设场景:** - 想通过访问公网服务器1.1.1.1的8001端口,连接内网机器10.1.50.101的22端口,实现ssh连接,例如配置文件中bridgePort为8284 - -**使用步骤** -- 在客户端管理中创建一个客户端,记录下验证密钥 -- -内网客户端运行 -```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -- 在该客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),选择压缩方式,保存。 -- 访问公网服务器ip(127.0.0.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,例如配置文件中bridgePort为8284 - -**使用步骤** -- 在客户端管理中创建一个客户端,记录下验证密钥 -- -内网客户端运行 -```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -- 在该客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),选择压缩方式,保存。 -- 修改本机dns为127.0.0.1,则相当于使用10.1.50.202作为dns服务器 - -#### socks5代理 - - -**适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 - -**假设场景:** -想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果,例如配置文件中bridgePort为8284 - -**使用步骤** -- 在客户端管理中创建一个客户端,记录下验证密钥 -- -内网客户端运行 -```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -- 在该客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),验证用户名和密码自行选择(建议先不填,部分客户端不支持,proxifer支持),选择压缩方式,保存。 -- 在外网环境的本机配置socks5代理,ip为公网服务器ip(127.0.0.1),端口为填写的监听端口(8003),即可畅享内网了 - -#### http正向代理 - -**适用范围:** 在外网环境下使用http代理访问内网站点 - -**假设场景:** -想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站,例如配置文件中bridgePort为8284 - -**使用步骤** -- 在客户端管理中创建一个客户端,记录下验证密钥 -- -内网客户端运行 -```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -- 在该客户端隧道管理中添加一条http代理,填写监听的端口(8004),选择压缩方式,保存。 -- 在外网环境的本机配置http代理,ip为公网服务器ip(127.0.0.1),端口为填写的监听端口(8004),即可访问了 - -#### 私密代理 - -**适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的TCP服务,例如ssh。 - -**假设场景:** -无需新增多的端将映射内网服务器10.1.50.2的22端口,公网服务器ip为1.1.1.1,网桥端口为8284 - -**使用步骤** -- 在客户端管理中创建一个客户端,记录下验证密钥 -- 内网客户端运行 -``` -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -- 添加一条私密代理,并设置唯一密钥和内网目标10.1.50.2:22 -- 在需要连接ssh的机器上以配置文件模式启动客户端,内容如下 - -```ini -[common] -server=1.1.1.1:8284 -tp=tcp -vkey=123 -[secret_ssh] -password=1111 -port=1000 -``` -**注意:** secret前缀必须存在,password为web管理上添加的唯一密钥 - -假设用户名为root,现在执行`ssh -p 1000 root@127.0.0.1`即可访问ssh - -#### p2p服务 - -**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,成功率不高。 - -**假设场景:** -内网1机器ip为10.1.50.2 内网2机器ip为10.2.50.2 口,公网服务器ip为1.1.1.1,网桥端口为8284 - -想通过访问机器1的2001端口---->访问到内网2机器的22端口 - -**使用步骤** -- 在客户端管理中创建一个客户端,记录下验证密钥 -- 内网机器2客户端运行 -``` -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -- 添加一条p2p代理,并设置唯一密钥p2pssh -- 在需要连接的机器上(即机器1)以配置文件模式启动客户端,内容如下 - -```ini -[common] -server=1.1.1.1:8284 -tp=tcp -vkey=123 -[p2p_ssh] -password=p2pssh -port=2001 -``` -**注意:** p2p前缀必须存在,password为web管理上添加的唯一密钥 - -假设机器2用户名为root,现在执行`ssh -p 2001 root@127.0.0.1`即可访问机器2的ssh - - - ### 使用https 在配置文件中将httpsProxyPort设置为443或者其他你想配置的端口,和将对应的证书文件路径添加到配置文件中,然后就和http代理一样了,例如 @@ -413,12 +387,12 @@ web上可以自定义客户端连接的密钥,但是必须具有唯一性 ### 客户端启动 #### 无配置文件模式 -此模式的各种配置在服务端web管理中完成 +此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 ``` ./npc -server=ip:port -vkey=web界面中显示的密钥 ``` #### 配置文件模式 -此模式使用nps的公钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 +此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 ``` ./npc -config=npc配置文件路径 ``` @@ -427,12 +401,12 @@ web上可以自定义客户端连接的密钥,但是必须具有唯一性 ##### 全局配置 ```ini [common] -server=127.0.0.1:8284 +server=1.1.1.1:8284 tp=tcp vkey=123 username=111 password=222 -compress=snappy +compress=true crypt=true rate_limit=10000 flow_limit=100 @@ -446,7 +420,7 @@ tp | 与服务端通信模式(tcp或kcp) vkey|服务端配置文件中的密钥(非web) username|socks5或http(s)密码保护用户名(可忽略) username|socks5或http(s)密码保护密码(可忽略) -compress|是否压缩传输(snappy或空或忽略) +compress|是否压缩传输(true或false或忽略) crypt|是否加密传输(true或false或忽略) rate_limit|速度限制,可忽略 flow_limit|流量限制,可忽略 @@ -455,8 +429,11 @@ max_conn|最大连接数,可忽略 ##### 域名代理 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [web1] -host=a.o.com +host=a.proxy.com target=127.0.0.1:8080,127.0.0.1:8082 host_change=www.proxy.com header_set_proxy=nps @@ -472,8 +449,11 @@ header_xxx|请求header修改或添加,header_proxy表示添加header proxy:np ##### tcp隧道模式 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [tcp] -mode=tcpServer +mode=tcp target=127.0.0.1:8080 port=9001 ``` @@ -486,8 +466,11 @@ target|内网目标 ##### udp隧道模式 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [udp] -mode=udpServer +mode=udp target=127.0.0.1:8080 port=9002 ``` @@ -499,8 +482,11 @@ target|内网目标 ##### http代理模式 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [http] -mode=httpProxyServer +mode=httpProxy port=9003 ``` 项 | 含义 @@ -510,8 +496,11 @@ port | 在服务端的代理端口 ##### socks5代理模式 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [socks5] -mode=socks5Server +mode=socks5 port=9004 ``` 项 | 含义 @@ -521,6 +510,9 @@ port | 在服务端的代理端口 ##### 私密代理模式 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [secret_ssh] mode=secret password=ssh2 @@ -528,13 +520,16 @@ target=10.1.50.2:22 ``` 项 | 含义 ---|--- -mode | secretServer +mode | secret password | 唯一密钥 target|内网目标 ##### p2p代理模式 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [p2p_ssh] mode=p2p password=ssh2 @@ -546,10 +541,14 @@ mode | p2p password | 唯一密钥 target|内网目标 + ##### 文件访问模式 -利用nps提供一个公网可访问的本地文件服务 +利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动 ```ini +[common] +server=1.1.1.1:8284 +vkey=123 [file] mode=file port=9100 @@ -778,7 +777,7 @@ time为有效小时数,例如time=2,在当前时间后的两小时内,本 ![image](https://github.com/cnlh/nps/blob/master/image/cpu2.png?raw=true) ### 额外消耗连接数 -为了最大化的提升效率和并发,客户端与服务端之间仅两条tcp连接,减少建立连接的时间消耗和多余tcp连接对机器性能的影响。 +为了最大化的提升效率和并发,客户端与服务端之间仅两条tcp连接,减少建立连接的时间消耗和多余socket连接对机器性能的影响。 ## webAPI @@ -813,6 +812,7 @@ POST /auth/getauthkey [webAPI文档](https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3) ## 贡献 +- ==**有朋友愿意欢迎参与到制作docker、图标、文档翻译等工作**== - 如果遇到bug可以直接提交至dev分支 - 使用遇到问题可以通过issues反馈 - 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 diff --git a/web/static/page/error.html b/web/static/page/error.html index bb50deb..c063fc3 100644 --- a/web/static/page/error.html +++ b/web/static/page/error.html @@ -2,9 +2,9 @@
-