NPS介绍

nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持TCP、UDP流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、游戏私服、我的世界服务器等等……),此外还支持内网http代理、内网socks5代理p2p等,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。

案例:

  1. 做微信公众号开发、小程序开发等----> 域名代理模式

  2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式

  3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式

  4. 在外网使用HTTP代理访问内网站点----> http代理模式

  5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式

NPS项目Github地址:https://url.zeruns.tech/nps

NPS官方中文文档:https://url.zeruns.tech/NPS_WD

搭建NPS服务端

下面有多种搭建方法,选其中一种就行。

搭建好后记得在控制台开放端口,面板端口是8080,与客户端通信端口是8024。

Docker

首先需要安装Docker。

Docker方式是支持多平台的,x86、ARM都可以。

Docker安装脚本:

sudo curl -sSL https://get.daocloud.io/docker | sh

把上面的命令复制到SSH终端运行。

Docker手动安装教程:https://url.zeruns.tech/docker

安装NPS服务端:

# 创建 /opt/nps 目录存放配置文件
mkdir /opt/nps

# 安装wget并且下载配置文件
yum install -y wget 
wget https://img.zeruns.tech/down/conf.zip

# 解压配置文件到 /opt/nps 目录
unzip conf.zip -d /opt/nps

# 拉取 ffdfgdfg/nps 镜像
docker pull ffdfgdfg/nps

# 运行 nps 容器,配置文件夹 conf 在 /opt/nps/conf 目录下
docker run -d --name=nps --restart=always --net=host -v /opt/nps/conf:/conf ffdfgdfg/nps

# 查看日志
docker logs nps

安装完后在浏览器打开:http://你服务器IP:8080

使用用户名和密码登陆(默认admin/123,正式使用一定要更改,修改/opt/nps/conf/nps.conf配置文件中的web_password)

如何解决无法启动nps的问题

=====================
How to resolve the issue?

Step 1:
run nps, it will show the log
2024/05/01 02:10:07.125 [E] [http.go:67] listen tcp 0.0.0.0:80: bind: address already in use
we can see the 80 port have been used by other program, so we need to change the port.

Step 2:
chang the 80 port to 81 port, if the 81 port, you have been used, you can change to other port.
vi /ect/nps/conf/nps.conf


Step 3:

# nps restart
# ps -ef|grep nps
# netstat -anp|grep “:81”

Step 4:
check the “IP:8080” in browser.
If you use the aliyun, you need to open the 8080 port and 81 port in aliyun security policy(安全策略).

Also if the 8080 port has been used , you also need change the 8080 port to other port.

=====================

  • 浏览器打开IP+8080端口,即可看到nps管理界面,用户名和密码默认是admin/123,请及时修改。

修改配置文件

  • 如果需要修改登录用户名、密码、网页登录端口等信息,可以修改/etc/nps下的nps.conf文件,相关的参数信息可以看表格。

名称

含义

web_port

web管理端口

web_password

web界面管理密码

web_username

web界面管理账号

web_base_url

web管理主路径,用于将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端口

pprof_ip

debug pprof 服务端ip

pprof_port

debug pprof 端口

disconnect_timeout

客户端连接超时,单位 5s,默认值 60,即 300s = 5mins

  • 仪表盘里面可以看到客户端的连接端口默认为8024,需要在云服务器的防火墙放行此端口才能正常工作。

客户端连接

  • 点击仪表盘里面的客户端,按图片所示新增一个客户端。

  • 填写备注,下面的压缩和加密选择“是”。

  • 添加好后就会得到一个客户端ID为2。

  • 点击左边的加号,会出现下面的一条客户端命令,这个命令是在windows系统下面执行的,执行的时候不需要前面的"./"。

  • 在保存了nps客户端的文件里按住shift键点击鼠标右键,打开Powershell

  • 输入命令cmd,和从网页上获取到的命令,出现Successful就可以了。

此步骤可以修改conf里面的配置,直接将vkey写入配置文件,点击nfc运行即可。

可以看到网页上的状态显示在线

创建TCP隧道

  • 客户端ID写之前创建客户端得到的ID,服务端端口写一个没有用过的端口就行,当然防火墙里面也要放行这个端口。目标端口写需要访问的端口。

  • 这样所有访问服务端端口的流量就会被转发到客户端端口,也就成功连接上了处于内网的主机。

  • 目标(IP:端口):127.0.0.1.3389(windows远程端口为3389,这个不能改)

nps的客户端npc

一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。

使用方式

  • docker pull ffdfgdfg/npc

  • 下载conf文件夹并解压,或前往项目主页自行下载**(升级请忽略)**

  • 继续阅读文档按照不同的启动方式启动**(升级请忽略)**

  • 无配置文件:docker run -d --name npc --net=host ffdfgdfg/npc -server=<ip:port> -vkey=<web界面中显示的密钥> <以及一些其他参数>

  • 配置文件:docker run -d --name npc --net=host -v <本机conf目录>:/conf ffdfgdfg/npc -config=/conf/npc.conf

参数附在后面即可 请确保为conf文件夹下的npc.conf

查看日志docker logs npc

配置 Windows NPS 客户端

我们先解压下载好的客户端文件,解压后会有一个 npc 可执行程序,需要带参数运行客户端。

在客户目录输入 CMD 然后回车

然后找到对应你创建的客户端参数并复制

 粘贴到刚才打开的 CMD 命令窗口并且回车运行程序

回到 Web 端查看客户端是否上线

查看通道状态是否成 功

Docker客户端配置

先创建

cd cd /root/docker-compose-data/frp 

vim docker-compose.yml
touch frpc.ini

配置docker-compose.yml,注意:这里不是"frps"是"frpc"

version: '3.3'
services:
    frpc:
        restart: always
        network_mode: host
        volumes:
            - './frpc.ini:/etc/frp/frpc.ini'
        container_name: frpc
        image: snowdreamtech/frpc

配置frpc.ini

[common]
server_addr= 127.0.0.1 #服务端服务器的公网ip
server_port= 5400 #监听端口
token = pwd123 #服务端与客户端的认证密钥

#[ssh] #ssh不建议轻易打开,被打的概率很高
#type = tcp
#local_ip = 127.0.0.1
#local_port = 22
#remote_port = 6000

[jellyfin] #tcp部署
type = tcp
local_ip = 127.0.0.1
local_port = 8096 #本地服务端口
remote_port = 6001 #远程服务器端口


#[https-web] #https部署
#type=https #协议
#local_port = 22300 #本地服务端口
#custom_domains = web.com #域名,要解析好的

#plugin= https2http #用于将本地的HTTP服务转为HTTPS的插件
#plugin_local_addr = 127.0.0.1:22300 #本地服务端口 
#plugin_crt_path = /root/ssl/web.top/web.com_bundle.crt #这两个HTTPS证书是nginx格式的,需要在证书颁发机构下载,然后放入容器内才能正常使用
#plugin_key_path = /root/ssl/web.top/web.com.key 
#plugin_host_header_rewrite = 127.0.0.1
#plugin_header_X-From-Where = frp

启动容器,在/root/docker-compose-data/frp下

docker-compose -up -d

测试访问

http://服务端ip地址:你设置的remote_port   #tcp协议

https://web.com   #https协议

如果你出现了不能解决的问题,请参见:

使用示例

统一准备工作(必做)

  • 开启服务端,假设公网服务器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=客户端的密钥Copy to clipboardErrorCopied

注意:运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的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

  • 点击刚才创建的客户端的域名管理,添加两条规则规则:1、域名:a.proxy.com,内网目标:127.0.0.1:81,2、域名:b.proxy.com,内网目标:127.0.0.1:82

现在访问(http|https://)a.proxy.comb.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地址为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=secretCopy to clipboardErrorCopied

如需指定本地端口可加参数-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:22Copy to clipboardErrorCopied

如需指定本地端口可加参数-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端口即可。