本地磁盘文件挂载到服务器

大致思路:使用Frp【一个内网穿透工具】来实现本地【windows】和服务器【linux】创建连接,再让本地【windows】的共享目录挂载到服务器。

说人话,先让这两台机器在一个内网,服务器访问windows开了共享的文件

后面还有实现个人云盘搭建,是借助Frp来完成


挂载储存

实现了frp后,只是说明服务器与本地可以相互连接上,但还没实现挂载功能

本地配置Smb服务

具体配置看这篇文章 https://os.51cto.com/article/658846.html

里面还讲了如何“创建新用户”与“打开共享文件”

本地配置好后,继续执行下面的

安装cifs工具包

ubuntu输入下列命令

1
apt-get install cifs-utils

centos输入下列命令

1
yum install cifs-utils

安装过程中有提示Y/N的输入y回车

创建要挂载到的目录

先创建一个目录为你要挂载到的目录,例如我要挂载到/mnt/driver目录下

1
mkdir /mnt/driver

执行挂载

命令如下

1
2
mount -v -t cifs //127.0.0.1/目录名 /mnt/driver/ -o 'port=服务器frp监听端口,username=win用户名,password=win密码,vers=3.0'

举例

1
mount -v -t cifs //127.0.0.1/test /mnt/driver/ -o 'port=4500,username=lthero,password=sssss,vers=3.0'

注意

  • 127.0.0.1 对应frpc.ini中local_ip,因为服务器与本地机子连接了,可以使用这个地址
  • /test 表示:本地机子共享的目录,比如:我共享三个目录,并挂载test这个目录到服务器

举例

  • port 是frpc.ini中remote_port,是将本地数据【本地数据通过local_port】转发到服务器时,服务器监听的端口
  • username 是刚刚创建的windows下的用户,password是对应密码【建议windows下创建个新用户】
  • vers 如果不加这个参数,默认用1.0版本,死活不能成功……在tensflow上找到了答案,修改成3.0可以

vers=3.0这个参数坑了我两个小时……

成功

挂载成功

取消挂载

到此挂载就完成了,如果需要解除挂载ssh终端输入下列命令即可

1
umount /挂载目录

例如上面我的,则我输入

1
umount /mnt/driver

如果提示umout:/mnt:target is busy的话可以使用以下方法取消挂载【提示busy往往是有应用使用这个目录,或着当前正处于这个目录,cd退出就能解决

这里以取消挂载/mnt/driver为例

安装fuser

ubuntu安装fuser命令

1
apt-get install -y psmisc

centos安装fuser命令

1
yum install -y psmisc

查看是谁在使用挂载目录

1
fuser -cu /mnt/driver

强制卸载

1
fuser -ck /mnt/driver

强制卸载

1
umout -f /mnt/driver

验证

1
df -h

Frp内网穿透

原理:使用Frp协议让服务器开放个7000端口与本机连接,再将内容映射到7500端口允许公网访问

注意,以下有两个端口都要在服务器放开!

1、本机与服务器连接,端口默认为7000【如本机与服务器的7000端口建立Frp连接】

2、公网访问服务器时,端口默认为7500【如最终访问123.123.132.132:7500】

还有一个本地应用服务的端口,【如本地windows的frp应用的端口地址】

3、local_port = 445

1.1 服务器下载frp

github下载对应版本的frp程序,点击下载,如果访问不了github我也贴心的准备了国内下载地址,点击下载

下面这个是amd64版本的下载方式,tar解压,mv修改名字【使用uname -a查询服务器架构】

1
2
3
4
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz
tar xzf frp_0.43.0_linux_amd64.tar.gz
mv frp_0.43.0_linux_amd64 frp
cd frp

frp目录下面有一些文件,分别是服务端文件和客户端文件

打开frps.ini【表示服务端配置文件】

1
2
3
4
5
[common]  
#默认连接端口,可以自定义端口
bind_port = 7000
#连接密钥,建议加上更安全,可以自定义,相当于密码,需要客户端密钥一致
token = 123456

服务器启动frp服务端

1
2
# 启动frps
./frps -c frps.ini

frp服务端启动成功

1.2 客户端配置frp

windows下载对应windows版本的frp点击下载

下载后解压,修改frpc.ini【表示frp客户端配置文件】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[common]
#服务器地址
server_addr = 54.92.98.138
#刚刚frp服务端开放的端口
server_port = 7000
#刚刚frp服务端设置的密码
token = 123456

[ssh]
type = tcp
#本地windows的ip地址
local_ip = 127.0.0.1
#本地windows的frp应用的端口地址
local_port = 445
#将本地frp数据转发到服务器的4500这个端口
#所以服务器一定要开放4500端口
remote_port = 4500

windows再启动frpc.exe,此时就可以通过外网访问本地服务

frpc.exe启动成功


搭建云盘

到这还没结束,下一步,可以在服务器上运行个可道云盘,解决了服务器磁盘容量小的问题,但需要服务器宽带以及本地上传速度要大。

装可道云盘有两种方案,在本地安装可道云 或 在服务器安装可道云

在本地安装可道云

方案1参考:https://www.zhaoyabo.com/?p=6584#1

安装好后,只用上面的Frp功能【不需要挂载存储】,将本地服务穿透到服务器即可,服务器不需要很大的配置,服务器只做转发操作

  • 本地服务器默认用80端口,所以需要将frpc.ini的local_port修改成80,其它的无需修改【下面有使用https的方案】

在服务器安装可道云

方案2:https://kodcloud.com/download/

安装好后,按上面的操作,使用Frp挂载,也可以实现。但这种方案的速度可能会更慢,并且对服务器占用较大

我最终采用“在本地安装可道云再穿透到服务器”,但……校园网上传速度太慢,效果一般。


FRP使用HTTPS

参考:

上面的过程完成后,只能使用ip+端口进行访问,下面,使用域名+tls加密访问

步骤1、服务器修改frps.ini配置

1
2
3
4
5
6
7
8
9
10
[common]
#frp端口,和之前一样
bind_port = 7000
token = 123456
#因为80端口被nginx占用,建议用其它端口
vhost_http_port = 8080
#因为443端口被nginx占用,建议用其它端口
vhost_https_port = 4443
#后面想用域名访问,这里一定要写主域名!!!经过测试写*.lthero.cn不行
subdomain_host = lthero.cn

步骤2、服务器配置nginx文件

在nginx的conf.d这个目录下面,添加一个文件【文件名设置为要访问的域名】,用来让nginx作反向代理。比如创建文件

1
vim /etc/nginx/conf/conf.d/amz.lthero.cn.conf

【反向代理我的理解:当用户访问driver.lthero.studio这个地址时,nginx监听到并与frp协作,将frp的数据转发到7000这个端口】

driver.lthero.studio是要访问的域名

只要修改下面有注释的行,并复制到amz.lthero.cn.conf

  • proxy_pass http://127.0.0.1:8080; 只要修改**“8080”**成 vhost_https_port = 8080
  • proxy_pass http://127.0.0.1:8080; 中的 HTTP ,请勿写成 HTTPS .
  • proxy_set_header Host $host:80; 注意需加上80端口,否则会无限循环301跳转,导致网页打不开提示重定向次数过多
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
43
server {
listen 80;
# 要修改server,就是域名
server_name driver.lthero.studio;
# 将访问http的强制重定向到https
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
# 要修改server,就是域名
server_name driver.lthero.studio;
# TLS的证书位置【要提前上传到服务器】
ssl_certificate /root/ssl/driver.lthero.studio/driver.lthero.studio.crt;
# TLS的公钥位置【要提前上传到服务器】
ssl_certificate_key /root/ssl/driver.lthero.studio/driver.lthero.studio.key;

client_max_body_size 50m;
client_body_buffer_size 256k;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
proxy_connect_timeout 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_ignore_client_abort on;

location / {
# 这里只要修改“8080”为上面设置的vhost_https_port = 8080
# 127.0.0.1不要动,http不要修改成https
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:80;
proxy_ssl_server_name on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

重启nginx,服务器就配置好nginx了

1
systemctl restart nginx

另外,需要在DNS解析的提供商那边,把driver.lthero.studio服务器ip绑定


步骤3、服务器打开frp

使用systemctl来控制启动

1
sudo vim /lib/systemd/system/frps.service

把下面内容写到frps.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/your/path/frps -c /your/path/frps.ini

[Install]
WantedBy=multi-user.target

使用方法:

1
2
3
4
5
6
7
8
9
10
# 启动frps
sudo systemctl start frps
# 自启动
sudo systemctl enable frps
# 重启应用
sudo systemctl restart frps
# 停止应用
sudo systemctl stop frps
# 查看应用的日志
sudo systemctl status frps

有一些网站会免费提供frp服务,比如:https://www.ioiox.com/frp.html


步骤4、修改客户端frp配置

打开客户端frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[common]
server_addr = 54.92.98.128
server_port = 7000
token = 123456

[https]
type = https
# 这里要设置本地服务的端口,本地也开了https
local_port = 443
local_ip = 127.0.0.1
# 一定要写域名,这个域名是frp使用https转发的域名,要和上面配置nginx的域名相同
# 有两种方式,看下面的注意
# 1、写完整域名
# custom_domains = driver.lthero.studio
# 2、只写子域名
# subdomain = driver


注意

  • 如果服务器的 frps.ini 没有配置 subdomain_host主域名,那么客户端的 frpc.ini 中域名参数需使用 custom_domains = driver.lthero.studio 需填写完整的域名
  • 如果服务器的 frps.ini 配置了 subdomain_host主域名,那么客户端的 frpc.ini 中域名参数需使用subdomain = driver,不用写完整的域名


步骤5、客户端修改phpstduy

客户端打开phpstudy【就是本地安装php并运行网站的那个应用】,打开某个网站的修改,可以看到使用https的选项

在phpstudy使用driver.lthero.studio域名,并点击https后,需要输入证书,就和上面配置nginx时对应的证书和公钥一样即可

将原来80端口设置为443

随后完成创建,但需要打开本地hosts文件,删除127.0.0.1 driver.lthero.studio这条记录,否则电脑端访问driver.lthero.studio时,会被定位使用本地的进程

【当然,也可以使用ping driver.lthero.studio这个命令来判断,如果解析的ip不是本地127地址就可以了】

如图,第一次ping我没删除hosts文件对应的那条记录。第二次ping时,则删除了这条记录,就可以访问到服务器了

ping driver.lthero.studio结果

这个步骤只是修改本地web服务,如果用java服务或其它php服务,道理是一样的,只要设置好本地服务端口,再直接运行客户端frpc.exe即可


步骤6、启动客户端frp

正常启动frpc.exe即可

image-20220618110045909


步骤7、访问

用手机、电脑都访问http://driver.lthero.studio测试


搭建流媒体平台

效果图

jellyfin平台

借助jellyfin这个软件,一键搭建自己的流媒体平台,大体过程为

适应jellyfin的frpc.ini设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#配置jellyfin
[ssh]
# 使用tcp
type = tcp
local_ip = 127.0.0.1
local_port = 8096
remote_port = 7500

[web]
# 使用tcp
type = http
local_ip = 127.0.0.1
local_port = 8096
remote_port = 7500
  • 本地端口修改为8096:是jellyfin默认的端口。
  • 远程端口和之前一样使用7500。
  • 这里就不用https协议了【因为我没成功……】,使用普通的ssh远程端口转发即可

[^]: ssh 远程端口转发文章:https://blog.lthero.cn/2022/06/17/Frp-Mount-Windows-Share/


注意

  • phpstudy创建好网站后,如果使用了域名和Https的方案,在本地文件hosts里面,会将127.0.0.1与域名绑定。如果在phpstudy添加了域名和https后,一定要将hosts里面【127.0.0.1与域名】这一条记录删除,否则本地访问这个域名会被定位到本地的进程,而不是服务器


小结

  • 有这次内网穿透+磁盘挂载+云盘搭建的经验,我感觉离拥有个人NAS又近了一步。

  • 同时,体会到frp功能的强大,之前使用ssh命令做内网穿透,有些服务还是无法映射到外网,如果以后有机会,可以尝试用frp。

  • 在上述的记录中,肯定有很多不完善,或着步骤不清楚的地方,望指教。


参考资料

Linux使用mount挂载Windows共享文件夹 https://cloud.tencent.com/developer/article/1404159

frp内网穿透,公网服务器vps挂载内网openwrt Samba共享文件,实现aria2下载资源到本地 https://imold.wang/resource/goodsshare/723.html

frp内网穿透,本地内网samba共享目录挂载到远程VPS中教程 https://iant.work/blog/787.html

https://askubuntu.com/questions/1162199/mount-cifs-fails-with-mount-error2-no-such-file-or-directory

windows打开SMB服务 https://blog.csdn.net/qq_41429510/article/details/104858471