NPS服务端和客户端的使用

内网穿透是指将内网中的软件服务通过网络代理方式暴露给广域网用户。可以实现内网穿透的方式很多,比如通过防火墙硬件、网络穿透软件来进行实现。本文主要介绍通过NPS软件实现典型的内网穿透。

NPS介绍

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


其官方网站为:https://ehang-io.github.io/nps
其官网文档对软件的安装、使用描述的非常完整,基本根据官方文档就可以进行顺利安装与使用

基本概念

了解该软件的使用,首先需要了解一个基本的内网穿透使用场景。

  • 服务器端,一般安装在公网服务器上,是所有内网资源对外的统一入口。
  • 客户端,一般安装在内网服务器上,是内网服务器与公网服务器的桥梁。
  • 客户端连接端口,客户端使用该秘钥连接服务端连接端口建立长连接,用于将外网服务器请求信息转发至对应客户端,对应客户端也通过该端口返回相关信息。
  • 客户端秘钥,在服务端部署完成后,需要建立客户端秘钥,并在客户端连接时需要使用该秘钥进行连接。

一个服务器端,可以对应多个客户端。在服务器端的不同端口,可以映射在不同客户端的对应本地端口之上。

典型场景

本文我们设计一个最常见的场景,来说明整个软件的使用过程。我们设定基本需求如下。

  1. 我们有一台具备公网IP的服务器,服务器名称为public-server,操作系统为linux
  2. 我们有两台内网服务器inner-server1(linux)、inner-server2(windows)
  3. 我们将公网服务器的8081端口,映射至inner-server1:80;8082端口映射至inner-server2:80端口。
  4. 两个代理协议均为TCP协议

操作步骤

外网服务器public-server(linux)服务端nps安装

  • 首先,需要登录其github项目发布版本页面 (https://github.com/ehang-io/nps/releases ) 下载对应版本服务端nps软件。根据public-server的情况这里我们下载,linux_amd64_server.tar.gz版本。
  • 通过ssh登录public-server,并将文件上传至对应安装目录,需要首先进行解压缩。(假定文件上传至目录/usr/nps)
tar -xzvf linux_amd64_server.tar.gz
  • 解压缩完成后进入解压目录,需要执行对应安装命令,以保障我们可以将nps相关命令与加载至bin资源下
sudo ./nps install
  • 之后我们需要启动相关服务端软件,并在控制台查看是否启动成功。
sudo nps start

配置网络代理并开启publiic-server WEB服务端端口

  • 在启动成功后,我们需要打开防火墙8080端口,使得可以通过浏览器登录其管理台。同时需要打开8024端口,使得客户端可以连接到服务端通讯端口。
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=8024/tcp
sudo firewall-cmd --reload 

使用浏览器登录相关端口,提示用户名称与密码。使用如下默认用户名密码进行登录。

登录成功后可以修改相关密码,修改配置文件 nps.conf

sudo vim /etc/nps/conf/nps.conf
web_username
web_password
  • 重新启动相关服务并尝试重新登录
sudo nps stop
sudo nps start

通过web管理台配置客户端接入信息

  • 使用浏览器登录相关端口,提示用户名称与密码。使用如下修改后用户名密码进行登录。
  • 点击 客户端 -> 新增 ,依次填写 备注(inner-server1)允许客户端通过配置文件连接(是)压缩(是)加密(是),不填写Basic 认证用户名Basic 认证密码唯一验证密钥
  • 点击 客户端 -> 新增 ,依次填写 备注(inner-server2)允许客户端通过配置文件连接(是)压缩(是)加密(是),不填写Basic 认证用户名Basic 认证密码唯一验证密钥
  • 新建完成后查看客户端清单,保存好两台服务器自动生成的唯一验证密钥客户端ID备用,在这里我们假定其分别为“client-key”、“client-id”

内网服务器inner-server1安装npc(linux)客户端并连接

  • 需要登录其github项目发布版本页面 ( https://github.com/ehang-io/nps/releases ) 下载对应版本客户端nps软件。根据public-server的情况这里我们下载,linux_amd64_client.tar.gz 版本。
  • 通过ssh登录inner-server1,并将文件上传至对应安装目录,需要首先进行解压缩。(假定文件上传至目录/usr/npc)
tar -xzvf linux_amd64_client.tar.gz
  • 解压缩完成后进入解压目录,需要执行对应安装命令,以保障我们可以将npc相关命令与加载至bin资源下,同时设置服务器ip地址端口以及连接秘钥(上一步新建客户端时自动生成并备用的信息)
sudo ./npc install -server=public-server:8024 -vkey=client-key
  • 之后我们需要启动相关服务端软件,并在控制台查看是否启动成功。
sudo npc stop
sudo npc start

内网服务器inner-server2安装npc(windows)客户端并连接

  • 需要登录其github项目发布版本页面 ( https://github.com/ehang-io/nps/releases ) 下载对应版本客户端nps软件。根据public-server的情况这里我们下载,windows_amd64_client.tar.gz 版本。
  • 通过ssh登录inner-server1,并将文件上传至对应安装目录,需要首先进行解压缩。(假定文件上传至目录D:\npc)
tar -xzvf windows_amd64_client.tar.gz 
  • 解压缩完成后进入解压目录,需要执行对应安装命令,同时设置服务器ip地址端口以及连接秘钥(上一步新建客户端时自动生成并备用的信息)。
npc.exe install -server=public-server:8024 -vkey=inner-server2唯一验证密钥
  • 之后我们需要启动相关服务端软件,并在控制台查看是否启动成功。
npc.exe stop
npc.exe start

外网服务器public-server(linux)服务端端口映射配置

  • 使用浏览器登录相关端口,提示用户名称与密码。使用如下修改后用户名密码进行登录。
  • 在此需要使用到上文谈到创建客户端后自动生成的客户端ID
  • 选择TCP 隧道->新增 ,依次填写 模式(TCP)、客户端ID(client-id)、备注(inner-server1-80)、**服务端端口(8081)、目标(127.0.0.1:80)
  • 选择TCP 隧道->新增 ,依次填写 模式(TCP)、客户端ID(client-id)、备注(inner-server2-80)、**服务端端口(8082)、目标(127.0.0.1:80)
  • 打开public-server相关防火墙
sudo firewall-cmd --permanent --add-port=8081/tcp
sudo firewall-cmd --permanent --add-port=8082/tcp
sudo firewall-cmd --reload 
  • 测试访问public-server:8081/8082端口并观察服务端、客户端日志进行验证转发是否成功。

总结

至此,我们基于nps完成了最常见的内网穿透配置,其实nps所支持的协议、操作系统非常多,大家可以根据官方文档进行逐步学习、验证即可。整体系统的可用性非常好,我部署了一年没有出现过任何问题。