Docker搭建NPS内网穿透服务

127

NPS介绍

nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理p2p等,并带有功能强大的web管理端。

内网穿透原理:

通常情况下,一个局域网中的设备使用私有IP地址,例如192.168.x.x或10.x.x.x,无法直接从互联网上访问。这是因为路由器或防火墙等设备在局域网和广域网之间充当了一个网关,并拦截从外部发来的请求。(抑或大内网)

然而,内网穿透技术可以通过在局域网内的一台设备上运行一个客户端程序,与一个位于公共网络上的服务器建立连接。该客户端程序会向服务器发送一个连接请求,服务器在收到请求后与客户端建立连接。

一旦建立连接,客户端会将对内部服务的请求发送给服务器。服务器接收到请求后,将其转发给局域网内的目标设备,目标设备处理请求并将结果返回给服务器。服务器再将结果返回给客户端,最终完成客户端与内部服务的通信。

官网:https://ehang-io.github.io/nps

GitHub地址: https://github.com/cnlh/nps

镜像地址:https://hub.docker.com/r/ffdfgdfg/nps

环境准备

  • 具备公网IP的VPS

  • Docker环境

  • 域名(可选)

平台搭建

服务端搭建

下载配置文件

下载完成后,上传并解压至服务器

修改配置文件

cd /A/docker/nps
tar -xvf NPSConf.tar
cd conf
vi nps.conf

个人配置文件

#应用程序
appname = nps
#运行模式
runmode = pro

#设置HTTP代理服务器配置
#http_proxy_ip=0.0.0.0
#http_proxy_port=80
#https_proxy_port=443

#HTTPS配置
#https_just_proxy=true
#https_default_cert_file=conf/server.pem
#https_default_key_file=conf/server.key

#桥接设置
bridge_type=tcp
bridge_port=8024
bridge_ip=0.0.0.0

#公匙,可以直接使用这个key连接到服务端
public_vkey=公匙

#流量数据持久化间隔(分钟), 设置为0表示不持久化
#flow_store_interval=1

#日志级别:LevelEmergency->0  LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7
log_level=7
#日志路径
#log_path=nps.log

#是否限制IP访问,true、false或忽略
#ip_limit=true

#P2P设置
#p2p_ip=127.0.0.1
#p2p_port=6000

#Web设置
web_host=Web界面主机地址
web_username=Web界面用户名
web_password=Web界面密码
web_port = Web界面端口号
web_ip=0.0.0.0

#基础URL路径
#web_base_url=

#SSL加密
#web_open_ssl=false
#web_cert_file=conf/server.pem
#web_key_file=conf/server.key

#WEB基础URL
#web_base_url=/nps

#身份验证密钥
#auth_key=test
#身份验证加密密钥
#auth_crypt_key =1234567812345678

#允许的端口范围
#allow_ports=9001-9009,10001,11000-12000

#Web管理多用户 登录、注册、修改用户名
allow_user_login=false
allow_user_register=false
allow_user_change_username=false

#扩展功能 禁用流量限制、速率限制、隧道数量限制、本地代理、连接数量限制、多 IP 支持和系统信息显示
allow_flow_limit=false
allow_rate_limit=false
allow_tunnel_num_limit=false
allow_local_proxy=false
allow_connection_num_limit=false
allow_multi_ip=false
system_info_display=false

#HTTP缓存
http_cache=false
http_cache_length=100

#获取原始IP
http_add_origin_header=false

#pprof调试选项
#pprof_ip=0.0.0.0
#pprof_port=9999

#客户端断开连接超时时间
disconnect_timeout=60

启动服务端

docker run -d \
--name nps \
--restart always \
--net=host \
-v [数据挂载目录]:/conf \
ffdfgdfg/nps

访问web管理后台

访问地址:[你的ip或者域名]:你设置的端口号

输入配置的用户名和密码

添加客户端

主界面

点击客户端-新建

填写客户端信息

image-zexk.png添加客户端

客户端搭建

下载客户端

官方客户端地址:https://github.com/ehang-io/nps/releases

含有client的为客户端,可以下载自己指定的版本

个人客户端地址:

个人配置文件

[common]
#服务器地址
server_addr=你的服务器地址和端口
#连接类型
conn_type=tcp
#验证密钥
vkey=你的验证密匙
#自动重新连接
auto_reconnection=true
#最大连接数
#max_conn=1000
#流量限制
#flow_limit=1000
#速率限制
#rate_limit=1000
#基本认证的用户名和密码
#basic_username=11
#basic_password=3
#Web界面的用户名和密码
#web_username=user
#web_password=1234
#加密传输
crypt=true
#数据压缩
compress=true
#调试工具的地址和端口号
#pprof_addr=0.0.0.0:9999
#设置断开超时时间
disconnect_timeout=60

#健康检查配置部分1
#[health_check_test1]
#健康检查超时时间
#health_check_timeout=1
#最大失败次数
#health_check_max_failed=3
#健康检查间隔时间
#health_check_interval=1
#健康检查的 HTTP URL
#health_http_url=/
#健康检查类型
#health_check_type=http
#健康检查的目标地址列表
#health_check_target=127.0.0.1:8083,127.0.0.1:8082

#健康检查配置部分2
#[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

#[web]
#Web界面
#host=c.o.com
#Web界面的目标地址列表
#target_addr=127.0.0.1:8083,127.0.0.1:8082

#[tcp]
#连接类型
#mode=tcp
#目标地址
#target_addr=127.0.0.1:8080
#监听端口号
#server_port=10000

#[socks5]
#连接类型
#mode=socks5
#服务器监听的端口号
#server_port=19009
#多用户账户配置文件
#multi_account=multi_account.conf

#[file]
#连接类型
#mode=file
#服务器监听的端口号
#server_port=19008
#设置本地文件路径
#local_path=/Users/liuhe/Downloads
#剥离前缀
#strip_pre=/web/

#[http]
##连接类型
#mode=httpProxy
#服务器监听的端口号
#server_port=19004

#[udp]
##连接类型
#mode=udp
#服务器监听的端口号
#server_port=12253
#UDP目标地址
#target_addr=114.114.114.114:53

#[ssh_secret]
##连接类型
#mode=secret
#SSH的密码
#password=ssh2
#SSH目标地址
#target_addr=123.206.77.88:22

#[ssh_p2p]
##连接类型
#mode=p2p
#SSH的密码
#password=ssh3

#[secret_ssh]
#端口号
#local_port=2001
#SSH的密码
#password=ssh2

#[p2p_ssh]
#端口号
#local_port=2002
#SSH的密码
#password=ssh3
#SSH目标地址
#target_addr=123.206.77.88:22

Win

解压客户端后,修改npc.conf文件

参考我的配置文件

启动客户端

image-gkxn.png双击npc.exe启动客户端

注册到系统服务(开机启动、守护进程)

  • 注册:npc.exe install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)

  • 启动:npc.exe start

  • 停止:npc.exe stop

  • 如果需要更换命令内容需要先卸载npc.exe uninstall,再重新注册

Linux

解压客户端后,修改npc.conf文件

参考我的配置文件

启动客户端

#注册
./npc install -server=服务端ip或域名:服务端端口 -vkey=密匙

#启动
npc start

#停止
npc stop

#卸载
./npc uninstall

日志位置:/var/log/npc.log

使用示例

场景:使用Win自带远程控制,控制家中电脑

将Win部署客户端

image-ssiu.png新增TCP隧道

本地可以只填写端口号,如果需要访问内网内其他设备可以使用 内网IP:端口

我将VPS的9090端口转发至家中电脑3389

image-jtyy.png

验证转发

转发完成,已经需要输入凭证了。

image-pfdt.png