废物利用:自建WebDAV实现异地办公协作
- IT
- 11天前
- 33热度
- 0评论
今年上半年,阿里、腾讯先后推出了200Mbps、不限流量的VPS机型,而且还支持了ipv6。一众论坛上大伙儿开始抓耳挠腮,这该怎么用才能充分发挥呢?建个站啥的根本用不上这么大的带宽,除非——建的是WebDAV。
对于用电脑从事生产的行业来说,项目组对于文件共享是刚需。但目前其实没有特别好的解决方案。NAS可以解决局域网内的文件共享问题,但它本身自带的跨网络文件传输功能非常鸡肋。ftp早已经是上个世纪的产物,如今Windows的资源管理器已经不再支持。sftp、ssh只适合程序员,普通人估计连多看一眼的兴趣都没有。但WebDAV还是保持着一定的生命力,从Win11 24H2的升级就可以看出,它悄摸地升级了Windows上的Web Client组件,让原本只支持默认端口(80/443)WebDAV的资源管理器可以支持自定义端口,这说明WebDAV还没有被完全遗忘。
Windows对WebDAV还是比较友好的,可以用资源管理器直接映射网络驱动器,让它变成一个本地分区,操作与正常的本地硬盘几乎没有区别,用起来非常方便。安卓对WebDAV的支持也令人满意,苹果则稍微差一点,但只需装一个客户端,即可将WebDAV整合进系统的文件浏览器,那就还是方便的。
阿里、腾讯的VPS空间是非常昂贵的,但它有优质的线路;家中废弃的笔记本电脑,空间绰绰有余。我们可以将前端放在VPS上,后端放在笔记本电脑上,从而集合两者的优势。
一、准备工作
1、公网VPS:安装ubuntu系统,设置root登录(非必须,frps如果要使用本机小于1000的小端口号,需要以root权限运行),安装nginx,certbot,frps,参考之前的文章,此处不再详述
2、内网笔记本电脑:重装成Windows Server 2025(新出炉的系统,不错,推荐),安装frpc服务
3、内网文件服务器,本文以一台异地的NAS为例(这是最复杂的情况)
4、域名解析:阿里云。这里注意,必须拥有一个备案过的域名,如果没有,下面可以不用看了。
5、梳理目标:文件服务器提供SMB,Windows Server负责WebDAV,VPS负责反向代理。要求后两者不能影响其他正常Web服务。
二、内网Windows Server 2025端配置
之所以笔记本这边选用Windows系统,是因为涉及到工作文件的处理,一个熟悉的可视化界面还是必须的。
1、安装Apache
实践证明,用Apache来部署WebDAV比IIS方便的多,一个关键原因就是Apache的所有配置、帐号设置、权限设置,全部在conf文件中搞定,非常清晰。而IIS的配置散落在各处,权限设置还需要结合NTFS,对管理员来说很不友好。
到这里下载最新版本的Apache:https://www.apachelounge.com/download/。它不用安装,解压缩即可,压缩包中有一个Apache24文件夹,假设将它放到c:\Apache24。
修改了C:\Apache24\conf:\httpd.conf,将默认端口
listen 80
改成:
listen 8080
这样Apache的默认网站端口就变成了8080,避免与IIS冲突。cmd进入c:\Apache24\bin\,执行:
httpd.exe -k install
httpd.exe -k start
就完成了Apache的安装和启动。此时浏览器访问:http://localhost:8080,会看到“It works!”,表明Apache已经正常工作。
打开c:\Apache\conf\httpd.conf,将以下四行前面的注释符取消:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so
LoadModule ssl_module modules/mod_ssl.so
这就启用了WebDAV模块。第三行可以精确地设置WebDAV文件夹允许的操作类型,这一点在多用户使用时非常重要。第四行启用ssl模块,安全起见,笔记本电脑与VPS的通信也将全部用tls加密以确保数据安全。
接着在文件的末尾,加上一行:
Include conf/extra/webdav.conf
我们的WebDAV网站将全部放在一个<Virtualhost>段中,并写到一个单独的配置文件conf/extra/webdav.conf中,这样将来编辑起来会更加方便。
我们可以先编辑好一个基础框架。在webdav.conf中,先写上这么几行:
Listen 8443
<VirtualHost *:8443>
DocumentRoot "D:/WD/index"
ServerName webdav-in.mysite.com
</VirtualHost>
首先明确WebDAV将监听8443端口,并创建了一个<VirtualHost>段,指定了8443端口。DocumentRoot设置了网站的根目录,我们将在“D:\WD\index”目录中创建一个index.html文件,提供一个浏览器访问时的首页说明,以增强友好性。域名webdav-in.mysite.com需要在阿里云上创建好,指向公网VPS的IP地址。
2、申请证书
由于笔记本电脑在内网,所以普通的http-01验证是无法申请成功的。即便使用frp将80端口映射到公网临时申请成功,也影响证书续期。所以建议用DNS-01方法。
首先到这里下载最新版本的wacs:https://www.win-acme.com/。假设将wacs放置在c:\wacs。
然后在阿里云上创建一个RAM帐号(子帐号),赋予该子帐号的AliyunDNSFullAccess权限,申请Accesskey ID、Accesskey Secret,将它们妥善保存。
到这里下载wacs的aliyun插件:https://github.com/win-acme/win-acme/releases,解压缩后,放置到C:\wacs\plugins\validationdns。
运行wacs,用手动方式将阿里云的两个Accesskey存入到wacs的库中,然后申请证书,这里申请的是webdav-in.mysite.com。最后使用保存PEM文件的方式,将PEM存入到你任意指定的cert文件夹,假设它位于:C:\Apache24\certs\webdav-in.mysite.com\。
还可以用wacs指定在续期的时候执行一个脚本,用来自动重启Apache,具体不再详述。
3、设计文件夹结构
假设WebDAV将用于多个不同场合,那么它的结构应该是这样的:
公司1
└─ 项目1
└─ 项目2
公司2
└─ 项目1
└─ 项目2
思考清楚之后,首先在D:\WD目录下创建需要的公司文件夹。用不同的公司名称划成多个独立的“圈子”是有必要的,同一个公司的人可以看到其他的项目文件夹,但未必进得去;但不同公司的人,就连项目文件夹都不要让他看见了。后续可以为每个项目文件夹单独设置权限。
4、设计帐户体系
为了便于管理,帐户名应能体现出基本信息,比如公司、地点。例如,公司1_部门1_常州,表示整个常州团队的公用帐号。
可以创建一个bat脚本来批量创建用户:
@echo off
set HTPASSWD=C:\Apache24\conf\.htpasswd
if exist %HTPASSWD% del %HTPASSWD%
C:\Apache24\bin\htpasswd.exe -cb %HTPASSWD% CP1_DP1_CZ "PASSWORD" & :: 公司1部门1常州团队
C:\Apache24\bin\htpasswd.exe -cb %HTPASSWD% CP2_DP1_SQ "PASSWORD" & :: 公司2部门1宿迁团队
当然也可以创建个人帐户,如果需要更精细的颗粒度的话。这个脚本每次将清空.htpasswd文件并重新生成,生成的.htpasswd中保存的密码为密文。
5、配置WebDAV段
对webdav.conf作一些小小的完善:
Listen 8443
<VirtualHost *:8443>
DocumentRoot "D:/WD/index"
ServerName webdav-in.mysite.com
UseCanonicalName Off
DavDepthInfinity on
DavLockDB "C:/Apache24/var/DAVLock"
SSLEngine on
SSLCertificateFile "C:/Apache24/certs/webdav-in.mysite.com/webdav-in.mysite.com-crt.pem"
SSLCertificateKeyFile "C:/Apache24/certs/webdav-in.mysite.com/webdav-in.mysite.com-key.pem"
SSLCertificateChainFile "C:/Apache24/certs/webdav-in.mysite.com/webdav-in.mysite.com-chain.pem"
# 这一段定义了index.html作为浏览器访问的首页,并设置为匿名即可访问
DirectoryIndex index.html
<Directory "D:/WD/index">
Options -Indexes
Require all granted
</Directory>
#根目录不能直接访问,需要用alias给一个虚拟路径,这里用的是dav
#同时,限制只能P_Admin访问它
Alias /dav "D:/WD"
<Directory "D:/WD">
Dav On
Options +Indexes
AuthType Basic
AuthName "WebDAV Root"
AuthUserFile "C:/Apache24/conf/.htpasswd"
Require user P_Admin
</Directory>
#一级目录也需要alias
Alias /CP1 "D:/WD/CP1"
<Directory "D:/WD/CP1">
Dav On
AuthType Basic
AuthName "公司1 根目录"
AuthUserFile "C:/Apache24/conf/.htpasswd"
<RequireAll>
#列出所有需要访问该公司下项目文件夹的所有人
Require user CP1_USER1 CP1_USER2 CP2_USER1
#禁止用户自行创建项目文件夹,因为用户无法指定文件夹权限
Require method OPTIONS PROPFIND GET HEAD LOCK UNLOCK
</RequireAll>
</Directory>
# 2级目录,单独设置权限
<Directory "D:/WD/CP1/PRJ1">
Dav On
AuthType Basic
AuthName "项目1"
AuthUserFile "C:/Apache24/conf/.htpasswd"
Require user CP1_USER1 CP1_USER2
</Directory>
# 一级目录,不进行项目级管理的例子
Alias /f "D:/WD/FREE1"
<Directory "D:/WD/FREE1">
Dav On
AuthType Basic
AuthName "自由文件夹"
AuthUserFile "C:/Apache24/conf/.htpasswd"
Require user USER1 USER2
</Directory>
放开Windows Server的8443端口入站,重启Apache服务,Windows Server 2025这边就配置差不多了,不过现在还没办法访问它,因为我们无法在内网使用SSL。
6、配置frpc
将Windows Server 2025的端口8443映射到公网VPS的8443端口(端口不必一样)。前一篇介绍了具体方法,此处不再详述。
三、公网VPS配置
1、nginx配置
首先创建域名解析,假设为webdav-out.mysite.com,这里必须指向公网VPS的IP。
首先创建一个基础的nginx配置文件,放入/etc/nginx/sites-enabled中,文件夹建议用域名webdav-out.mysite.com:
server {
server_name webdav-out.mysite.com;
listen 80;
}
启用它:nginx -s reload,然后用certbot申请证书:
certbot --nginx -d webdav-out.mysite.com
certbot将自动改写nginx配置文件。然后再对webdav-out.mysite.com作亿点点改造,让它能够胜任这个两层SSL的反代任务:
map $http_destination $dav_dest {
default $http_destination;
"~^https://webdav-out\.mysite\.com(:443)?/(.*)$" https://webdav-in.mysite.com/$2;
"~^https://webdav-in\.mysite\.com:8443/(.*)$" https://webdav-in.mysite.com/$1;
}
server {
server_name webdav-out.mysite.com;
client_max_body_size 4g;
proxy_request_buffering off;
proxy_buffering off;
proxy_max_temp_file_size 512m;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
send_timeout 1800s;
client_body_timeout 1800s;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host webdav-out.mysite.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Destination $dav_dest;
proxy_set_header Authorization $http_authorization;
proxy_set_header Proxy-Authorization $http_proxy_authorization;
proxy_redirect https://webdav-in.mysite.com/ https://webdav-out.mysite.com/;
proxy_pass https://webdav-in.mysite.com:8443;
proxy_ssl_server_name on;
proxy_ssl_name webdav-in.mysite.com;
proxy_ssl_verify off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
listen 443 ssl; # managed by Certbot
#ssl段由certbot生成,略
}
server {
if ($host = webdav-out.mysite.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name webdav-out.mysite.com;
return 404; # managed by Certbot
}
重新加载nginx。此时,客户端访问https://webdav-out.mysite.com时,首先到达公网VPS的443端口,然后被反向代理到8443端口,接着又被frp重定向到了内网Windows Server 2025的8443端口,从而访问到那里的Apache WebDAV服务。nginx负责传递相关域名、验证信息。为了改善体验,增加了nginx的临时文件大小,关闭了缓冲,大幅延长了超时时间。
四、进阶:让Apache虚拟UNC路径
按照专机专用的原则,笔记本电脑是不宜用来做文件服务器的。但我们又不希望直接在NAS上装Apache,似乎太麻烦。
假设笔记本电脑和NAS已经用Zerotier创建了一个VPN通道,那么对笔记本电脑来说,NAS就是一台局域网电脑,可以直接用\\server\sharefolder这样的形式访问到它。那是否可以将这个UNC路径作为WebDAV的一部分呢?
1、修改Apache服务运行帐户
答案是可以的,但需要一点点小的Trick。这里的关键是:Apache运行的本地用户需要具备访问\\NAS的权限!
这个听起来似乎很奇怪,这有何难?我直接访问一下\\NAS,输入用户名密码不就行了?非也。
默认情况下,Apache以SYSTEM帐户运行。而你在其他用户名(比如Administrator)中存储的凭据并不会被SYSTEM帐户使用。更扯的是,即便你用psexec切换到SYSTEM帐号的cmd,强行net use连接\\NAS,它仍然不会生效!SYSTEM帐户非常特殊,它就压根不能持久保存Windows凭据。
所以,我们需要让Apache以另一个用户名来运行服务。创建新用户apacheusr,设置强密码。然后:
sc.exe config Apache2.4 obj= "PC-NAME\apacheusr" password= "PASSWORD"
重启Apache服务,此时它就以apacheusr的身份运行了。为了避免NTFS权限问题,我们将apacheusr加入Administrators。然后以apacheusr的身份登录桌面,连接\\NAS,Bingo,此时Apache服务已经可以访问到\\NAS上的共享文件了。
2、使用mlink硬链接共享文件夹
经过一番不懈的努力,发现直接alias UNC路径虽然可以,但只适用于一级目录。但我们的项目1、项目2处于二级目录,怎么办呢?
其实最直观的方案就是mlink。这是Windows自带的功能,只需要用mlink将\\NAS\share1\project1链接到D\WD\CP1\prj1即可。
五、客户端使用
一切配置好后,客户端的使用是非常简单的。对于Windows来说,只需要在资源管理器左侧的“我的电脑”上右键,点击“映射网络驱动器”,然后输入“https://webdav-out.mysite.com/CP1”(或其他公司目录),然后输入用户名密码即可。需要注意的是,无论是路径还是用户名,都是大小写敏感的!对于管理员来说,则可以映射“https://webdav-out.mysite.com/dav”,然后输入管理员帐户的用户名、密码。
同时,浏览器访问:https://webdav-out.mysite.com,还会直接打开你准备好的index.html,在这里可以对webdav的使用方法等作一个简单说明。
OK,希望以上内容能节约你几个小时的摸索时间。enjoy!