在云服务器,搭建内网穿透,顺便还搭建了一个博客网站
前言
出租屋网络没有公网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、云服务器防火墙开放端口
端口号 | 用途 |
---|---|
22 | ssh远程访问和管理(默认开放端口) |
80 | web访问端口(默认开放端口) |
443 | https访问web端口(默认开放端口) |
8080 | 用户NPS管理界面的默认登录端口 |
5000 | 威联通nas管理页面端口,如果安装nas时有自定义,按实际情况添加 |
8024 | NPS客户端连接端口 |
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_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 |
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,请及时修改。
3、客户端连接
- 点击左侧菜单栏中的客户端
- 点击新增
- 按照nas信息填写备注
- 下面的压缩和加密选择“是”
- 点击下面的新增,完成增加客户端操作
添加好后就会得到一个客户端ID为2。
点击左边的加号,会出现下面的一条客户端命令,复制出来备用,后面要用到
这个命令是在windows系统下面执行的,执行的时候不需要前面的"./"。
在保存了nps客户端的文件里按住shift键点击鼠标右键,打开Powershell
输入命令cmd,和从网页上获取到的命令,出现Successful就可以了。 可以看到网页上的状态显示在线 创建TCP隧道
客户端ID写之前创建客户端得到的ID,服务端端口写一个没有用过的端口就行,当然防火墙里面也要放行这个端口。目标端口写需要访问的端口。
这样所有访问服务端端口的流量就会被转发到客户端端口,也就成功连接上了处于内网的主机。
三、NPC客户端搭建
1、安装容器管理器
首先在 APP Center中找到并安装 Container Station,QNAP Container Station (软件容器工作站) 支持 LXD 与 Docker®、Kata 等轻量级虚拟技术,就是一个容器工具,当作docker用就行了。
2、安装npc服务端
2.1、创建映射目录
下载配置文件,上传
解压下载的文件包,将配置文件目录上传到nas中创建的目录
可以看到配置文件上传完成
2.2、获取镜像
点击创建
搜索:npc
选择:ffdfgdfg/npc,点击安装
版本选择:v0.26.10 【和服务端选择相同版本】
2.3、设置镜像并启动
在命令一行,粘贴上面复制的命令
点击高级设置
点击网络:
输入一个自定义的主机名
点击生产MAC地址
点击共享文件夹
删除第一条的记录
点击本地共享文件夹,找到刚刚上传的conf目录,挂在路径输入/conf,点击创建
摘要页面,点击确定
几分钟后,可以在总览页面看到新创建的nps-1容器
NPS管理页面中,客户端已经显示在线状态
3、添加转发规则
由于威联通NAS的访问端口为5000,则在TCP隧道中添加5000转发规则
注意:目标端口的位置要填入nas的局域网的IP加端口,否则需要在家里的路由中添加本地端口转发
4、测试效果
浏览器输入:云服务器IP:5000
四、增强设置
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证书启用
在各种平台申请免费证书或者付费证书,本次使用腾讯云,主要是因为这个都属于域名配置部分,在一个平台处理会简单很多,减少很多不必要的麻烦
点击SSL按钮开始申请,之后按照腾讯云的流程走就行了,很简单
下载证书
我们使用nginx做转发,下载nginx这个就很好了,将下载好的zip包上传到服务器的一个路径下,解压
修改配置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