利用frp与nginx实现公网访问NAS
能够在远程访问存储NAS上面的资料,才能真正发挥NAS的作用。但是对于没有公网IP的内网用户,如何实现在公网上面访问NAS,是一个需要事先解决的问题。
如果拥有一个有公网IP的VPS,可以通过 frp + Nginx 来实现内网穿透解决这个问题。另外,从安全角度考虑,如果有可能的话,整个链路上面的都使用 https 协议通讯更加安全。
下面大致描绘了访问的链路图:
- 浏览器通过https协议与 VPS 通讯。浏览器的请求先发到nginx上,ngnix再将请求转发的至frps。在frps前面加上nginx做反向代理的好处是,如果这个VPS上面有其他请求转发的需求(比如这个VPS部署了个人网站或者博客),那在访问所有这些服务的时候,都可以使用同一个端口(比如443)。使用默认端口的话,在访问的时候,端口号都可以不用输入
- frps与部署在NAS内网的frpc通讯,frpc将请求转发至内网的NAS。
(( browser )) ---https---> (( nginx --> frps )) ---https--->> (( frpc --> NAS ))
VPS上的配置
配置frps
从 https://github.com/fatedier/frp/releases 上找到最新的版本并下载。解压后,修改frps.ini:
[common]
bind_port = 7000
vhost_https_port = 7443
# 使用kcp加速
kcp_bind_port = 7001
# auth
authentication_method = token
token = 12345678
# log
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
下面注册frps为系统服务。如果是ubuntu系统,按如下格式创建一个新的文件 /etc/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini
[Install]
WantedBy=multi-user.target
启动frps服务
systemctl start frps
设置为自动启动
systemctl enable frps
Nginx配置
确保安装的nginx支持SSL。用下面命令, 如果返回值中有http_ssl_module则说明模块已经安装。如果没有,则需要安装该模块
nginx -V
创建 /etc/nginx/cert 文件夹,把网站https证书与私钥都上传到这个目录下。
新建配置文件 /etc/nginx/conf.d/website.conf 。假设要以二级域名nas.test.com来访问,按照下面的格式配置
server {
listen 443 ssl;
server_name nas.test.com;
# ssl证书地址
ssl_certificate /etc/nginx/cert/website.pem; # pem文件的路径
ssl_certificate_key /etc/nginx/cert/website.key; # key文件的路径
# ssl验证相关配置
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
proxy_pass https://127.0.0.1:7443;
# 针对源点使用https+SNI,需要下面两段
proxy_ssl_server_name on;
proxy_ssl_name $host;
# 由于是反向代理https,下面5个需要加上,否则可能报错
proxy_set_header Proxy-Connection "";
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_ssl_verify默认是off的. 如果是on,源点的证书必须是正确的
proxy_ssl_verify off;
proxy_set_header cookie $http_cookie;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
}
为了增加网站安全性,nginx配置里面需要添加一些安全相关的配置。可以自行搜索网上相关内容,这里不再多述。
执行下面命令重新加载nginx配置
nginx -s reload
iptables
如果安装了iptables,需要确保所需的端口允许外部访问。至少需要放行4个端口:
- https协议默认端口443
- frps服务端口。端口号可自定义,用于与frpc通讯。上面例子中是7000
- frps的vhost https端口。端口号可自定义,用于代理frpc所在内网的https服务。上面例子中是7443
- frps的kcp端口。端口号可自定义,用于提升访问速度,使用的是udp协议。上面例子中是7001
iptables -A INPUT -p tcp -m multiport --dport 443,7000,7443 -j ACCEPT
iptables -A INPUT -p udp --dport 7001 -j ACCEPT
NAS端配置
在本机新建文件 frpc.ini, 按下面格式配置:
[common]
# VPS服务器IP
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
# 使用kcp加速
protocol = kcp
# auth
token = 12345678
# log
log_file = ./frpc.log
log_level = info
log_max_days = 3
[nas]
type = https
# 内网NAS访问地址与端口
local_ip = 192.168.1.100
local_port = 443
custom_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 即可访问
参考: