目录

使用docker自建vaultWarden服务器并实现全平台https访问

使用docker自建vaultWarden服务器并实现全平台https访问

背景

1台运行了DSM6.2的群晖,打算在其上搭建1台bitWarden服务器,来替代keePass和1password,搭建过程中走了不少弯路,特此记录。

在搭建中尝试使用过群晖第三方套件源中的vaultWarden套件,但是版本过旧且配置也比较麻烦,最终选定用docker自己搭建。

搭建过程分为以下几个步骤:

  • docker拉取并安装vaultWarden

    • 坑1:解决黑群晖6.2套件中心和docker无法访问网络的问题
  • vaultWarden在群晖中反向代理配置

  • 阿里云ssl证书申请和配置

  • 浏览器/手机端bitWarden连接配置


正式开始

第一个坑:解决群晖6.2套件中心和docker无法正常访问网络的问题

具体症状:

  • 套件中心报错:“套件中心连接失败,请检查您的网络和时间设置”
  • docker中报错:”注册表查询失败“

首先使用ssh登陆群晖并ping外网域名确认网络是正常没有问题的,

ssh登陆群晖使用ping命令会提示没有权限,可以使用sudo ping

如果嫌弃每次使用sudo比较麻烦,可以使用"sudo su -“提升为root权限

解决办法:

  1. 由于群晖的套件中心和docker的注册表中心也就登陆管理时候使用,所以可以在要使用的使用临时使用代理恢复网络功能

  2. 在个人使用的电脑上开启代理功能,然后在群晖中配置使用个人电脑上的代理即可

  3. 以clash为例,首先确认clash工作正常,然后勾选“允许局域网连接入Clash”和“系统代理”,并记住端口号,我用的是789

  4. 然后在cmd中输入ipconfig查看并记住自己电脑的ip(我这里ip为172.168.0.2,这里已经假设个人pc和群晖服务器是在可以正常互访的网络中)

  5. 在群晖控制面板中,点击“网络-常规-代理服务器”,填写步骤1和步骤2的端口和ip,点击应用

    https://i-blog.csdnimg.cn/blog_migrate/f4bdff607892b3e5dda6a5ffd4cdf694.png

  6. 如果不出意外,这时候群晖的套件中心和docker注册表功能已经可以正常访问。

使用docker安装vaultWarden。

创建一个vaultwarden数据存放目录

在安装前需要在群晖中创建一个vaultWarden的目录,用于存放bitWarden服务器的数据文件,这个目录建议直接创建一个一级目录,仅开放权限给管理员即可,例如我的文件目录为: vaultwarden\data (这里仅为示例,实际使用可以根据自己的喜好选择存放位置,不过这个位置一定要确保安全和便于备份)

  1. 打开file station,点击菜单:新增共享文件夹
  2. 在创建向导中输入名称:vaultwarden,勾选2个隐藏的选项,去掉”启用回收站“,不加密,其他设置都默认
  3. 回到file station中,找到新创建号的vaultwarden文件夹,点击菜单:新增文件夹,创建一个名为 data 的文件夹
下载安装vaultwarden的docker容器

在docker注册表中搜索并下载” vaultwarden “,实际完整的源地址是:“ vaultwarden/server:latest ”(我实际安装的是当前最新版本1.30,latest标签会保证你安装的就是当前时间的最新版)

安装时候需要注意,在创建容器向导中点击 高级设置

  1. 勾选启用自动重启
  2. 存储空间添加文件夹,选择前边创建好的 vaultwarden/data ,装载路径输入” /data
  3. 端口将容器端口80对应的本地端口改为 8057 (仅为示例,可根据自己情况选择,建议不要设置1000以内的)
  4. 环境中点击加号,名称: TZ ,值: Asia/Shanghai ,此处为设置服务器的时区,防止与实际时间不同

完成并启动后,此时应该可以通过 http://群晖服务器ip:8057 访问vaultWarden的网页端了,但是由于不是https访问,所以不能登陆不能注册


下边就看自己个人需求,如果只需要网页端和浏览器插件端使用,那可以看下边 反向代理实现https访问 的方法,如果需要在pc或手机的app端访问使用,那可以看下边 注册ssl证书实现https访问 的方法,这两个方法二选一即可。

反向代理实现https访问的方法:

  1. 打开群晖的控制面板-Synology应用程序门户-反向代理服务器,点击新增

  2. 来源协议: HTTPS ,来源端口: 8058 (注意:这里端口要和前边的端口区分开)

  3. 目的地协议: HTTP ,目的地端口: 8057 (注意:这里是前边的 8057端口 (实际映射了vaultwarden服务器的 80端口 )

    https://i-blog.csdnimg.cn/blog_migrate/4ca6cc8b80a338b34542052375e65f91.png

  4. 此时在内网输入 https://群晖服务器ip:8058 就可以使用https方式访问了,可以正常注册和登陆,将前边的地址加端口复制到浏览器bitWarden插件中也可以使用插件登陆服务器(但因为没有有效的证书,所以浏览器还是会显示”不安全“,所以pc端和手机端的app依然无法正常登陆)

注册ssl证书实现https访问的方法:

本方法可以实现全平台正常登陆服务器,但需要以下几个条件:

  1. 有一个有效的可管理的域名
  2. 内网服务器映射外网访问需要有网关路由的权限(是家用路由环境也可以)
  3. 有公网ip

教程开始

  1. 个人使用的是阿里云注册的域名,证书申请也使用阿里云的ssl证书注册服务,免费但仅有3个月有效期

  2. 证书申请

    1. 登陆阿里云,点击搜索框,搜索并打开 数字证书管理服务(SSL证书) ,点击 SSL证书 - 免费证书 ,点击下边的 立即购买 ,选择 个人测试证书 ,其他默认,费用是免费,点击立即购买
    2. 然后点击 创建证书 ,选择 默认证书 ,输入绑定给群晖服务器的域名
      • 假设你的域名是 abc.com
      • 如果你最终直接使用 abc.com:8057 访问你的 vaultWarden服务器,那么这里你就应该直接填写 abc.com
        • 如果你是使用二级域名访问(例如: bw.abc.com:8057 ),那么这里你应该填写 bw.abc.com
    3. 域名验证方式: 自动DNS验证 ,填写自己的联系信息和所在地等信息后提交
  3. 证书验证

    1. 在证书列表中,点击后边的 验证 按钮,打开验证页面,分别复制里边的 主机记录记录值 (这个窗口不要关,后边步骤要继续使用)

    2. 登陆自己的域名管理页面(以我的阿里云域名为例),设置 DNS验证要使用的解析记录

      1. 打开域名列表,点击后边的 解析 ,打开域名解析设置页面
      2. 添加记录,记录类型选择: TXT ,主机记录: 粘贴刚刚复制的主机记录 ,记录值: 粘贴刚刚复制的那一长串记录值 ,点击确认
    3. 回到证书验证页面,点击 验证 按钮,提示验证成功就说明设置正确,如果未成功请检查步骤5-6的设置是否正确对应

    4. 成功并提交后,等待证书审核通过即可(阿里云的审核在5-20分钟左右,成功后会收到站内消息和短信提醒)

  4. 证书下载和安装

    1. 收到证书审核通过消息后,在证书列表页面,点击后边的 下载 按钮,选择 Nginx 后边的下载即可
      • 下载到的压缩包里会有2个文件,分别是扩展名为key的私钥和pem的证书,文件名默认为你申请的域名,假设你的域名是 bw.abc.com ,那么你的两个文件应该是:
        • bw.abc.com.key
        • bw.abc.com.pem
    2. 回到群晖的文件管理页面file station,打开在前边创建好的 vaultwarden\data 目录,在里边创建一个文件夹 ssl ,然后将上一步中下载到的2个证书文件上传进去
      • 最终存放2个证书文件的目录是 vaultwarden\data\ssl
      • 因为 vaultwarden\data 在创建vaultWarden的docker容器时候已经映射到了docker容器内了,所以在docker的 \data\ssl 目录下也能看到刚刚上传的2个证书文件
    3. 在docker-容器中找到前边创建好的vaultwarden服务器,选中后点击上边的 编辑 按钮(如果按钮是灰色的就先停止vaultwarden服务器)
    4. 编辑页面点击 环境 ,点击加号新增
      • 名称: ROCKET_TLS
      • 值: {certs="/data/ssl/bw.abc.com.pem”,key="/data/ssl/bw.abc.com.key”}
        • 请注意将示例中的 bw.abc.com 替换为你实际的证书文件名
    5. 应用并启动vaultwarden服务器
  5. 设置域名绑定(有静态公网ip的话设置a记录绑定,动态公网ip可以使用ddns绑定,没有公网ip可以考试使用sd-wan,根据自己情况选择)

  6. 设置端口映射,将vaultwarden服务器的 8507 端口映射到出口路由器的对应 8507 端口

    • 注:使用ssl证书的方法就不需要再设置反向代理了,所以直接使用vaultWarden的端口即可
  7. 如果域名绑定正确,即可使用域名+端口访问vaultwarden服务器 ,可以成功访问后就可以将前边域名+端口复制到pc或手机端的bitWarden的app中使用了

内网访问问题

内网使用域名加端口方式访问出现502bad gateway错误

以下2个解决办法二选一

解决办法1:编辑本机hosts文件,添加 服务器ip 域名 ,例如:

192.168.16.10 bw.abc.com

windows系统hosts文件路径: c:\windows\system32\driver\etc\hosts

mac系统hosts文件路径: /etc/hosts

注意事项:修改请注意权限问题,例如windows下修改该文件需要使用管理员权限打开记事本,然后再打开hosts文件修改才能保存

解决办法2:在路由器的dns服务器上添加内网服务器和域名的映射,同时设置dhcp的dns为路由器ip,或直接设置本机上dns服务器为路由器ip(下图以H3C和华为AR的2款路由器dns server设置示例,不同路由器设置方法大同小异

https://i-blog.csdnimg.cn/blog_migrate/188ec75aad19b98f8c8b93d37e3458c9.png https://i-blog.csdnimg.cn/blog_migrate/48108d0f1b40235d1e71ef3ffada47d7.png

其他注意事项

使用clash或其他软件并同时在内网访问服务器时,需要注意将域名、服务器ip段在软件中添加排除(排除后访问流量就不爬楼而变成了直达),否则上边全部设置正确也会无法访问

以clash为例,排除指定域名和地址的方法:

  1. 点击 设置-系统代理-系统代理绕过的域名/ip网段
  2. 在弹出的窗口中添加域名和服务器ip即可
在路由器上设置了dns服务域名映射,但还是无法访问

验证dns映射正确的方法:直接ping服务器域名,例如: ping bw.abc.com ,看测试过程中的ip是不是服务器的内网ip,如果是,则表示dns域名映射正确,如果不正确可以根据下边步骤排查:

  1. 确保路由器上开启了dns服务器功能,并且域名和ip映射设置正确
  2. 确保dhcp服务器的dns服务器ip已设置为了路由器的ip(可以使用 ipconfig /all 查看)
  3. 确保本机已经重新获取了最新的ip(可以使用 ipconfig /renew 重新获取ip)
  4. 使用 ipconfig /flushdns 刷新dns缓存,并关闭重启浏览器

关闭vaultwarden的注册功能

如果服务器是个人使用,在自己账号注册完毕后可以关闭注册功能

  1. 在docker中关闭 vaultwardne ,然后点击 编辑
  2. 环境 中点击加号添加变量: SIGNUPS_ALLOWED=false

iOS端BitWarden无法使用解决办法

症状:近几个月的iOS端BitWarden客户端(版本范围疑似202409~202412)更新后出现能正常登陆,但却无法看到密码库内容并且报错:发生错误。但与此同时win版、mac版、浏览器插件版都能正常使用。

解决办法

更新服务端版本至最新版即可(实测从v1.30更新至当前最新v1.32后问题自动解决)。

操作办法

如旧版本服务端安装是参考本文的话,那么只需要在docker中将原有的vaultwarden-server1停用,然后照本文方法重新拉取一下最新的vaultwarden/server的镜像,然后重新创建一个vaultwarden-server2的容器(容器参数全部按照旧的server1原样复制即可),直接启动后所有密码库和https访问全部都不会受影响。

注意事项:

  • 强烈建议顺便将 vaultwarden\data 文件夹下载做一次备份,这个文件夹里就是你的全部密码库,建议定期备份
  • 旧的server1停用后,点开编辑,将里边的端口改掉,例如我的2个端口是3012-3012,8507-80,改为其他随便,例如3011-3012,8506-80,这样新建的server2容器就能正常沿用原来的端口3012和8507了
  • 旧的Server1停用后,点开编辑,取消“启用自动重新启动”
  • 如果你的群晖在网页端docker页面中无法拉取下载镜像,甚至使用了本文前边的代理端口方法开始提示无法下载镜像,可以尝试使用ssh登陆群晖,然后使用命令行拉取镜像
    • 命令行拉取镜像方法
      • ssh 你的群晖服务器ip(使用ssh登陆你的群晖)
      • sudo -i(输入你的管理员密码并回车,这里提升为root权限)
      • docker pull vaultwarden/server:latest(能看到进度条就说明拉取成功,等全部走完,剩下回去web图形界面继续操作即可)
    • 如果你和我一样比较倒霉,也是命令行也无法拉取镜像,那可以尝试这个办法
      • 继续上面的命令行,并且保持root权限状态
      • vi /var/packages/Docker/etc/dockerd.json(使用vi编辑dockerd.json文件)
      • 按键盘字母键i(进入编辑模式,屏幕底部出现 – INSERT –提示)
      • 使用方向键+DEL键将“registry-mirrors”后边的内容删除,然后修改为下图内容
      • https://i-blog.csdnimg.cn/direct/5c248e7222e04c8291dc958b6cd1cf64.png
        • 注:如果改乱了想不保存退出,可以按一下esc键,然后屏幕底部输入:q!+回车(冒号+字母q+叹号,意为不保存强制退出)
      • 编辑完毕,按esc键退出编辑模式(– INSERT – 提示消失),然后屏幕底部输入:wq(冒号+字母w+字母q,意为保存并退出),按回车保存退出vi编辑器
      • 回到web群晖管理页面,进入套件中心,搜索找到docker,点停用,然后再点启用(或打开),重启一下docker服务
      • 然后再次回到命令行页面,再重新尝试docker pull vaultwarden/server:latest,应该就能正常拉取了