Github地址:https://github.com/ehang-io/nps/

说明文档:https://ehang-io.github.io/nps/#/?id=nps


安装要求:

服务器端:需要安装在一个有公网IP的服务器上,系统为Linux/Windows/Mac均可。

客户端:一般安装在一个内网的VPS服务器、NAS或Windows/Mac电脑上使用。


服务器端安装

安装包安装(Linux):

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

下载对应的系统版本(32位:带有368字样,64位:带有64字样)

如:xxx_amd64_server.tar.gz,代表64位;xxx_386_server.tar.gz,代表32位,具体还是以实际情况为准。

查看系统为32位还是64位命令(群晖NAS/Linux):uname -a


下载并解压服务端:

wget https://github.com/cnlh/nps/releases/download/v0.0.14/linux_amd64_server.tar.gz && tar zxvf linux_amd64_server.tar.gz
编辑配置文件:
cd nps
vi conf/nps.conf


配置文件参数如下:

web_portweb管理端口
web_passwordweb界面管理密码
web_usernameweb界面管理账号
web_base_urlweb管理主路径,用于将web管理置于代理子路径后面
bridge_port服务端客户端通信端口
https_proxy_port域名代理https代理监听端口
http_proxy_port域名代理http代理监听端口
auth_keyweb api密钥
bridge_type客户端与服务端连接方式kcp或tcp
public_vkey客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式
ip_limit是否限制ip访问,true或false或忽略
flow_store_interval服务端流量数据持久化间隔,单位分钟,忽略表示不持久化
log_level日志输出级别
auth_crypt_key获取服务端authKey时的aes加密密钥,16位
p2p_ip服务端Ip,使用p2p模式必填
p2p_portp2p模式开启的udp端口
pprof_ipdebug pprof 服务端ip
pprof_portdebug pprof 端口
disconnect_timeout客户端连接超时,单位 5s,默认值 60,即 300s = 5mins

详细配置文件信息,请参考:https://ehang-io.github.io/nps/#/server_config


安装服务器端(注册到系统服务开机启动、守护进程):./nps install

启动服务器端:./nps start

重启服务器端:./nps restart

停止服务器端:./nps stop

更新服务器端:nps-update update

配置文件重载:./nps reload

默认访问服务器端web管理界面http://ip:8080

用户名admin,密码123。如需修改,编辑conf/nps.conf配置文件,然后重启服务


注意:

如果打不开Web界面,防火墙需要开放相应端口

Centos 6系统
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
service iptables save
service iptables restart

CentOS 7系统
firewall-cmd --zone=public --add-port=8080/tcp --permanent 
firewall-cmd --reload

对于有些服务器,比如阿里云,腾讯云,华为云等,还需要在服务器管理面板上开放相应端口。


安装包安装(Windows)

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

下载对应的系统版本(32位:带有368字样,64位:带有64字样)

如:windows_amd64_server.tar.gz,代表64位;windows_386_server.tar.gz,代表32位,具体还是以实际情况为准。


下载并解压服务器端:

https://github.com/ehang-io/nps/releases/download/v0.26.7/windows_amd64_server.tar.gz

编辑配置文件:

conf/nps.conf

配置文件参数同上


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

安装服务器端(注册到系统服务开机启动、守护进程):nps.exe install

启动服务器端:nps.exestart

重启服务器端:nps.exerestart

停止服务器端:nps.exestop

更新服务器端:nps-update.exe update

配置文件重载:nps.exe reload


客户端安装

安装包安装(Linux):

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

下载对应的系统版本(32位:带有368字样,64位:带有64字样)

如:xxx_amd64_server.tar.gz,代表64位;xxx_386_server.tar.gz,代表32位,具体还是以实际情况为准。

查看系统为32位还是64位命令(群晖NAS/Linux):uname -a


无配置文件模式(此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置)

比如服务端公网IP为1.1.1.1,服务端配置文件中tcpport为8024

 ./npc -server=1.1.1.1:8024 -vkey=web界面中显示的密钥


配置文件模式(此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理)

下载并解压客户端:

wget https://github.com/ehang-io/nps/releases/download/v0.26.7/linux_amd64_client.tar.gz && tar linux_amd64_client.tar.gz

编辑配置文件:
cd nps
vi conf/nps.conf


安装客户端(注册到系统服务开机启动、守护进程): ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)

启动客户端: ./npc start

停止客户端: ./npc stop

更新客户端:npc-update update

卸载客户端:./npc uninstall

如果需要更换命令内容需要先卸载,再重新注册


安装包安装(Windows):
releases地址:https://github.com/ehang-io/nps/releases
下载对应的系统版本(32位:带有368字样,64位:带有64字样)
如:xxx_amd64_server.tar.gz,代表64位;xxx_386_server.tar.gz,代表32位,具体还是以实际情况为准。
查看系统为32位还是64位命令(群晖NAS/Linux):uname -a

无配置文件模式(此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置)
比如服务端公网IP为1.1.1.1,服务端配置文件中tcpport为8024,管理员身份运行cmd,进入安装目录
npc.exe -server=1.1.1.1:8024 -vkey=web界面中显示的密钥

配置文件模式(此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理)
下载并解压客户端:
https://github.com/ehang-io/nps/releases/download/v0.26.7/windows_amd64_client.tar.gz

使用管理员身份运行cmd,进入安装目录
安装客户端(注册到系统服务(开机启动、守护进程)):npc.exe install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)

启动客户端:npc.exe start

停止客户端:npc.exe stop

更新客户端:npc-update.exe update

卸载客户端:npc.exe uninstall

如果需要更换命令内容需要先卸载,再重新注册

详细配置文件信息,请参考:https://ehang-io.github.io/nps/#/use?id=配置文件说明


使用场景
域名解析

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

详细说明→点击查看


tcp隧道模式
适用:ssh、远程桌面等tcp连接场景。
详细说明→点击查看


udp隧道模式
适用:内网dns解析等udp连接场景。
详细说明→点击查看


http正向代理
适用:在外网环境下使用http正向代理访问内网站点。
详细说明→点击查看


socks5代理
适用: 在外网环境下如同使用vpn一样访问内网设备或者资源。
详细说明→点击查看


私密代理

适用: 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。
详细说明→点击查看


p2p服务

适用: 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。
详细说明→点击查看


扩展功能
缓存支持
对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。
即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在nps.conf中设置http_cache=true,并设置http_cache_length(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数)

数据压缩支持
由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。
所有模式均支持数据压缩
在web管理或客户端配置文件中设置


加密传输
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。
nps现在默认每次启动时随机生成tls证书,用于加密传输


站点保护
域名代理模式所有客户端共用一个http服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps将通过 Http Basic Auth 来保护,访问时需要输入正确的用户名和密码。
在web管理或客户端配置文件中设置

host修改
由于内网站点需要的host可能与公网域名不一致,域名代理支持host修改功能,即修改request的header中的host字段。
使用方法:在web管理中设置

自定义header
支持对header进行新增或者修改,以配合服务的需要

404页面配置
支持域名解析模式的自定义404页面,修改/web/static/page/error.html中内容即可,暂不支持静态文件等内容

流量限制
支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务 ,域名代理会返回404页面,其他代理会拒绝连接,使用该功能需要在nps.conf中设置allow_flow_limit,默认是关闭的。

带宽限制
支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡,使用该功能需要在nps.conf中设置allow_rate_limit,默认是关闭的。

负载均衡
本代理支持域名解析模式和tcp代理的负载均衡,在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡

端口白名单
为了防止服务端上的端口被滥用,可在nps.conf中配置allow_ports限制可开启的端口,忽略或者不填表示端口不受限制,格式:
allow_ports=9001-9009,10001,11000-12000


端口范围映射
当客户端以配置文件的方式启动时,可以将本地的端口进行范围映射,仅支持tcp和udp模式,例如:
[tcp]
mode=tcp
server_port=9001-9009,10001,11000-12000
target_port=8001-8009,10002,13000-14000
逗号分隔,可单个或者范围,注意上下端口的对应关系,无法一一对应将不能成功

端口范围映射到其他机器
[tcp]
mode=tcp
server_port=9001-9009,10001,11000-12000
target_port=8001-8009,10002,13000-14000
target_ip=10.1.50.2
填写target_ip后则表示映射的该地址机器的端口,忽略则便是映射本地127.0.0.1,仅范围映射时有效

KCP协议支持
在网络质量非常好的情况下,例如专线,内网,可以开启略微降低延迟。如需使用可在nps.conf中修改bridge_type为kcp ,设置后本代理将开启udp端口(bridge_port)
注意:当服务端为kcp时,客户端连接时也需要使用相同配置,无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp

域名泛解析
支持域名泛解析,例如将host设置为*.proxy.com,a.proxy.com、b.proxy.com等都将解析到同一目标,在web管理中或客户端配置文件中将host设置为此格式即可。

URL路由
本代理支持根据URL将同一域名转发到不同的内网服务器,可在web中或客户端配置文件中设置,此参数也可忽略,例如在客户端配置文件中
[web1]
host=a.proxy.com
target_addr=127.0.0.1:7001
location=/test
[web2]
host=a.proxy.com
target_addr=127.0.0.1:7002
location=/static
Copy to clipboardErrorCopied
对于a.proxy.com/test将转发到web1,对于a.proxy.com/static将转发到web2

限制ip访问
如果将一些危险性高的端口例如ssh端口暴露在公网上,可能会带来一些风险,本代理支持限制ip访问。
使用方法: 在配置文件nps.conf中设置ip_limit=true,设置后仅通过注册的ip方可访问。
ip注册:
方式一: 在需要访问的机器上,运行客户端
./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2
Copy to clipboardErrorCopied
time为有效小时数,例如time=2,在当前时间后的两小时内,本机公网ip都可以访问nps代理。
方式二: 此外nps的web登陆也可提供验证的功能,成功登陆nps web admin后将自动为登陆的ip注册两小时的允许访问权限。
注意: 本机公网ip并不是一成不变的,请自行注意有效期的设置,同时同一网络下,多人也可能是在公用同一个公网ip。

客户端最大连接数
为防止恶意大量长连接,影响服务端程序的稳定性,可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对socks5、http正向代理、域名代理、tcp代理、udp代理、私密代理生效,使用该功能需要在nps.conf中设置allow_connection_num_limit=true,默认是关闭的。

客户端最大隧道数限制
nps支持对客户端的隧道数量进行限制,该功能默认是关闭的,如需开启,请在nps.conf中设置allow_tunnel_num_limit=true。

端口复用
在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将bridge_port、 http_proxy_port、 https_proxy_port 、web_port都设置为同一端口,也能正常使用。
使用时将需要复用的端口设置为与bridge_port一致即可,将自动识别。
如需将web管理的端口也复用,需要配置web_host也就是一个二级域名以便区分

多路复用
nps主要通信默认基于多路复用,无需开启。
多路复用基于TCP滑动窗口原理设计,动态计算延迟以及带宽来算出应该往网络管道中打入的流量。 由于主要通信大多采用TCP协议,并无法探测其实时丢包情况,对于产生丢包重传的情况,采用较大的宽容度, 5分钟的等待时间,超时将会关闭当前隧道连接并重新建立,这将会抛弃当前所有的连接。 在Linux上,可以通过调节内核参数来适应不同应用场景。
对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 高并发下可根据[Linux系统限制](## Linux系统限制) 调整
对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 tcp_syn_retries, tcp_retries1, tcp_retries2 高并发同上 nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接

环境变量渲染
npc支持环境变量渲染以适应在某些特殊场景下的要求。

在无配置文件启动模式下: 设置环境变量
export NPC_SERVER_ADDR=1.1.1.1:8024
export NPC_SERVER_VKEY=xxxxx
直接执行./npc即可运行

在配置文件启动模式下:
[common]
server_addr={{.NPC_SERVER_ADDR}}
conn_type=tcp
vkey={{.NPC_SERVER_VKEY}}
auto_reconnection=true
[web]
host={{.NPC_WEB_HOST}}
target_addr={{.NPC_WEB_TARGET}}
在配置文件中填入相应的环境变量名称,npc将自动进行渲染配置文件替换环境变量

健康检查
当客户端以配置文件模式启动时,支持多节点的健康检查。配置示例如下
[health_check_test1]
health_check_timeout=1
health_check_max_failed=3
health_check_interval=1
health_http_url=/
health_check_type=http
health_check_target=127.0.0.1:8083,127.0.0.1:8082

[health_check_test2]
health_check_timeout=1
health_check_max_failed=3
health_check_interval=1
health_check_type=tcp
health_check_target=127.0.0.1:8083,127.0.0.1:8082
health关键词必须在开头存在

第一种是http模式,也就是以get的方式请求目标+url,返回状态码为200表示成功
第一种是tcp模式,也就是以tcp的方式与目标建立连接,能成功建立连接表示成功
如果失败次数超过health_check_max_failed,nps则会移除该npc下的所有该目标,如果失败后目标重新上线,nps将自动将目标重新加入。

health_check_timeout 健康检查超时时间
health_check_max_failed 健康检查允许失败次数
health_check_interval 健康检查间隔
health_check_type 健康检查类型
health_check_target 健康检查目标,多个以逗号(,)分隔
health_check_type 健康检查类型
health_http_url 健康检查url,仅http模式适用

日志输出
日志输出级别
对于npc:
-log_level=0~7 -log_path=npc.log
LevelEmergency->0  LevelAlert->1
LevelCritical->2 LevelError->3
LevelWarning->4 LevelNotice->5
LevelInformational->6 LevelDebug->7
默认为全输出,级别为0到7

对于nps:
在nps.conf中设置相关配置即可

pprof性能分析与调试
可在服务端与客户端配置中开启pprof端口,用于性能分析与调试,注释或留空相应参数为关闭。
默认为关闭状态

自定义客户端超时检测断开时间
客户端与服务端间会间隔5s相互发送延迟测量包,这个时间间隔不可修改。 可修改延迟测量包丢包的次数,默认为60也就是5分钟都收不到一个延迟测量回包,则会断开客户端连接。 值得注意的是需要客户端的socket关闭,才会进行重连,也就是当客户端无法收到服务端的fin包时,只有客户端自行关闭socket才行。 也就是假如服务端设置为较低值,而客户端设置较高值,而此时服务端断开连接而客户端无法收到服务端的fin包,客户端也会继续等着直到触发客户端的超时设置。

在nps.conf或npc.conf中设置disconnect_timeout即可,客户端还可附带-disconnect_timeout=60参数启动



点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部