NPS 是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持 tcp、udp 流量转发,可支持任何 tcp、udp 上层协议(访问内网网站、本地支付接口调试、ssh 访问、远程桌面,内网dns解析等等……),此外还支持内网 http 代理、内网 socks5 代理、p2p 等,并带有功能强大的 web 管理端。
- 做微信公众号开发、小程序开发等—-> 域名代理模式
- 想在外网通过 ssh 连接内网的机器,做云服务器到内网服务器端口的映射,—-> tcp 代理模式
- 在非内网环境下使用内网 dns,或者需要通过 udp 访问内网机器等—-> udp 代理模式
- 在外网使用 HTTP 代理访问内网站点—-> http 代理模式
- 搭建一个内网穿透 ss,在外网如同使用内网 vpn 一样访问内网资源或者设备—-> socks5 代理模式
特点
- 全面的协议支持,与几乎所有常用协议兼容,例如tcp,udp,http(s),socks5,p2p,http代理…
- 全面的平台兼容性(Linux,Windows,MacOS,群晖等),仅支持作为系统服务进行安装。
- 全面控制,允许客户端和服务器控制。
- Https集成,支持将后端代理和Web服务转换为https,并支持多个证书。
- 只需在Web ui上进行简单配置即可完成大多数要求。
- 完整的信息显示,例如流量,系统信息,实时带宽,客户端版本等。
- 强大的扩展功能,一切可用(缓存,压缩,加密,流量限制,带宽限制,端口重用等)
- 域名解析具有诸如自定义标题,404页面配置,主机修改,站点保护,URL路由和全景解析之类的功能。
- 服务器上的多用户和用户注册支持。
安装
Github地址:https://github.com/cnlh/nps
详细命令:https://ehang-io.github.io/nps/#/?id=nps
通常内网穿透工具都有服务端和客户端,安装要求如下:
服务端:需要安装在一个有公网IP的服务器上,系统为Linux/Windows/Mac均可。客户端:一般安装在一个内网的VPS服务器或Windows/Mac电脑上使用。
1、编译安装
提示:编译安装主要讲的Linux系统,其它系统(Win/Mac,也包括Linux)建议直接使用作者编译好的文件即可。
安装Go
语言:
#Debian/Ubuntu系统apt-get -y install golang#创建目录并定义GOPATH环境变量指向该目录mkdir ~/workspaceecho 'export GOPATH="$HOME/workspace"' >> ~/.bashrcsource ~/.bashrc#CentOS/RHEL系统yum -y install golang#创建目录并定义GOPATH环境变量指向该目录。mkdir ~/workspaceecho 'export GOPATH="$HOME/workspace"' >> ~/.bashrcsource ~/.bashrc
安装git
:
#Debian/Ubuntu系统apt-get -y install git#CentOS/RHEL系统yum -y install git
安装源码:
go get github.com/cnlh/nps
编译服务端和客户端:
#进入指定目录cd ~/workspace/src/github.com/cnlh/nps#编译服务端go build cmd/nps/nps.go#编译客户端go build cmd/npc/npc.go
编译好了后,就会在当前目录生成npc
或nps
二进制文件了,就可以直接拿来用了。
编译的时候可能出现的问题解决方法:
#只拿一种常见的错误做例子,有时候可能会出现很多种这样的提示lib/kcp/crypt.go:14:2: cannot find package "golang.org/x/crypto/pbkdf2" in any of: /usr/lib/go-1.7/src/golang.org/x/crypto/pbkdf2 (from $GOROOT) /root/workspace/src/golang.org/x/crypto/pbkdf2 (from $GOPATH)#意思是缺少这种包,然后记住提示的地址,比如上面的golang.org/x/crypto/pbkdf2,有时候也会提示的github地址。然后再使用命令go get golang.org/x/crypto/pbkdf2命令安装一下就行了。
2、直接安装
除了自己编译外,作者也直接提供了编译好的文件给你使用,文件下载地址:点击进去,然后再根据自己的系统架构下载对应的最新版服务端和客户端。
如果对于Linux
服务器还是不知道怎么选择的,这里拿Vultr
、搬瓦工大多数VPS
为例。先使用命令getconf LONG_BIT
获取系统版本,32
位就选386
,64
就选amd64
,具体还是以实际情况为准。
服务端使用
这里博主使用的是Vultr Linux x64
服务器,直接使用命令:
#记得复制前先将下面链接替换成当前最新版地址cd ~#下载并解压服务端wget https://github.com/cnlh/nps/releases/download/v0.0.14/linux_amd64_server.tar.gz && tar zxvf linux_amd64_server.tar.gz#编辑配置文件cd npsnano conf/nps.conf
配置文件参数如下:
#web管理端口httpport#web界面管理密码password#服务端客户端通信端口bridePort#ssl certFile绝对路径pemPath#ssl keyFile绝对路径keyPath#域名代理https代理监听端口httpsProxyPort#域名代理http代理监听端口httpProxyPort#web api免验证IP地址authip#客户端与服务端连接方式kcp或tcpbridgeType
然后启动服务端:
./nps install./nps start#重启/停止服务端./nps stop|restart
然后打开地址http://ip:8080
访问管理界面,具体端口以自己修改的为准,再使用密码登录进去,默认为123
。
#如果打不开Web界面,就需要开启防火墙,一般CentOS系统出现情况最多#Centos 6系统iptables -I INPUT -p tcp --dport 8080 -j ACCEPTservice iptables saveservice iptables restart#CentOS 7系统firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
对于有些服务器,比如阿里云,谷歌云等,还需要在服务器管理面板上开放Web
端口才行。
客户端使用
1、Linux系统
#比如下载的客户端文件在根目录,先进入根目录cd ~#启动客户端,比如服务端公网IP为1.1.1.1,服务端配置文件中tcpport为8284./npc -server=1.1.1.1:8284 -vkey=客户端的密钥
2、Windows系统
首先按住Win+R
,输入cmd
进入命令窗口,然后使用命令:
#比如下载的客户端文件在D盘,先进入到D盘cd /d d:#启动客户端,比如服务端公网IP为1.1.1.1,服务端配置文件中tcpport为8284npc.exe -server=1.1.1.1:8284 -vkey=客户端的密钥
至于Mac
系统启动参考上面就行。
使用场景
关于使用场景,Github
文档写的很清楚了,这里大概的说下。
1、tcp隧道模式
适用:想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,或者做微信公众号开发、小程序开发等。
详细教程→点击查看。
2、udp隧道模式
适用:在非内网环境下使用内网dns,或者需要通过udp访问内网机器等。
详细教程→点击查看。
3、http代理模式
适用:在外网使用HTTP代理访问内网站点。
详细教程→点击查看。
4、socks5代理模式
适用:搭建一个内网穿透55,在外网如同使用内网v皮n一样访问内网资源或者设备。
详细教程→点击查看。
相关功能
1、数据压缩支持
由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY
形式的压缩。
- 所有模式均支持数据压缩,可以与加密同时使用
- 开启此功能会增加
cpu
和内存消耗 - 在
server
端加上参数-compress=snappy
(或在web
管理中设置)
2、加密传输
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh
协议等,通过设置配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。
- 开启此功能会增加
cpu
和内存消耗 - 在
server
端加上参数-crypt=true
(或在web管理中设置)
3、站点保护
域名代理模式所有客户端共用一个http
服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps
将通过Http Basic Auth
来保护,访问时需要输入正确的用户名和密码。
web
管理中可配置
4、host修改
由于内网站点需要的host
可能与公网域名不一致,域名代理支持host
修改功能,即修改request
的header
中的host
字段。
- 在
web
管理中设置
5、自定义header
支持对header
进行新增或者修改,以配合服务的需要。
6、404页面配置
支持域名解析模式的自定义404
页面,修改/web/static/page/error.html
中内容即可,暂不支持静态文件等内容。
7、流量限制
支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务,域名代理会返回404
页面,其他会拒绝连接。
8、带宽限制
支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡。
9、负载均衡
本代理支持域名解析模式的负载均衡,在web
域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡。
10、守护进程
本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux
、darwin
、windows
。
./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数
11、KCP协议支持KCP
是一个快速可靠协议,能以比TCP
浪费10%-20%
的带宽的代价,换取平均延迟降低30%-40%
,在弱网环境下对性能能有一定的提升。可在app.conf
中修改bridgeType
为kcp
。
- 当服务端为
kcp
时,客户端连接时也需要加上参数-type=kcp
。
该工具很强大,更多的使用可以自行研究,如果有人知道Frp
管理面板的话,可以给博主提供下。