获取用户真实ip
如需使用需要在nps.conf中设置http_add_origin_header=true
在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。
本代理前会在每一个http(s)请求中添加了这两个 header。
热更新支持
对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端
客户端地址显示
在web管理中将显示客户端的连接地址
流量统计
可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异
当前客户端带宽
可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。
客户端与服务端版本对比
为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。
Linux系统限制
默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 tcp_max_syn_backlog somaxconn 酌情调整参数,增强网络性能
web管理保护
当一个 ip 连续登陆失败次数超过 10 次,将在一分钟内禁止该 ip 再次尝试。
可在 nps.conf 设置 open_captcha=true 进一步开启图形验证码
缓存支持
对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。
即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在nps.conf中设置http_cache=true,并设置http_cache_length(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数)
加密传输
链路加密的新方式:在
nps.conf设置tls_enable=true,客户端连接tls_bridge_port(默认8025)并加-tls_enable=true参数。详见 TLS 桥接加密。 nps 仍会在每次启动时随机生成 TLS 证书用于桥接通道。
站点保护
域名代理模式所有客户端共用一个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域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡
隧道端口自动生成
在 web 后台新增隧道时,服务端端口留空即可自动生成未被占用的端口号。
隧道复制
隧道列表页提供「复制」按钮:除了服务端端口随机生成,其他参数全部一键拷贝,方便创建多条相似隧道。
TCP 隧道获取真实 IP
两种方式选一:
- Proxy Protocol:在 web 上勾选开关,后端以 PROXY v1/v2 协议解析。
- HTTP 域名解析:使用域名代理模式,配合
http_add_origin_header=true通过X-Forwarded-For/X-Real-IP获取(见 说明)。
端口白名单
为了防止服务端上的端口被滥用,可在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,仅范围映射时有效
KCP协议支持
在网络质量非常好的情况下,例如专线,内网,可以开启略微降低延迟。如需使用可在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中设置 对于a.proxy.com/test将转发到web1,对于a.proxy.com/static将转发到web2
客户端最大连接数
为防止恶意大量长连接,影响服务端程序的稳定性,可以在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主要通信默认基于多路复用,无需开启。
多路复用基于TCP滑动窗口原理设计,动态计算延迟以及带宽来算出应该往网络管道中打入的流量。 由于主要通信大多采用TCP协议,并无法探测其实时丢包情况,对于产生丢包重传的情况,采用较大的宽容度, 5分钟的等待时间,超时将会关闭当前隧道连接并重新建立,这将会抛弃当前所有的连接。 在Linux上,可以通过调节内核参数来适应不同应用场景。
对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 高并发下可根据[Linux系统限制](## Linux系统限制) 调整
对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 tcp_syn_retries, tcp_retries1, tcp_retries2 高并发同上 nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接
环境变量渲染
npc支持环境变量渲染以适应在某些特殊场景下的要求。
在无配置文件启动模式下: 设置环境变量
export NPC_SERVER_ADDR=1.1.1.1:8024
export NPC_SERVER_VKEY=xxxxx
直接执行./npc即可运行
pprof性能分析与调试
可在服务端与客户端配置中开启pprof端口,用于性能分析与调试,注释或留空相应参数为关闭。
默认为关闭状态
自定义客户端超时检测断开时间
客户端与服务端间会间隔5s相互发送延迟测量包,这个时间间隔不可修改。 可修改延迟测量包丢包的次数,默认为60也就是5分钟都收不到一个延迟测量回包,则会断开客户端连接。 值得注意的是需要客户端的socket关闭,才会进行重连,也就是当客户端无法收到服务端的fin包时,只有客户端自行关闭socket才行。 也就是假如服务端设置为较低值,而客户端设置较高值,而此时服务端断开连接而客户端无法收到服务端的fin包,客户端也会继续等着直到触发客户端的超时设置。
在nps.conf或npc.conf中设置disconnect_timeout即可,客户端还可附带-disconnect_timeout=60参数启动