前言

出租屋网络没有公网IP,nas使用自带的cloud服务无法使用,为了实现远程电脑文件的备份功能,搭建内网穿透服务,实现公网访问内网设备,顺便搭建了一个博客,并且增加了域名转发,ssl证书。

一、NPS概述

NPS是一款轻量级、高性能、功能强大的内网穿透代理服务器,支持tcp、udp、http等几乎所有流量转发,支持WEB界面管理主机连接。

NPS的原理

运行NPS服务的云服务器和运行NPS客户端的主机之间会创建一条TCP或UDP隧道,可以映射云服务器上的某个端口到客户端主机的指定端口,其他主机访问云服务器的这个端口的流量都会通过创建的这条隧道转发到映射的主机端口,实现内网穿透效果。

NPS构成

软件分为服务器端(nps)和客户端(npc)

管理均在服务器端完成,客户端配置并不多,基本上都是端口转发方面的,本次的nas作为客户端存在

二、NPS服务端搭建

1、下载软件

本教程使用的是github上面的一款开源工具,具体链接附在下面。下载与自己服务器和客户端的系统相对应的版本,如果无法访问,也可以通过我的网盘分享下载,网盘里面有linux和windows的64位服务端,还有windows64位的客户端。

获取到最新的nps服务端版本:https://github.com/ehang-io/nps/releases

​ 版本为:2.6.10

​ 按照服务器选择对应的安装包:linux_amd64_server.tar.gz

NPS官方文档:https://ehang-io.github.io/nps/#/feature

PS:由于内网部分使用NAS自带的docker服务组件搭建,所以不需要下载软件,如果是windows电脑或其他linux机器,需要下载客户端并安装

2、云服务器配置

首先需要一台云服务器,我选的是Ucloud的轻量应用服务器,部署centos 7.6系统。

2.1、防火墙配置

2.1.1、云服务器防火墙开放端口

端口号用途
22ssh远程访问和管理(默认开放端口)
80web访问端口(默认开放端口)
443https访问web端口(默认开放端口)
8080用户NPS管理界面的默认登录端口
5000威联通nas管理页面端口,如果安装nas时有自定义,按实际情况添加
8024NPS客户端连接端口

2.2、上传安装包到云服务器

方法1:直接下载部署包到服务器

#创建安装目录
mkdir /usr/local/nps

#下载部署包
cd /usr/local/nps
wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_arm64_server.tar.gz

#没有wget命令的话,需要安装
yum -y install wget

方法2:使用Xshell连接服务器,然后上传部署包

#使用rz命令上传部署包
cd /usr/local/nps
rz 回车,找到下载好的文件,或者使用wget命令下载

#没有rz命令需要安装
yum -y install lrzsz

也可以用其他ftp工具上传,方法类似,不在赘述

2.3、解压安装包

#进入文件目录
cd /usr/local/nps

#解压安装包

tar -zxvf linux_amd64_server.tar.gz

2.4、修改nps配置文件

配置文件路径:

/etc/nps/conf/nps.conf

#用户名密码等敏感字段推荐修改

web_username=admin
web_password=123

如果需要修改登录用户名、密码、网页登录端口等信息,可以修改/etc/nps下的nps.conf文件,相关的参数信息可以看表格。

名称含义
web_portweb管理端口
web_passwordweb界面管理密码
web_usernameweb界面管理账号
web_base_urlweb管理主路径,用于将web管理置于代理子路径后面
bridge_port服务端客户端通信端口
https_proxy_port域名代理https代理监听端口
http_proxy_port域名代理http代理监听端口
auth_keyweb 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_portp2p模式开启的udp端口
pprof_ipdebug pprof 服务端ip
pprof_portdebug pprof 端口
disconnect_timeout客户端连接超时,单位 5s,默认值 60,即 300s = 5mins

2.5、安装并启动

#进入文件目录
cd /usr/local/nps

#安装nps
./nps install

#启动nps
nps start

如果是windows系统,管理员身份运行cmd,安装时输入nps.exe install,启动需要进入程序目录输入nps.exe start。 安装后windows配置文件位于C:\Program Files\nps,linux位于/etc/nps

2.6、登录管理页面

浏览器打开IP+8080端口,即可看到nps管理界面,用户名和密码默认是admin/123,请及时修改。

image

3、客户端连接

  1. 点击左侧菜单栏中的客户端
  2. 点击新增
  3. 按照nas信息填写备注
  4. 下面的压缩和加密选择“是”
  5. 点击下面的新增,完成增加客户端操作

添加好后就会得到一个客户端ID为2。

点击左边的加号,会出现下面的一条客户端命令,复制出来备用,后面要用到

这个命令是在windows系统下面执行的,执行的时候不需要前面的"./"。

在保存了nps客户端的文件里按住shift键点击鼠标右键,打开Powershell

输入命令cmd,和从网页上获取到的命令,出现Successful就可以了。 可以看到网页上的状态显示在线 创建TCP隧道

客户端ID写之前创建客户端得到的ID,服务端端口写一个没有用过的端口就行,当然防火墙里面也要放行这个端口。目标端口写需要访问的端口。

这样所有访问服务端端口的流量就会被转发到客户端端口,也就成功连接上了处于内网的主机。

三、NPC客户端搭建

1、安装容器管理器

首先在 APP Center中找到并安装 Container Station,QNAP Container Station (软件容器工作站) 支持 LXD 与 Docker®、Kata 等轻量级虚拟技术,就是一个容器工具,当作docker用就行了。

1659006295475

2、安装npc服务端

2.1、创建映射目录

1659006879942

下载配置文件,上传 1659006960556

解压下载的文件包,将配置文件目录上传到nas中创建的目录

1659007058520

1659007027593

可以看到配置文件上传完成 1659007372596

2.2、获取镜像

点击创建

搜索:npc

选择:ffdfgdfg/npc,点击安装

版本选择:v0.26.10 【和服务端选择相同版本】 1659006388210

2.3、设置镜像并启动

在命令一行,粘贴上面复制的命令 1659007116470

点击高级设置

点击网络:

输入一个自定义的主机名

点击生产MAC地址 1659007149017

点击共享文件夹

删除第一条的记录

点击本地共享文件夹,找到刚刚上传的conf目录,挂在路径输入/conf,点击创建 1659007256281

摘要页面,点击确定 1659007331728

几分钟后,可以在总览页面看到新创建的nps-1容器 1659007427581

NPS管理页面中,客户端已经显示在线状态 1659007523810

3、添加转发规则

由于威联通NAS的访问端口为5000,则在TCP隧道中添加5000转发规则 1659007778230

注意:目标端口的位置要填入nas的局域网的IP加端口,否则需要在家里的路由中添加本地端口转发 1659007792408

4、测试效果

浏览器输入:云服务器IP:5000 1659007928810

四、增强设置

1、实现域名访问

2、nginx反向代理

将多个连接,转发到服务器内部的其他端口,实现只在外网暴露一个端口,多个域名都可以访问对应的资源

安装nginx

yum -y install nginx

常用命令

  • nginx -s stop
    • 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
  • nginx -s quit
    • 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
  • nginx -s reload
    • 因改变了Nginx相关配置,需要重新加载配置而重载。
  • nginx -s quit
    • 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
  • nginx -s reload
    • 因改变了Nginx相关配置,需要重新加载配置而重载,平滑重载配置文件,服务不会停。
  • nginx -s reopen
    • 重新打开日志文件。
  • nginx -c filename
    • 为 Nginx 指定一个配置文件,来代替缺省的。
  • nginx -t
    • 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
  • nginx -v
    • 显示 nginx 的版本。
  • nginx -V
    • 显示 nginx 的版本,编译器版本和配置参数

nginx配置文件示例

#user  nobody;
worker_processes  1;
#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout  65;
    gzip  on;
    
    server {
        listen  80;
        server_name  nas.nerubian.cn; 
        
        access_log  /usr/local/nginx/logs/nginx.nas.log;
        error_log  /usr/local/nginx/logs/error.nas.log;
        
        location  / {
            proxy_pass  http://127.0.0.1:5000/;
        }
    }
    server {
        listen  80;
        server_name  nps.nerubian.cn; 
        
        access_log  /usr/local/nginx/logs/nginx.nps.log;
        error_log  /usr/local/nginx/logs/error.nps.log;
        
        location  / {
            proxy_pass  http://127.0.0.1:8080/;
        }
    }
    server {
        listen  80;
        server_name  www.nerubian.cn; 
        
        access_log  /usr/local/nginx/logs/nginx.halo.log;
        error_log  /usr/local/nginx/logs/error.halo.log;
        
        location  / {
            proxy_pass  http://127.0.0.1:8090/;
        }
        
        error_page  404              /404.html;
        location = /40x.html {
            root   html;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }        
        
    }
    
}

配置文件合格测试

nginx -t

如下是通过,其余是报错,需要解决,百度吧
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动nginx

#重新加载 systemd
systemctl daemon-reload
#启动
systemctl start nginx
#添加开机自启动
systemctl enable nginx

测试转发效果

浏览器访问网址,可以正常出现页面即可

关闭5000端口、8080端口和8090端口的防火墙,这样外网只需要暴露几个端口,减少端口暴露,提高安全性

3、SSL证书启用

在各种平台申请免费证书或者付费证书,本次使用腾讯云,主要是因为这个都属于域名配置部分,在一个平台处理会简单很多,减少很多不必要的麻烦

image-1659151159972 点击SSL按钮开始申请,之后按照腾讯云的流程走就行了,很简单

下载证书

我们使用nginx做转发,下载nginx这个就很好了,将下载好的zip包上传到服务器的一个路径下,解压 image-1659151576332

image-1659151622706

image-1659151770315

修改配置nginx


worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout  65;
    gzip  on;
    
    server {
        listen 443 ssl; 
        server_name www.nerubian.cn; 

        access_log  /usr/local/nginx/logs/nginx.halo.log;
        error_log   /usr/local/nginx/logs/error.halo.log;
    
        ssl_certificate /etc/nginx/ssl/halo/www.nerubian.cn_nginx/www.nerubian.cn_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/halo/www.nerubian.cn_nginx/www.nerubian.cn.key; 
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3; 
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;

        location  / {
            proxy_pass  http://127.0.0.1:8090/;
        }
    }
    server {
        listen  80;
        server_name  www.nerubian.cn;
        return 301 https://$host$request_uri;     
    }

    server {
        listen 443 ssl; 
        server_name nas.nerubian.cn; 

        access_log  /usr/local/nginx/logs/nginx.nas.log;
        error_log   /usr/local/nginx/logs/error.nas.log;
    
        ssl_certificate /etc/nginx/ssl/nas/nas.nerubian.cn_nginx/nas.nerubian.cn_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/nas/nas.nerubian.cn_nginx/nas.nerubian.cn.key; 
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3; 
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;

        location  / {
            proxy_pass  http://127.0.0.1:5000/;
        }
    }
    server {
        listen  80;
        server_name  nas.nerubian.cn; 
        return 301 https://$host$request_uri;      
    }

    
    server {
        listen 443 ssl; 
        server_name nps.nerubian.cn; 

        access_log  /usr/local/nginx/logs/nginx.nps.log;
        error_log   /usr/local/nginx/logs/error.nps.log;
    
        ssl_certificate /etc/nginx/ssl/nps/nps.nerubian.cn_nginx/nps.nerubian.cn_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/nps/nps.nerubian.cn_nginx/nps.nerubian.cn.key; 
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3; 
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;

        location  / {
            proxy_pass  http://127.0.0.1:8080/;
        }
    }
    server {
        listen  80;
        server_name  nps.nerubian.cn; 
        return 301 https://$host$request_uri;      
    }
}

重新载入nginx配置文件

nginx -s reload

访问测试

image-1659151925914

image-1659151873284

image-1659151902170