Cloudflare操作
初始默认设置。我是caddy仅放行了IPV6根据你自己的情况选择IPV4还是IPV6,`DNS` `记录`添加AAAA记录并当时开启小黄云。`SSL/TLS` `概述` 加密模式:完全(严格)
VPS操作
更新系统的软件包列表,升级所有已安装的软件包,清理不再需要的包,清理缓存,并通过 curl 下载并执行 Docker 的安装脚本
apt update -y && apt full-upgrade -y && apt --purge autoremove -y && apt autoclean -y && curl -fsSL https://get.docker.com | bash
创建 /etc/docker-data/vaultwarden 文件夹并进入该文件夹
sudo mkdir -p /etc/docker-data/vaultwarden && cd /etc/docker-data/vaultwarden
新建docker-compose.yaml文件
nano docker-compose.yaml
复制粘贴docker-compose.yaml文件内容,保存并退出。
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://域名/生成一个最少16位大小写字母数字随机路径"
volumes:
- ./vw-data:/data
caddy:
image: caddy:2
container_name: caddy
restart: unless-stopped
ports:
- "[::]:80:80"
- "[::]:443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-config:/config
- ./caddy-data:/data
environment:
DOMAIN: "https://域名"
EMAIL: "邮箱"
LOG_FILE: "/data/access.log"
创建Caddyfile文件
nano Caddyfile
复制Caddyfile文件内容,保存并退出。
:80 {
abort
}
:443 {
tls /data/default_server.crt /data/default_server.key {
protocols tls1.3
}
abort
}
{$DOMAIN} {
log {
level INFO
output file {$LOG_FILE} {
roll_size 10MB
roll_keep 10
}
}
tls {$EMAIL} {
protocols tls1.3
}
encode zstd gzip
route {
reverse_proxy /生成一个最少16位大小写字母数字随机路径/* vaultwarden:80 {
header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
}
handle /* {
abort
}
}
}
创建一个自签证书防止IP暴露域名
sudo mkdir -p /etc/docker-data/vaultwarden/caddy-data && sudo openssl req -x509 -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -keyout /etc/docker-data/vaultwarden/caddy-data/default_server.key -out /etc/docker-data/vaultwarden/caddy-data/default_server.crt -days 36500 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"
启动容器
docker compose up -d
打开浏览器进入域名https://域名/生成一个最少16位大小写字母数字随机路径/
创建账号,导入密码,创建两步验证(建议使用第三方App,密码和2FA分离,鸡蛋不要装在一个篮子,我用的Aegis,建议分2个设备安装导入2FA,2FA数据加密导出后再套一层GPG加密存放云端U盘和电脑,有2FA新增就闲时手动多端数据同步),再验证非正确路径是否会访问不了。
新增关闭页面并禁用注册
nano docker-compose.yaml
在 vaultwarden environment下新增
SIGNUPS_ALLOWED: "false"
WEB_VAULT_ENABLED: "false"
格式与DOMAIN对齐,保存并退出。
重启docker
docker compose up -d && docker compose restart
再验证正确路径访问是否关闭了网页端
进入Cloudflare操作
安全性 WAF 自定义规则 编辑表达式 加入了仅自己设置的IP访问外加caddy证书续签的访问
(ip.src in {允许访问的IPV4地址,多IP的话中间空格}) or (ip.src in {允许访问的IPV6地址,多IP的话中间空格}) or (http.user_agent eq "acme.zerossl.com/v2/DV90" and ip.src eq 2a0e:ac00:231:8080::a31:803d)
采取措施 跳过 要跳过的 WAF 组件 所有其余自定义规则 放置位置 第一个
创建第二个阻止规则 编辑表达式 ,阻止域名访问,外加censys.io
(http.host eq "域名") or (ip.src in {162.142.125.0/24 167.94.138.0/24 167.94.145.0/24 167.94.146.0/24 167.248.133.0/24 199.45.154.0/24 199.45.155.0/24 206.168.34.0/24 2602:80d:1000:b0cc:e::/80 2620:96:e000:b0cc:e::/80 2602:80d:1003::/112 2602:80d:1004::/112}) or (http.user_agent eq "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)")
采取措施 阻止
分别用设置允许的IP例如梯子去访问,和不在允许IP列表例如家宽,验证是否生效。
安装Watchtower 自动1小时检查docker镜像容器更新,删除旧镜像。
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
--interval 3600
安装GNU Privacy Guard 和 rclone
sudo apt-get install gnupg
curl https://rclone.org/install.sh | sudo bash
生成 GPG 密钥
gpg --full-generate-key
导出私钥,并SFTP下载到本地,Windows端推荐Gpg4win
gpg --export-secret-keys 密钥ID > /root/private_key.gpg
Google Drive API 与token看这篇 Rclone挂载 Google Drive 教程
编辑 crontab 创建定时备份同步云端
crontab -e
光标移到最下方新增
0 8 * * * tar -czf - /etc/docker-data | gpg --encrypt --recipient "GPG密钥ID" -o /root/Vaultwarden.tar.gz.gpg --yes && rclone copy "/root/Vaultwarden.tar.gz.gpg" "GoogleDrive:vaultwarden_backup"
浏览器插件和app用bitwarden官方就行,主要就是密码和2FA不存放在一起,外加随机路径特定IP访问

