NPS内网穿透详细案例

NPS工具介绍
NPS工具是一款使用go语言编写的轻量级、功能强大的内网穿透工具。支持TCP、UDP流量转发,支持内网HTTP、SOCKS5代理,同时支持snappy压缩(节省带宽和流量)、站点保护、加密传输、多路复用、header修改等。同时还支持web图形化管理。该工具使用简单,相比于FRP,NPS是图形化界面,因此配置更加简单

root@ls4jtubcnt opt#wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
root@ls4jtubcnt opt# mkdir nps
root@ls4jtubcnt opt# tar -zxf linux_amd64_server.tar.gz -C nps/
root@ls4jtubcnt opt# cd nps/
root@ls4jtubcnt nps# ./nps install # 执行安装命令
root@ls4jtubcnt nps# ./nps start #启动NPS,nps start|stop|restart|uninstall|reload
root@ls4jtubcnt nps# cd /etc/nps/conf/ #安装后配置文件位于/etc/nps/conf目录下
nps.confg配置文件:
appname = weblogger
#Boot mode(dev|pro)

指定运行模式 (dev|pro)

runmode = dev
#HTTP(S) proxy port, no startup if empty

https 代理 , 如果设置为空 , 则表示忽略

#http_proxy_ip=
#http_proxy_port=
#https_proxy_port=
#https_just_proxy=
#default https certificate setting

指明 https 缺省证书文件位置

https_default_cert_file=conf/server.pem
https_default_key_file=conf/server.key
##bridge

客户端和服务端之间所用的通信协议 , 端口和服务端绑定 ip

bridge_type=tcp
bridge_port=8024
bridge_ip=0.0.0.0

Public password, which clients can use to connect to the server

After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file.

客户端以配置文件模式启动时的密钥 , 设置为空表示关闭客户端配置文件连接模式

public_vkey=Pksfy2312df70i5osc
#Traffic data persistence interval(minute)
#Ignorance means no persistence

服务端流量数据持久化间隔 , 单位分钟 , 忽略表示不持久化

flow_store_interval=3

log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7

输出运行日志 , 如下 , 写到当前目录下的 weblogger.log 文件中 ,7 表示调试模式

log_level=7
log_path=weblogger.log #生成的日志文件路径为:/weblogger.log
#Whether to restrict IP access, true or false or ignore

是否限制 ip 访问 ,true 或 false 或忽略

#ip_limit=true
#p2p
#p2p_ip=127.0.0.1
#p2p_port=6000
#web

web 控制面板配置 , 包括域名 , 访问端口和登录账号密码,域名访问需要使用反向代理进行配置

web_host=login.weblogger.com
web_username=backlion
web_password=bks.net@#125
web_port = 8081
web_ip=0.0.0.0
web_base_url=
web_open_ssl=false
web_cert_file=conf/server.pem
web_key_file=conf/server.key

if web under proxy use sub path. like http://host/nps need this.

#web_base_url=/nps
#Web API unauthenticated IP address(the len of auth_crypt_key must be 16)
#Remove comments if needed

auth_key 为 web api 密钥 ,auth_crypt_key 表示获取服务端 authKey 时的 aes 加密密钥 ,16 位

#auth_key=ATi39sdp2d
auth_crypt_key =AmSo173adsPEWRSZ
#allow_ports=9001-9009,10001,11000-12000

为防止 nps 服务端端口滥用 , 可限制可开启的端口 , 忽略或者不填表示端口不受限制

#Web management multi-user login

是否支持多用户登录 , 默认该功能是关闭的 , 一般也不会用

allow_user_login=false
allow_user_register=false
allow_user_change_username=false
#extension

其它杂项 , 如 , 流量限制 , 带宽限制 , 对客户端的隧道数限制 , 最大连接数 等等等 ... 默认忽略就好

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

nps 服务端支持在 web 上显示和统计服务器相关信息 , 但默认一些统计图表是关闭的 , 可以通过此选项打开

system_info_display=true
#cache

http 缓存设置 , 保持默认即可

http_cache=false
http_cache_length=100
#get origin ip
http_add_origin_header=false
#pprof debug options
#pprof_ip=0.0.0.0
#pprof_port=9999
#client disconnect timeout
disconnect_timeout=60
服务端启动后会首先监听两个端口 , 一个是 web 面板访问端口 此处为 8081 , 另一个就是 nps 客户端和服务端的通信端口 此处为 9099
root@ls4jtubcnt conf# netstat -tulnp

访问:http://vps ip:8081/,并输入以上/etc/nps/conf/nps.confg配置文件下设置的用户名和密码

如下 , 便是登录成功后 , 整个 nps web 控制面板的实际效果图 , 因为当前暂时还没有任何客户端在线 , 所以才全部显示为

客户端,新建一个客户端的链接方式( 注意此处的这个 用户名和密码 , 只有在进行 socks5 和 http 代理时才会用到)

以下是客户端创建成功后的样子 , 特别注意下这个 id, 后面的所有隧道代理和socks5代理都会基于这个 id 来创建

客户端下执行命令: .
/npc -server=106.13.218.47:8024 -vkey=yxznk7q02rirabtz -type=tcp

发现客户端已在线,表示已与服务器端进行了连接

tcp隧道

适用范围: ssh、远程桌面,数据库等tcp连接场景

假设场景: 想通过访问公网服务器1.1.1.1的2022端口,连接内网机器192.168.126.128:的22端口,实现ssh连接

使用步骤

  • 在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(2022)、内网目标ip和目标端口(192.168.126.128:22),保存
  • 访问公网服务器ip(1.1.1.1),填写的监听端口(2022),相当于访问内网ip(192.168.126.128):目标端口(22)

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的3538端口作为socks5代理,达到访问内网任意设备或者资源的效果

使用步骤

  • 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(3538),保存
  • 在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理),ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(3438),即可畅享内网了

添加代理服务器

菜单栏点击Proxy Servers图标---add,这里添加socks代理,填写socks服务端的ip和端口 一定要记得此处的代理是有账号密码的,也就是我们开始创建客户端配置时设置的那个账号密码


单击Proxification Rules图标---add,这里设置如果访问192.168.126.* 目标内网段,这个ip段则走socks5代理

勾选我们添加的代理规则,默认的代理规勾选为Direct!!!记得

这样我们就能直接访问目标内网的机器,像在本地一样开burp做渗透测试

或者使用SocksCap64进行全局代理socks5

注意 经过socks5代理,当收到socks5数据包时socket已经是accept状态。表现是扫描端口全open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。

http正向代理

适用范围: 在外网环境下使用http正向代理访问内网站点

假设场景: 想将公网服务器1.1.1.1的9999端口作为http代理,访问内网网站

使用步骤

  • 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(9999),保存。
  • 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(9999),即可访问了


注意:对于私密代理与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=secret

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