发布于 

群晖使用NPS内网穿透教程

群晖使用NPS内网穿透教程

环境需要

部署acme.sh,申请免费SSL证书 - ZM Blog (b-log.ga)

Nginx安装与配置 - ZM Blog (b-log.ga)

域名解析

为服务器添加域名解析,一个泛域名就够了,这里指所有二级域名都解析指向服务器

后面在nps服务端内配置各个服务需要的二级域名就可以了,这样dns解析省去重复配置

安装nps

下载服务端安装文件

1
wget https://github.com/yisier/nps/releases/download/v0.26.12.3/linux_amd64_server.tar.gz

解压安装文件

1
tar -zxvf linux_amd64_server.tar.gz

安装nps

1
./nps install

启动nps

1
nps start

停止和重启可用,stop和restart

  • 访问服务端ip:web服务端口(默认为8080)
  • 使用用户名和密码登陆(默认admin/123,正式使用一定要更改)

服务端配置

配置服务端文件 nano /etc/nps/conf/nps.conf

1
2
3
4
#调整为非80端口,不占用后面nginx监听80端口
http_proxy_port=8020
#不设置https端口,即关闭nps的https反代理,后面配合nginx实现https
https_proxy_port=
1
2
3
4
#修改后台管理web的登录信息以及端口
web_username=admin
web_password=ww354770
web_port = 8080

配置重载

1
2
nps reload
nps restart

登录后台管理web

新增一个客户端,没啥可选择的其实都可以默认

TCP协议代理

客户列表点击隧道-新增一个TCP连接,设置服务器映射的端口;目标(内网)的IP:端口,点击新增即可。

http协议代理

客户列表点击主机-新增一个http连接,设置主机(你的域名),模式默认或者http;目标写内网IP:端口,点击新增

因为前面域名解析使用的是泛域名解析,所以这里主机xx.example.com,xx是可以随意设置成你想要的二级域名

DNS均会解析到NPS服务端,再由服务端对应的域名前缀转发到对应内网端口。

服务端配置备份

1
tar czvf /etc/nps/conf.tar /etc/nps/conf/

服务器更换后可拷贝到新服务器nps同目录下生效

客户端配置

我是群晖做客户端直接使用套件安装吧,群晖套件中心添加社区套件来源,其他安装方式见官方文档

1
https://spk7.imnks.com/

安装好套件,打开填写服务端配置ip:端口;连接密钥,保存即可。

再回到服务端后台管理web,这里客户端列表显示在线,就已经连接上了

配合Nginx实现SSL

在Nginx默认配置目录下新建一个ssl文件夹,用于存放ssl证书

1
mkdir /etc/nginx/ssl

使用acme.sh申请好SSL证书后,使用以下命令部署到Nginx

example.com 修改为自己acme.sh申请时使用的域名

1
2
3
4
acme.sh --install-cert -d *.example.com \
--key-file /etc/nginx/ssl/*.example.com.key \
--fullchain-file /etc/nginx/ssl/*.example.com.cer \
--reloadcmd "service nginx force-reload"

编辑 nano /etc/nginx/nginx.conf配置文件,选择添加或替换以下配置,注意替换*.example.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}

#http监听80端口转发到nps端口8020
http
{
server {
listen 80;
server_name *.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8020;
}
#http强制跳转https
rewrite ^(.*) https://$host$uri permanent;
#return 301 https://$server_name$request_uri;
}

#https监听443端口并配置ssl
server {
listen 443;
server_name *.example.com;
ssl on;
ssl_certificate /etc/nginx/ssl/*.example.com.cer;
ssl_certificate_key /etc/nginx/ssl/*.example.com.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:8020;
}
}

}

重载nginx配置

1
systemctl reload nginx

搞定。

参考

Document (ehang-io.github.io)