利用frp与nginx实现公网访问NAS

分享到:

能够在远程访问存储NAS上面的资料,才能真正发挥NAS的作用。但是对于没有公网IP的内网用户,如何实现在公网上面访问NAS,是一个需要事先解决的问题。

如果拥有一个有公网IP的VPS,可以通过 frp + Nginx 来实现内网穿透解决这个问题。另外,从安全角度考虑,如果有可能的话,整个链路上面的都使用 https 协议通讯更加安全。

下面大致描绘了访问的链路图:

  1. 浏览器通过https协议与 VPS 通讯。浏览器的请求先发到nginx上,ngnix再将请求转发的至frps。在frps前面加上nginx做反向代理的好处是,如果这个VPS上面有其他请求转发的需求(比如这个VPS部署了个人网站或者博客),那在访问所有这些服务的时候,都可以使用同一个端口(比如443)。使用默认端口的话,在访问的时候,端口号都可以不用输入
  2. frps与部署在NAS内网的frpc通讯,frpc将请求转发至内网的NAS。
1(( browser )) ---https---> (( nginx --> frps )) ---https--->> (( frpc --> NAS ))

VPS上的配置

配置frps

https://github.com/fatedier/frp/releases 上找到最新的版本并下载。解压后,修改frps.ini:

 1[common]
 2bind_port = 7000 
 3vhost_https_port = 7443
 4# 使用kcp加速
 5kcp_bind_port = 7001
 6
 7# auth
 8authentication_method = token
 9token = 12345678
10
11# log
12log_file = /var/log/frps.log
13log_level = info 
14log_max_days = 3

下面注册frps为系统服务。如果是ubuntu系统,按如下格式创建一个新的文件 /etc/systemd/system/frps.service

 1[Unit]
 2Description=frps service
 3After=network.target syslog.target
 4Wants=network.target
 5[Service]
 6Type=simple
 7ExecStart=/root/frp/frps -c /root/frp/frps.ini
 8
 9[Install]
10WantedBy=multi-user.target

启动frps服务

1systemctl start frps

设置为自动启动

1systemctl enable frps

Nginx配置

确保安装的nginx支持SSL。用下面命令, 如果返回值中有http_ssl_module则说明模块已经安装。如果没有,则需要安装该模块

1nginx -V

创建 /etc/nginx/cert 文件夹,把网站https证书与私钥都上传到这个目录下。

新建配置文件 /etc/nginx/conf.d/website.conf 。假设要以二级域名nas.test.com来访问,按照下面的格式配置

 1server {
 2    listen 443 ssl;
 3    server_name  nas.test.com;
 4    
 5    # ssl证书地址
 6    ssl_certificate     /etc/nginx/cert/website.pem;  # pem文件的路径
 7    ssl_certificate_key  /etc/nginx/cert/website.key; # key文件的路径
 8    
 9    # ssl验证相关配置
10    ssl_session_timeout  5m;    #缓存有效期
11    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    #加密算法
12    ssl_protocols TLSv1.2;     #安全链接可选的加密协议
13    ssl_prefer_server_ciphers on;   #使用服务器端的首选算法
14
15    location / {
16        proxy_pass https://127.0.0.1:7443;
17
18        # 针对源点使用https+SNI,需要下面两段
19        proxy_ssl_server_name on;
20        proxy_ssl_name $host;
21
22        # 由于是反向代理https,下面5个需要加上,否则可能报错
23        proxy_set_header Proxy-Connection "";
24        proxy_set_header Host $http_host;
25        proxy_http_version 1.1;
26        proxy_set_header X-Real-IP $remote_addr;
27        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
28
29        # proxy_ssl_verify默认是off的. 如果是on,源点的证书必须是正确的
30        proxy_ssl_verify off;
31
32        proxy_set_header cookie $http_cookie;        
33        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
34    }
35}

为了增加网站安全性,nginx配置里面需要添加一些安全相关的配置。可以自行搜索网上相关内容,这里不再多述。

执行下面命令重新加载nginx配置

1nginx -s reload

iptables

如果安装了iptables,需要确保所需的端口允许外部访问。至少需要放行4个端口:

  • https协议默认端口443
  • frps服务端口。端口号可自定义,用于与frpc通讯。上面例子中是7000
  • frps的vhost https端口。端口号可自定义,用于代理frpc所在内网的https服务。上面例子中是7443
  • frps的kcp端口。端口号可自定义,用于提升访问速度,使用的是udp协议。上面例子中是7001
1iptables -A INPUT -p tcp -m multiport --dport 443,7000,7443 -j ACCEPT
2iptables -A INPUT -p udp --dport 7001 -j ACCEPT

NAS端配置

在本机新建文件 frpc.ini, 按下面格式配置:

 1[common]
 2# VPS服务器IP
 3server_addr = xxx.xxx.xxx.xxx
 4server_port = 7000
 5# 使用kcp加速
 6protocol = kcp
 7
 8# auth
 9token = 12345678
10
11# log
12log_file = ./frpc.log
13log_level = info
14log_max_days = 3
15
16
17[nas]
18type = https
19# 内网NAS访问地址与端口
20local_ip = 192.168.1.100
21local_port = 443
22custom_domains = nas.test.com

上传刚才创建的frpc.ini至NAS,假设在NAS上路径是 /public/frpc/frpc.ini

在群晖或者威联通的docker容器服务中搜索oldiy/frpc,并下载镜像。创建容器的时候,需要指定一些参数:

  • 挂载NAS文件路径/public/frpc/frpc.ini 至容器文件路径 /frp/frpc.ini (装载路径不能修改),或者挂载NAS目录路径/public/frpc/ 至容器目录路径 /frp/
  • 容器网络模式选择 Host
  • 如果有限制CPU内存等选项,可自行设定

启动容器即可。

测试

做完上述步骤后,在浏览器中输入 https://nas.test.com 即可访问


参考: