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地址為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),即可暢享內網了
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
即可訪問ssh
p2p服務
適用范圍: 大流量傳輸場景,流量不經過公網服務器,但是由於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的ssh
web管理
介紹
可在網頁上配置和管理各個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雙方都是Symmetric 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群反饋
捐助
如果您覺得nps對你有幫助,歡迎給予我們一定捐助,也是幫助nps更好的發展。