一、简介
- web管理模式,可配置多条tcp、udp隧道,多个域名代理等等—-> web管理模式
- 内网多站点配合代理。—-> http反向代理请求
- 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,或者做微信公众号开发、小程序开发等—->tcp隧道模式
- 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等—->udp隧道模式
- 在外网使用HTTP代理访问内网站点—->http代理模式
- 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备—-> socks5代理模式
二、特点
- 支持gzip、snappy压缩,减小传输过程流量消耗
- 支持多站点配置,兼容多个内网网站,可处理相互之间的跳转包含关系
- 断线自动重连
- 支持多路传输,提高并发
- 跨站自动匹配替换
- 支持tcp隧道,提升访问效率
- 支持udp隧道
- 支持http代理
- 支持内网穿透sock5代理,配合proxifer可达到vpn的效果,在外网访问内网资源或者设备,同时可以设置用户名和密码验证
- 强大的web管理界面,可方便的设置的和管理隧道
- 支持同时开多条tcp、udp隧道等等,且只需要开一个客户端和服务端
- 支持一个服务端,多个客户端模式
三、安装方法
- release安装
- 源码安装
- 安装源码
go get github.com/cnlh/easyProxy
- 编译(无第三方模块)
go build
四、使用方法
- 服务端
./easyProxy -mode=webServer -tcpport=8284 -vkey=DKibZF5TXvic1g3kY
名称 | 含义 |
---|---|
mode | 运行模式 |
vkey | 验证密钥 |
tcpport | 服务端与客户端通信端口 |
- 客户端
./easyProxy -server=ip:port -vkey=DKibZF5TXvic1g3kY
- 配置
- 服务端
./easyProxy -mode=webServer -tcpport=8284
名称 | 含义 |
---|---|
mode | 运行模式 |
tcpport | 服务端与客户端通信端口 |
- 客户端
- 配置
配置文件/conf/app.conf
名称 | 含义 |
---|---|
httpport | web管理端口 |
password | web界面管理密码 |
hostPort | 域名代理模式监听端口 |
TCP隧道模式
场景及原理
- 内网机器10.1.50.203提供了web服务80端口
- 有VPS一个,公网IP:123.206.77.88
使用
- 服务端
./easyProxy -mode=tunnelServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024 -target=10.1.50.203:80
名称 | 含义 |
---|---|
mode | 运行模式(client、server不写默认client) |
vkey | 验证密钥 |
tcpport | 服务端与客户端通信端口 |
httpport | 外部访问端口 |
target | 目标地址,格式如上 |
- 客户端
./easyProxy -server=ip:port -vkey=DKibZF5TXvic1g3kY
udp隧道模式
场景及原理
- 内网机器A提供了DNS解析服务,10.1.50.210:53端口
- 有VPS一个,公网IP:123.206.77.88
使用
- 服务端
./easyProxy -mode=udpServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=53 -target=10.1.50.210:53
名称 | 含义 |
---|---|
mode | 运行模式(client、server不写默认client) |
vkey | 验证密钥 |
tcpport | 服务端与客户端通信端口 |
httpport | 公网vps的访问端口 |
target | 目标地址,格式如上 |
- 客户端
./easyProxy -server=ip:port -vkey=DKibZF5TXvic1g3kY
HTTP代理请求
场景及原理
- 访问a.server.com和访问10.1.50.203的80端口相同
- 访问b.server.com和访问10.1.50.202的80端口相同
- 访问c.server.com和访问10.1.50.201的80端口相同
使用
- 服务端
./easyProxy -mode=httpServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024
名称 | 含义 |
---|---|
mode | 运行模式(client、server不写默认client) |
vkey | 验证密钥 |
tcpport | 服务端与客户端通信端口 |
httpport | 代理的http端口(与nginx配合使用) |
- 客户端
建立配置文件 config.json
./easyProxy -server=ip:port -config=config.json -vkey=DKibZF5TXvic1g3kY
名称 | 含义 |
---|---|
config | 配置文件路径 |
配置文件config.json
{
"SiteList": [
{
"host": "a.ourcauc.com",
"url": "10.1.50.203",
"port": 80
},
{
"host": "b.ourcauc.com",
"url": "10.1.50.202",
"port": 80
},
{
"host": "c.ourcauc.com",
"url": "10.1.50.203",
"port": 80
}
],
"Replace": 0
}
名称 | 含义 |
---|---|
SiteList | 本地解析的域名列表 |
host | 域名地址 |
url | 内网代理的地址 |
port | 内网代理的地址对应的端口 |
Replace | 是否自动匹配替换(查看场景) |
nginx代理配置示例
upstream nodejs {
server 127.0.0.1:8024;
keepalive 64;
}
server {
listen 80;
server_name a.ourcauc.com b.ourcauc.com c.ourcauc.com ;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass http://nodejs;
}
}
域名配置示例
-a A 123.206.77.88
-b A 123.206.77.88
-c A 123.206.77.88
跨站自动匹配替换说明
注意:开启可能导致不应该被替换的内容被替换,请谨慎开启.
socks5代理模式
场景及原理
使用
- 服务端
./easyProxy -mode=sock5ServerServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024
名称 | 含义 |
---|---|
mode | 运行模式(client、server不写默认client) |
vkey | 验证密钥 |
tcpport | 服务端与客户端通信端口 |
httpport | 代理的http端口(socks5连接端口) |
u | 验证的用户名 |
p | 验证的密码 |
-u=user -p=password
- 客户端
./easyProxy -server=ip:port -vkey=DKibZF5TXvic1g3kY
- 需要使用内网代理的机器
配置sock5代理即可,ip为外网服务器ip,端口为httpport,即可在外网环境使用内网啦!也可使用proxifer等全局代理软件。
http代理模式
场景及原理
使用
- 服务端
./easyProxy -mode=httpProxyServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024
名称 | 含义 |
---|---|
mode | 运行模式(client、server不写默认client) |
vkey | 验证密钥 |
tcpport | 服务端与客户端通信端口 |
httpport | http代理连接端口 |
- 客户端
./easyProxy -server=ip:port -vkey=DKibZF5TXvic1g3kY
- 需要使用内网代理的机器
配置HTTP代理即可,ip为外网服务器ip,端口为httpport,即可在外网环境访问内网啦!
数据压缩支持
场景及原理
注意点
- 所有模式均支持数据压缩
如何使用
- 在server端加上参数 -compress=gzip,例如在TCP隧道模式
./easyProxy -mode tunnelServer -vkey DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024 -target=10.1.50.203:80 -compress=gzip
操作系统支持
-------------
一款带Web面板的轻量级、高性能内网穿透工具-nps使用教程
Web
面板的穿透工具nps
,之前叫easyProxy
,只是改名了而已,该工具是一款使用go
语言编写的轻量级、功能强大的内网穿透服务器。支持tcp
、udp
流量转发,支持内网http
、socks5
代理,同时支持snappy
压缩(节省带宽和流量)、站点保护、加密传输、多路复用、header
修改等。同时还支持web
图形化管理。安装
服务端:需要安装在一个有公网IP的服务器上,系统为Linux/Windows/Mac均可。
客户端:一般安装在一个内网的VPS服务器或Windows/Mac电脑上使用。
提示:编译安装主要讲的Linux系统,其它系统(Win/Mac,也包括Linux)建议直接使用作者编译好的文件即可。
Go
语言:#Debian/Ubuntu系统
apt-get -y install golang
#创建目录并定义GOPATH环境变量指向该目录
mkdir ~/workspace
echo 'export GOPATH="$HOME/workspace"' >> ~/.bashrc
source ~/.bashrc
#CentOS/RHEL系统
yum -y install golang
#创建目录并定义GOPATH环境变量指向该目录。
mkdir ~/workspace
echo 'export GOPATH="$HOME/workspace"' >> ~/.bashrc
source ~/.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命令安装一下就行了。
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 nps
nano conf/app.conf
#web管理端口
httpport
#web界面管理密码
password
#服务端客户端通信端口
bridePort
#ssl certFile绝对路径
pemPath
#ssl keyFile绝对路径
keyPath
#域名代理https代理监听端口
httpsProxyPort
#域名代理http代理监听端口
httpProxyPort
#web api免验证IP地址
authip
#客户端与服务端连接方式kcp或tcp
bridgeType
./nps start
#重启/停止服务端
./nps stop|restart
http://ip:8080
访问管理界面,具体端口以自己修改的为准,再使用密码登录进去,默认为123
。#如果打不开Web界面,就需要开启防火墙,一般CentOS系统出现情况最多
#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
Web
端口才行。客户端使用
#比如下载的客户端文件在根目录,先进入根目录
cd ~
#启动客户端,比如服务端公网IP为1.1.1.1,服务端配置文件中tcpport为8284
./npc -server=1.1.1.1:8284 -vkey=客户端的密钥
首先按住
Win+R
,输入cmd
进入命令窗口,然后使用命令:#比如下载的客户端文件在D盘,先进入到D盘
cd /d d:
#启动客户端,比如服务端公网IP为1.1.1.1,服务端配置文件中tcpport为8284
npc.exe -server=1.1.1.1:8284 -vkey=客户端的密钥
Mac
系统启动参考上面就行。使用场景
Github
文档写的很清楚了,这里大概的说下。适用:想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,或者做微信公众号开发、小程序开发等。
适用:在非内网环境下使用内网dns,或者需要通过udp访问内网机器等。
适用:在外网使用HTTP代理访问内网站点。
适用:搭建一个内网穿透55,在外网如同使用内网v皮n一样访问内网资源或者设备。
相关功能
由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持
SNNAPY
形式的压缩。- 所有模式均支持数据压缩,可以与加密同时使用
- 开启此功能会增加
cpu
和内存消耗 - 在
server
端加上参数-compress=snappy
(或在web
管理中设置)
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了
ssh
协议等,通过设置配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。- 开启此功能会增加
cpu
和内存消耗 - 在
server
端加上参数-crypt=true
(或在web管理中设置)
域名代理模式所有客户端共用一个
http
服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps
将通过Http Basic Auth
来保护,访问时需要输入正确的用户名和密码。web
管理中可配置
由于内网站点需要的
host
可能与公网域名不一致,域名代理支持host
修改功能,即修改request
的header
中的host
字段。- 在
web
管理中设置
支持对
header
进行新增或者修改,以配合服务的需要。支持域名解析模式的自定义
404
页面,修改/web/static/page/error.html
中内容即可,暂不支持静态文件等内容。支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务,域名代理会返回
404
页面,其他会拒绝连接。支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡。
本代理支持域名解析模式的负载均衡,在
web
域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡。本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持
linux
、darwin
、windows
。./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数
(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数
KCP
是一个快速可靠协议,能以比TCP
浪费10%-20%
的带宽的代价,换取平均延迟降低30%-40%
,在弱网环境下对性能能有一定的提升。可在app.conf
中修改bridgeType
为kcp
。- 当服务端为
kcp
时,客户端连接时也需要加上参数-type=kcp
。
-----------------
一款轻量级、功能强大的内网穿透代理服务器
- 做微信公众号开发、小程序开发等 ----> 域名代理模式
- 想在外网通过 ssh 连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp 代理模式
- 在非内网环境下使用内网 dns,或者需要通过 udp 访问内网机器等 ----> udp 代理模式
- 在外网使用 HTTP 代理访问内网站点 ----> http 代理模式
- 搭建一个内网穿透 ss,在外网如同使用内网 vpn 一样访问内网资源或者设备 ----> socks5 代理模式
----------------
一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。
nps
背景
- 做微信公众号开发、小程序开发等----> 域名代理模式
- 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式
- 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式
- 在外网使用HTTP代理访问内网站点----> http代理模式
- 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式
目录
安装
releases安装
源码安装
- 安装源码
go get -u github.com/cnlh/nps...
- 编译
go build cmd/nps/nps.go
go build cmd/npc/npc.go
使用示例
统一准备工作(必做)
- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中
bridge_port
为8284,配置文件中web_port
为8080 - 访问1.1.1.1:8080
- 在客户端管理中创建一个客户端,记录下验证密钥
- 内网客户端运行(windows使用cmd运行加.exe)
./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
a.proxy.com
,b.proxy.com
即可成功tcp隧道
- 在刚才创建的客户端隧道管理中添加一条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隧道
- 在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。
- 修改需要使用的内网dns为127.0.0.1,则相当于使用10.1.50.202作为dns服务器
socks5代理
- 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。
- 在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理),ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了
http正向代理
- 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。
- 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了
私密代理
- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥secrettest和内网目标10.1.50.2:22
- 在需要连接ssh的机器上以执行命令
./npc -server=1.1.1.1:8284 -vkey=vkey -type=tcp -password=secrettest -local_type=secret
-local_port=xx
,默认为2000ssh -p 2000 root@1.1.1.1
即可访问sshp2p服务
- 在
nps.conf
中设置p2p_ip
(nps服务器ip)和p2p_port
(nps服务器udp端口) - 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh
- 在机器1执行命令
./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.3:22
-local_port=xx
,默认为2000ssh -p 2000 root@127.0.0.1
即可访问机器2的sshweb管理
介绍
启动
服务端测试
./nps test
服务端启动
./nps start
web管理
服务端配置文件重载
./nps reload
allow_user_login
auth_crypt_key
auth_key
web_username
web_password
等,未来将支持更多服务端停止或重启
./nps stop|restart
服务端配置文件
- /conf/nps.conf
名称 | 含义 |
---|---|
web_port | web管理端口 |
web_password | web界面管理密码 |
web_username | web界面管理账号 |
bridge_port | 服务端客户端通信端口 |
https_proxy_port | 域名代理https代理监听端口 |
http_proxy_port | 域名代理http代理监听端口 |
auth_key | web 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_port | p2p模式开启的udp端口 |
使用https
https_just_proxy
设置为false,然后就和http代理一样了nps.conf
中设置一个默认的https配置,当遇到未在web中设置https证书的域名解析时,将自动使用默认证书,另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息,nps也将自动使用默认证书nps.conf
中将https_just_proxy
设置为true,并且打开https_proxy_port
端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理与nginx配合
server {
listen 80;
server_name *.proxy.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8024;
}
}
server {
listen 443;
server_name *.proxy.com;
ssl on;
ssl_certificate certificate.crt;
ssl_certificate_key private.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8024;
}
}
关闭代理
将nps安装到系统
(./nps|nps.exe) install
nps test|start|stop|restart|status
nps.exe test|start|stop|restart|status
流量数据持久化
nps.conf
中的flow_store_interval
参数,单位为分钟系统信息显示
nps.conf
中设置system_info_display=true
自定义客户端连接密钥
关闭公钥访问
nps.conf
中的public_vkey
设置为空或者删除关闭web管理
nps.conf
中的web_port
设置为空或者删除服务端多用户登陆
nps.conf
中的allow_user_login
设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。用户注册功能
nps.conf
中的allow_user_register
设置为true,开启后登陆页将会有有注册功能,监听指定ip
nps.conf
中设置allow_multi_ip=true
后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0)server_ip=xxx
代理到服务端本地
nginx
proxy_pass
的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。nps.conf
中设置allow_local_proxy=true
,然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。客户端
客户端启动
无配置文件模式
./npc -server=ip:port -vkey=web界面中显示的密钥
配置文件模式
./npc -config=npc配置文件路径
配置文件说明
全局配置
[common]
server_addr=1.1.1.1:8284
conn_type=tcp
vkey=123
username=111
password=222
compress=true
crypt=true
rate_limit=10000
flow_limit=100
remark=test
max_conn=10
项 | 含义 |
---|---|
server_addr | 服务端ip:port |
conn_type | 与服务端通信模式(tcp或kcp) |
vkey | 服务端配置文件中的密钥(非web) |
username | socks5或http(s)密码保护用户名(可忽略) |
password | socks5或http(s)密码保护密码(可忽略) |
compress | 是否压缩传输(true或false或忽略) |
crypt | 是否加密传输(true或false或忽略) |
rate_limit | 速度限制,可忽略 |
flow_limit | 流量限制,可忽略 |
remark | 客户端备注,可忽略 |
max_conn | 最大连接数,可忽略 |
域名代理
[common]
server_addr=1.1.1.1:8284
vkey=123
[web1]
host=a.proxy.com
target_addr=127.0.0.1:8080,127.0.0.1:8082
host_change=www.proxy.com
header_set_proxy=nps
项 | 含义 |
---|---|
web1 | 备注 |
host | 域名(http |
target_addr | 内网目标,负载均衡时多个目标,逗号隔开 |
host_change | 请求host修改 |
header_xxx | 请求header修改或添加,header_proxy表示添加header proxy:nps |
tcp隧道模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[tcp]
mode=tcp
target_addr=127.0.0.1:8080
server_port=9001
项 | 含义 |
---|---|
mode | tcp |
server_port | 在服务端的代理端口 |
tartget_addr | 内网目标 |
udp隧道模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[udp]
mode=udp
target_addr=127.0.0.1:8080
server_port=9002
项 | 含义 |
---|---|
mode | udp |
server_port | 在服务端的代理端口 |
target_addr | 内网目标 |
http代理模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[http]
mode=httpProxy
server_port=9003
项 | 含义 |
---|---|
mode | httpProxy |
server_port | 在服务端的代理端口 |
socks5代理模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[socks5]
mode=socks5
server_port=9004
项 | 含义 |
---|---|
mode | socks5 |
server_port | 在服务端的代理端口 |
私密代理模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[secret_ssh]
mode=secret
password=ssh2
target_addr=10.1.50.2:22
项 | 含义 |
---|---|
mode | secret |
password | 唯一密钥 |
target_addr | 内网目标 |
p2p代理模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[p2p_ssh]
mode=p2p
password=ssh2
target_addr=10.1.50.2:22
项 | 含义 |
---|---|
mode | p2p |
password | 唯一密钥 |
target_addr | 内网目标 |
文件访问模式
[common]
server_addr=1.1.1.1:8284
vkey=123
[file]
mode=file
server_port=9100
local_path=/tmp/
strip_pre=/web/
项 | 含义 |
---|---|
mode | file |
server_port | 服务端开启的端口 |
local_path | 本地文件目录 |
strip_pre | 前缀 |
strip_pre
,访问公网ip:9100/web/
相当于访问/tmp/
目录断线重连
[common]
auto_reconnection=true
nat类型检测
./npc nat
状态检查
./npc status -config=npc配置文件路径
重载配置文件
./npc restart -config=npc配置文件路径
通过代理连接nps
[common]
proxy_url=socks5://111:222@127.0.0.1:8024
-proxy=socks5://111:222@127.0.0.1:8024
群晖支持
npc_x64-6.1_0.19.0-1.spk
相关功能
缓存支持
nps.conf
中设置http_cache=true
,并设置http_cache_length
(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数)数据压缩支持
- 所有模式均支持数据压缩
- 在web管理或客户端配置文件中设置
加密传输
- nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成
- 在web管理或客户端配置文件中设置
站点保护
- 在web管理或客户端配置文件中设置
host修改
自定义header
404页面配置
流量限制
nps.conf
中设置allow_flow_limit
,默认是关闭的。带宽限制
nps.conf
中设置allow_rate_limit
,默认是关闭的。负载均衡
端口白名单
allow_ports=9001-9009,10001,11000-12000
端口范围映射
[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
守护进程
./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数
(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数
KCP协议支持
bridge_type
为kcp ,设置后本代理将开启udp端口(bridge_port
)域名泛解析
URL路由
[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
a.proxy.com/test
将转发到web1
,对于a.proxy.com/static
将转发到web2
限制ip访问
ip_limit
=true,设置后仅通过注册的ip方可访问。./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2
客户端最大连接数
socks5
、http正向代理
、域名代理
、tcp代理
、udp代理
、私密代理
生效,使用该功能需要在nps.conf
中设置allow_connection_num_limit=true
,默认是关闭的。客户端最大隧道数限制
nps.conf
中设置allow_tunnel_num_limit=true
。端口复用
bridge_port
、 http_proxy_port
、 https_proxy_port
、web_port
都设置为同一端口,也能正常使用。- 使用时将需要复用的端口设置为与
bridge_port
一致即可,将自动识别。 - 如需将web管理的端口也复用,需要配置
web_host
也就是一个二级域名以便区分
多路复用
环境变量渲染
export NPC_SERVER_ADDR=1.1.1.1:8284
export NPC_SERVER_VKEY=xxxxx
[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}}
健康检查
[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_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模式适用 |
日志输出
日志输出级别
-log_level=0~7 -log_path=npc.log
LevelEmergency->0 LevelAlert->1
LevelCritical->2 LevelError->3
LevelWarning->4 LevelNotice->5
LevelInformational->6 LevelDebug->7
nps.conf
中设置相关配置即可相关说明
获取用户真实ip
热更新支持
客户端地址显示
流量统计
当前客户端带宽
客户端与服务端版本对比
webAPI
webAPI验证说明
- 采用auth_key的验证方式
- 在提交的每个请求后面附带两个参数,
auth_key
和timestamp
auth_key的生成方式为:md5(配置文件中的auth_key+当前时间戳)
timestamp为当前时间戳
curl --request POST \
--url http://127.0.0.1:8080/client/list \
--data 'auth_key=2a0000d9229e7dbcf79dd0f5e04bb084×tamp=1553045344&start=0&limit=10'
获取服务端时间
POST /auth/gettime
获取服务端authKey
POST /auth/getauthkey
auth_crypt_key
需为16位- 解密密钥长度128
- 偏移量与密钥相同
- 补码方式pkcs5padding
- 解密串编码方式 十六进制
详细文档
- 此文档近期可能更新较慢,建议自行抓包
这里必须要吐槽一下
默认账号密码是 admin/123 修改账号必须要在服务端改 config 文件
官方文档说配置文件在 conf/nps.conf 上,但是我搞了半天也没能修噶成功配置,最后问了管理人员,她们的回答是:
安装后,配置文件在/etc/nps/下,修改此处才有效。
接下来启动即可 ./nps start
web 管理:
客户端
- 下载客户端
- 启动
./npc -server=服务器ip:8024 -vkey=web生成的密钥
使用
本地启动成功:
ok了, 这样我们就可以在外网访问接口了, 其实搭建网站同理.
-----
一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。
nps
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。
背景
-
做微信公众号开发、小程序开发等----> 域名代理模式
-
想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式
-
在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式
-
在外网使用HTTP代理访问内网站点----> http代理模式
-
搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式
目录
安装
releases安装
下载对应的系统版本即可,服务端和客户端是单独的
源码安装
- 安装源码
go get -u github.com/cnlh/nps...
- 编译
go build cmd/nps/nps.go
go build cmd/npc/npc.go
使用示例
统一准备工作(必做)
- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中
bridge_port
为8284,配置文件中web_port
为8080 - 访问1.1.1.1:8080
- 在客户端管理中创建一个客户端,记录下验证密钥
- 内网客户端运行(windows使用cmd运行加.exe)
./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
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代理(例如使用proxifier进行全局代理),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端口
使用步骤
- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥secrettest和内网目标10.1.50.2:22
- 在需要连接ssh的机器上以执行命令
./npc -server=1.1.1.1:8284 -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@1.1.1.1
即可访问sshp2p服务
适用范围: 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。nat类型检测
假设场景: 内网1机器ip为10.1.50.2 内网2机器2 ip为10.2.50.2
想通过访问内网1机器1的2000端口---->访问到内网2机器3 10.2.50.3的22端口
使用步骤
- 在
nps.conf
中设置p2p_ip
(nps服务器ip)和p2p_port
(nps服务器udp端口) - 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh
- 在机器1执行命令
./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.3:22
如需指定本地端口可加参数
-local_port=xx
,默认为2000注意: password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示
假设机器3用户名为root,现在在机器1上执行
ssh -p 2000 root@127.0.0.1
即可访问机器2的sshweb管理
介绍
可在网页上配置和管理各个tcp、udp隧道、内网站点代理,http、https解析等,功能强大,操作方便。
提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件
启动
服务端测试
./nps test
如有错误请及时修改配置文件,无错误可继续进行下去
服务端启动
./nps start
如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可
web管理
进入web界面,公网ip:web界面端口(默认8080),密码默认为123
进入web管理界面,有详细的说明
服务端配置文件重载
如果是daemon启动
./nps reload
说明: 仅支持部分配置重载,例如
allow_user_login
auth_crypt_key
auth_key
web_username
web_password
等,未来将支持更多服务端停止或重启
如果是daemon启动
./nps stop|restart
服务端配置文件
- /conf/nps.conf
名称 含义 web_port web管理端口 web_password web界面管理密码 web_username web界面管理账号 bridge_port 服务端客户端通信端口 https_proxy_port 域名代理https代理监听端口 http_proxy_port 域名代理http代理监听端口 auth_key web 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_port p2p模式开启的udp端口 使用https
方式一: 类似于nginx实现https的处理
在配置文件中将https_proxy_port设置为443或者其他你想配置的端口,和在web中对应域名编辑中设置对应的证书路径,将
https_just_proxy
设置为false,然后就和http代理一样了此外: 可以在
nps.conf
中设置一个默认的https配置,当遇到未在web中设置https证书的域名解析时,将自动使用默认证书,另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息,nps也将自动使用默认证书方式二: 在内网对应服务器上设置https
在
nps.conf
中将https_just_proxy
设置为true,并且打开https_proxy_port
端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理与nginx配合
有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等,本代理可和nginx配合使用,在配置文件中将httpProxyPort设置为非80端口,并在nginx中配置代理,例如httpProxyPort为8024时
server { listen 80; server_name *.proxy.com; location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8024; } }
如需使用https也可在nginx监听443端口并配置ssl,并将本代理的httpsProxyPort设置为空关闭https即可,例如httpProxyPort为8024时
server { listen 443; server_name *.proxy.com; ssl on; ssl_certificate certificate.crt; ssl_certificate_key private.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8024; } }
关闭代理
如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。
将nps安装到系统
如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令
(./nps|nps.exe) install
安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行
nps test|start|stop|restart|status
对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行
nps.exe test|start|stop|restart|status
流量数据持久化
服务端支持将流量数据持久化,默认情况下是关闭的,如果有需求可以设置
nps.conf
中的flow_store_interval
参数,单位为分钟注意: nps不会持久化通过公钥连接的客户端
系统信息显示
nps服务端支持在web上显示和统计服务器的相关信息,但默认一些统计图表是关闭的,如需开启请在
nps.conf
中设置system_info_display=true
自定义客户端连接密钥
web上可以自定义客户端连接的密钥,但是必须具有唯一性
关闭公钥访问
可以将
nps.conf
中的public_vkey
设置为空或者删除关闭web管理
可以将
nps.conf
中的web_port
设置为空或者删除服务端多用户登陆
如果将
nps.conf
中的allow_user_login
设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。用户注册功能
nps服务端支持用户注册功能,可将
nps.conf
中的allow_user_register
设置为true,开启后登陆页将会有有注册功能,监听指定ip
nps支持每个隧道监听不同的服务端端口,在
nps.conf
中设置allow_multi_ip=true
后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0)server_ip=xxx
代理到服务端本地
在使用nps监听80或者443端口时,默认是将所有的请求都会转发到内网上,但有时候我们的nps服务器的上一些服务也需要使用这两个端口,nps提供类似于
nginx
proxy_pass
的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。即: 假设在nps的vps服务器上有一个服务使用5000端口,这时候nps占用了80端口和443,我们想能使用一个域名通过http(s)访问到5000的服务。
使用方式: 在
nps.conf
中设置allow_local_proxy=true
,然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。客户端
客户端启动
无配置文件模式
此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置
./npc -server=ip:port -vkey=web界面中显示的密钥
配置文件模式
此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理
./npc -config=npc配置文件路径
配置文件说明
全局配置
[common] server_addr=1.1.1.1:8284 conn_type=tcp vkey=123 username=111 password=222 compress=true crypt=true rate_limit=10000 flow_limit=100 remark=test max_conn=10
项 含义 server_addr 服务端ip:port conn_type 与服务端通信模式(tcp或kcp) vkey 服务端配置文件中的密钥(非web) username socks5或http(s)密码保护用户名(可忽略) password socks5或http(s)密码保护密码(可忽略) compress 是否压缩传输(true或false或忽略) crypt 是否加密传输(true或false或忽略) rate_limit 速度限制,可忽略 flow_limit 流量限制,可忽略 remark 客户端备注,可忽略 max_conn 最大连接数,可忽略 域名代理
[common] server_addr=1.1.1.1:8284 vkey=123 [web1] host=a.proxy.com target_addr=127.0.0.1:8080,127.0.0.1:8082 host_change=www.proxy.com header_set_proxy=nps
项 含义 web1 备注 host 域名(http target_addr 内网目标,负载均衡时多个目标,逗号隔开 host_change 请求host修改 header_xxx 请求header修改或添加,header_proxy表示添加header proxy:nps tcp隧道模式
[common] server_addr=1.1.1.1:8284 vkey=123 [tcp] mode=tcp target_addr=127.0.0.1:8080 server_port=9001
项 含义 mode tcp server_port 在服务端的代理端口 tartget_addr 内网目标 udp隧道模式
[common] server_addr=1.1.1.1:8284 vkey=123 [udp] mode=udp target_addr=127.0.0.1:8080 server_port=9002
项 含义 mode udp server_port 在服务端的代理端口 target_addr 内网目标 http代理模式
[common] server_addr=1.1.1.1:8284 vkey=123 [http] mode=httpProxy server_port=9003
项 含义 mode httpProxy server_port 在服务端的代理端口 socks5代理模式
[common] server_addr=1.1.1.1:8284 vkey=123 [socks5] mode=socks5 server_port=9004
项 含义 mode socks5 server_port 在服务端的代理端口 私密代理模式
[common] server_addr=1.1.1.1:8284 vkey=123 [secret_ssh] mode=secret password=ssh2 target_addr=10.1.50.2:22
项 含义 mode secret password 唯一密钥 target_addr 内网目标 p2p代理模式
[common] server_addr=1.1.1.1:8284 vkey=123 [p2p_ssh] mode=p2p password=ssh2 target_addr=10.1.50.2:22
项 含义 mode p2p password 唯一密钥 target_addr 内网目标 文件访问模式
利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动
[common] server_addr=1.1.1.1:8284 vkey=123 [file] mode=file server_port=9100 local_path=/tmp/ strip_pre=/web/
项 含义 mode file server_port 服务端开启的端口 local_path 本地文件目录 strip_pre 前缀 对于
strip_pre
,访问公网ip:9100/web/
相当于访问/tmp/
目录断线重连
[common] auto_reconnection=true
nat类型检测
./npc nat
如果p2p双方都是Symmetic Nat,肯定不能成功,其他组合都有较大成功率。
状态检查
./npc status -config=npc配置文件路径
重载配置文件
./npc restart -config=npc配置文件路径
通过代理连接nps
有时候运行npc的内网机器无法直接访问外网,此时可以可以通过socks5代理连接nps
对于配置文件方式启动,设置
[common] proxy_url=socks5://111:222@127.0.0.1:8024
对于无配置文件模式,加上参数
-proxy=socks5://111:222@127.0.0.1:8024
支持socks5和http两种模式
即socks5://username:password@ip:port
或http://username:password@ip:port
群晖支持
可在releases中下载spk群晖套件,例如
npc_x64-6.1_0.19.0-1.spk
相关功能
缓存支持
对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。
即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在
nps.conf
中设置http_cache=true
,并设置http_cache_length
(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数)数据压缩支持
由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。
- 所有模式均支持数据压缩
- 在web管理或客户端配置文件中设置
加密传输
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。
- nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成
- 在web管理或客户端配置文件中设置
站点保护
域名代理模式所有客户端共用一个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,仅范围映射时有效
守护进程
本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux,darwin,windows。
./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数
(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数
KCP协议支持
KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,在弱网环境下对性能能有一定的提升。可在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
对于
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
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主要通信默认基于多路复用,无需开启。
环境变量渲染
npc支持环境变量渲染以适应在某些特殊场景下的要求。
在无配置文件启动模式下: 设置环境变量
export NPC_SERVER_ADDR=1.1.1.1:8284 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
中设置相关配置即可相关说明
获取用户真实ip
在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。
本代理前会在每一个http(s)请求中添加了这两个 header。
热更新支持
对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端
客户端地址显示
在web管理中将显示客户端的连接地址
流量统计
可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异
当前客户端带宽
可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。
客户端与服务端版本对比
为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。
webAPI
webAPI验证说明
- 采用auth_key的验证方式
- 在提交的每个请求后面附带两个参数,
auth_key
和timestamp
auth_key的生成方式为:md5(配置文件中的auth_key+当前时间戳)
timestamp为当前时间戳
curl --request POST \ --url http://127.0.0.1:8080/client/list \ --data 'auth_key=2a0000d9229e7dbcf79dd0f5e04bb084×tamp=1553045344&start=0&limit=10'
注意: 为保证安全,时间戳的有效范围为20秒内,所以每次提交请求必须重新生成。
获取服务端时间
由于服务端与api请求的客户端时间差异不能太大,所以提供了一个可以获取服务端时间的接口
POST /auth/gettime
获取服务端authKey如果想获取authKey,服务端提供获取authKey的接口
POST /auth/getauthkey
将返回加密后的authKey,采用aes cbc加密,请使用与服务端配置文件中cryptKey相同的密钥进行解密注意: nps配置文件中
auth_crypt_key
需为16位- 解密密钥长度128
- 偏移量与密钥相同
- 补码方式pkcs5padding
- 解密串编码方式 十六进制
详细文档
- 此文档近期可能更新较慢,建议自行抓包
为方便第三方扩展,在web模式下可利用webAPI进行相关操作,详情见 webAPI文档
贡献
欢迎参与到制作docker、图标、文档翻译等工作
- 如果遇到bug可以直接提交至dev分支
- 使用遇到问题可以通过issues反馈
- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支
- 如果有新的功能特性反馈,可以通过issues或者qq群反馈。
from https://gitcode.com/qianyanwangluo/nps/overview
-