nps内网穿透介绍:
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。
nps安装教程:
首先访问Github releases下载合适的软件包
https://github.com/ehang-io/nps/releases
如果没有合适的版本,当然也可以自编译:
- 安装源码
go get -u ehang.io/nps
- 编译
服务端go build cmd/nps/nps.go
客户端go build cmd/npc/npc.go
启动:
服务端
下载完服务器压缩包后,解压,然后进入解压后的文件夹
- 执行安装命令
对于linux|darwin sudo ./nps install
对于windows,管理员身份运行cmd,进入安装目录 nps.exe install
- 启动
对于linux|darwin sudo nps start
对于windows,管理员身份运行cmd,进入程序目录 nps.exe start
安装后windows配置文件位于 C:\Program Files\nps,linux和darwin位于/etc/nps
停止和重启可用,stop和restart
如果发现没有启动成功,可以使用nps(.exe) stop
,然后运行nps.(exe)
运行调试,或查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)
- 访问服务端ip:web服务端口(默认为8080)
- 使用用户名和密码登陆(默认admin/123,正式使用一定要更改)
- 创建客户端
客户端
- 下载客户端安装包并解压,进入到解压目录
- 点击web管理中客户端前的+号,复制启动命令
- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行
如果使用powershell
运行,请将ip括起来!
如果需要注册到系统服务可查看注册到系统服务
版本检查
- 对客户端以及服务的均可以使用参数
-version
打印版本 nps -version
或./nps -version
npc -version
或./npc -version
配置
- 客户端连接后,在web中配置对应穿透服务即可
- 可以查看使用示例
使用示例:
统一准备工作(必做)
- 开启服务端,假设公网服务器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.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地址为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端口即可。
服务端配置文件修改:
- 配置文件在/etc/nps/conf/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 |
修改完成记得重载配置文件:
对于linux、darwin
sudo nps reloadCopy to clipboardErrorCopied
对于windows
nps.exe reloadCopy to clipboardErrorCopied
说明: 仅支持部分配置重载,例如allow_user_login
auth_crypt_key
auth_key
web_username
web_password
等,未来将支持更多
客户端:
基本使用
无配置文件模式
此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置
./npc -server=ip:port -vkey=web界面中显示的密钥Copy to clipboardErrorCopied
注册到系统服务(开机启动、守护进程)
对于linux、darwin
- 注册:
sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)
- 启动:
sudo npc start
- 停止:
sudo npc stop
- 如果需要更换命令内容需要先卸载
./npc uninstall
,再重新注册
对于windows,使用管理员身份运行cmd
- 注册:
npc.exe install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)
- 启动:
npc.exe start
- 停止:
npc.exe stop
- 如果需要更换命令内容需要先卸载
npc.exe uninstall
,再重新注册 - 如果需要当客户端退出时自动重启客户端,请按照如图所示配置
注册到服务后,日志文件windows位于当前目录下,linux和darwin位于/var/log/npc.log
客户端更新
首先进入到对于的客户端二进制文件目录
请首先执行sudo npc stop
或者npc.exe stop
停止运行,然后
对于linux
sudo npc-update updateCopy to clipboardErrorCopied
对于windows
npc-update.exe updateCopy to clipboardErrorCopied
更新完成后,执行执行sudo npc start
或者npc.exe start
重新运行即可完成升级
如果无法更新成功,可以直接自行下载releases压缩包然后覆盖原有的npc二进制文件
配置文件模式
此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理
./npc -config=npc配置文件路径Copy to clipboardErrorCopied
配置文件说明
全局配置
[common]
server_addr=1.1.1.1:8024
conn_type=tcp
vkey=123
username=111
password=222
compress=true
crypt=true
rate_limit=10000
flow_limit=100
remark=test
max_conn=10
#pprof_addr=0.0.0.0:9999Copy to clipboardErrorCopied
项 | 含义 |
---|---|
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 | 最大连接数,可忽略 |
pprof_addr | debug pprof ip:port |
域名代理
[common]
server_addr=1.1.1.1:8024
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=npsCopy to clipboardErrorCopied
项 | 含义 |
---|---|
web1 | 备注 |
host | 域名(http |
target_addr | 内网目标,负载均衡时多个目标,逗号隔开 |
host_change | 请求host修改 |
header_xxx | 请求header修改或添加,header_proxy表示添加header proxy:nps |
tcp隧道模式
[common]
server_addr=1.1.1.1:8024
vkey=123
[tcp]
mode=tcp target_addr=127.0.0.1:8080 server_port=9001Copy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | tcp |
server_port | 在服务端的代理端口 |
tartget_addr | 内网目标 |
udp隧道模式
[common]
server_addr=1.1.1.1:8024
vkey=123
[udp]
mode=udp target_addr=127.0.0.1:8080 server_port=9002Copy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | udp |
server_port | 在服务端的代理端口 |
target_addr | 内网目标 |
http代理模式
[common]
server_addr=1.1.1.1:8024
vkey=123
[http]
mode=httpProxy server_port=9003Copy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | httpProxy |
server_port | 在服务端的代理端口 |
socks5代理模式
[common]
server_addr=1.1.1.1:8024
vkey=123
[socks5]
mode=socks5 server_port=9004 multi_account=multi_account.confCopy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | socks5 |
server_port | 在服务端的代理端口 |
multi_account | socks5多账号配置文件(可选),配置后使用basic_username和basic_password无法通过认证 |
私密代理模式
[common]
server_addr=1.1.1.1:8024
vkey=123
[secret_ssh]
mode=secret password=ssh2 target_addr=10.1.50.2:22Copy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | secret |
password | 唯一密钥 |
target_addr | 内网目标 |
p2p代理模式
[common]
server_addr=1.1.1.1:8024
vkey=123
[p2p_ssh]
mode=p2p password=ssh2 target_addr=10.1.50.2:22Copy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | p2p |
password | 唯一密钥 |
target_addr | 内网目标 |
文件访问模式
利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动
[common]
server_addr=1.1.1.1:8024
vkey=123
[file]
mode=file server_port=9100 local_path=/tmp/ strip_pre=/web/Copy to clipboardErrorCopied
项 | 含义 |
---|---|
mode | file |
server_port | 服务端开启的端口 |
local_path | 本地文件目录 |
strip_pre | 前缀 |
对于strip_pre
,访问公网ip:9100/web/
相当于访问/tmp/
目录
断线重连
[common]
auto_reconnection=true
暂无评论内容