先说效果,例如访问:http://nas.unfit.cn,可以直接访问内网nas服务器里的http://192.168.0.10:5000的nas项目,实现远程控制。
硬件需求:
公网服务器,配置无要求,但是必须得有公网的固定ip(如果没有公网ip的话,也可以利用ssh密钥远程自动解析实现,但是我们这篇文章只说有固定ip的)
内网服务器(例如:192.168.0.10。这台机器上网站项目正常运行,也就是说http://192.168.0.10:5000可以正常访问,我这里内网项目是群晖的nas,所以端口号是默认的5000,如果你是自己搭的项目,原理都是一样的)
列一个流程图吧
接下来我们一步一步来,先配置公网服务器的nginx配置:
先添加 nas.unfit.cn.conf 文件
在nginx的配置文件夹下,我的在:/usr/local/nginx/conf/vhost
server {
listen 80;#公网接入端口,这里使用默认80
server_name nas.unfit.cn; #example.com 填写被访问外网域名
location / { #默认是可以访问根目录也就是所有,这里可以设置别名,配合如下配置。
proxy_pass http://localhost:8081; #内部主机IP及端口,域名后面可以加具体网站路径来显示访问权限
}
}
添加之后,记得重启nginx服务
systemctl restart nginx.service
这里的nginx配置,就是监听80端口,如果请求域名是nas.unfit.cn的话,就将请求转发至本机的8081端口。
再修改 frps.ini 的配置信息
如果还不会操作frp,那可以看看这篇文章:使用frp免费做内网的穿透,实现从公网远程连接本地无公网ip的服务器。 - 不明文档 - 万档归一
我的本地地址是:/usr/local/frp/frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 8081 //这个是http的请求地址
vhost_https_port = 8880 //这个是https的请求地址
保存,重启 frp 服务
ps -aux|grep frp| grep -v grep //这个是查frp的进程
kill -9 对应的进程id //如果没有进程的话,这一步可以不操作
nohup ./frps -c frps.ini &
这样的话,公网的服务器就配好了。公网服务器的frp配置就是将nginx转发过来的8081端口的请求,再转发到内网服务器。
配置内网服务器
打开内网服务器的 frpc.ini
[common]
server_addr = x.x.x.x //这里填公网服务器的ip地址
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[unraid]
type = tcp
local_ip = 127.0.0.1
local_port = 5000 //这里配置内网机器的端口
remote_port = 8081 //这里配外网机器的端口,这个就相当于将外网的8081转到本机的5000端口
custom_domains = nas.unfit.cn
一样的,保存,然后重启服务
ps -aux|grep frp| grep -v grep #这个是查frp的进程
kill -9 对应的进程id #如果没有进程的话,这一步可以不操作
nohup ./frpc -c frpc.ini &
这里是和公网服务器的frp联动配置。公网服务器转发到内网服务器的5000端口。内网服务器的5000端口是正常能访问的,那就可以正常的响应请求。
这样就行了。可以通过 http://nas.unfit.cn 来访问了,不用带任何端口号。
还可以加上ssl,等空了再来处理吧。着急的同学,可以先参考文章自己弄弄:利用frp内网穿透实现https穿透 - 不明文档 - 万档归一 (unfit.cn)
-----2023年7月7日更新-----
加上ssl,实现https访问
修改公网服务器的nginx配置文件
vim /usr/local/nginx/conf/vhost/nas.unfit.cn.conf
server {
listen 80;
listen 443 ssl http2;
ssl_certificate /usr/local/nginx/cert/nas_unfit/cert.cer; #在这里要有ssl的文件,后缀是.cer或.pem都可以
ssl_certificate_key /usr/local/nginx/cert/nas_unfit/cert.key; #这里要有.key文件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name nas.unfit.cn;
access_log /data/wwwlogs/nas_unfti_cn_nginx.log combined; #不做请求记录的话,这行可以不要
location / {
proxy_pass http://localhost:8081;
}
}
保存,然后重启nginx服务
systemctl restart nginx.service
这样就可以通过https://nas.unfit.cn访问内网了。
其实原理很简单,就是在公网服务器的nginx配置里加上443端口ssl的监听就好了。80端口的http请求还是同样的转发至8081端口。