0. 背景

LastPass 个人用户手机端和电脑端同步要收费了。。。也一直种草 Bitwarden 很久了,想着反正有个服务器,不如自己整一个密码管理服务。上Bitwarden官网一看,最小需求也比我这小破站大呀。。。

不过又看见有人用 Rust 重写了一个服务端bitwraden_rs,用的服务器资源并不多。索性自己也整一个,记录下过程。

1. 安装docker

由于bitwarden_rs使用Docker镜像安装,参照Docker官方介绍 安装docker。

1.1 卸载旧版本

其实不需要。。。。。

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

1.2 安装docker

可自行选择一种方式安装,我选择设置 repository 的方式。

  • 首先设置源。
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 安装
sudo yum install docker-ce docker-ce-cli containerd.io
  • 启动
sudo systemctl start docker
  • 测试
sudo docker run hello-world
  • 添加用户到 docker
sudo gpasswd -a king docker

2. 域名解析设置

依据自己的实际情况,设置域名解析。

如解析 https://bitwarden.robincn.com 到 server_ip。

3. 安装bitwarden_rs

参照 bitwarden_rs官方介绍 安装。

docker pull bitwardenrs/server:latest

4. 规划转发规则并设置nginx

根据我的小站情况,拟将所有访问 https://bitwarden.robincn.com 的全部转发至 8080 端口。docker 容器中运行 bitwarden_rs 服务并将容器内的80端口映射到主机的8080端口,容器内的3012端口映射到主机的3012端口。

4.1 ssl证书设置

和之前一样使用 acme.sh 生成并安装证书。

acme.sh --issue --dns dns_cf -d bitwarden.robincn.com --nginx
acme.sh --install-cert --nginx -d bitwarden.robincn.com --key-file /etc/nginx/bitwardenrobincn/key.pem --fullchain-file /etc/nginx/bitwardenrobincn/cert.pem --reloadcmd "service nginx force-reload"

4.2 nginx设置

修改 nginx 配置文件,将 bitwarden.robincn.com 的访问全部转发到主机的8080端口。

# vim /etc/nginx/nginx.conf
# http{ # 在http段内增加如下内容server

    upstream bitwardenrs-default { server localhost:8080;}
    upstream bitwardenrs-ws { server localhost:3012;}
	
	# 所有访问都走https
    server {	
        listen 80;
        listen [::]:80;
        server_name bitwarden.robincn.com;
        return 301 https://$host$request_uri;
    }

	# 转发对应端口到主机80803012
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name bitwarden.robincn.com;

        ssl_certificate "/etc/nginx/passrobincn/cert.pem";
        ssl_certificate_key "/etc/nginx/passrobincn/key.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

        proxy_intercept_errors on;  # for error page render
        large_client_header_buffers 2 2k;   # 解决 Android 客户端同步问题

        # 解决网页加载问题
        gzip off;
        proxy_max_temp_file_size 0;

        client_max_body_size 128M;

        location / {
                proxy_set_header Host  $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_pass http://bitwardenrs-default;
        }
        location /notifications/hub/negotiate {
                proxy_set_header Host  $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_pass http://bitwardenrs-default;
        }
        location /notifications/hub {
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Connection $http_connection;

                proxy_pass http://bitwardenrs-ws;
        }

    }


5. 启动 Bitwarden 并测试

5.1 启动与测试

用命令行启动 Bitwarden 并通过网页添加用户进行基础测试。

注意本人将 Bitwarden 相关数据放在用户目录下。

docker run -d --name bitwarden \
-v /home/king/bitwarden/data/:/data/ \
-p 8080:80 \
-p 3012:3012 \
-e LOG_FILE=/data/bitwarden.log \
-e WEBSOCKET_ENABLED=true \
-e WEB_VAULT_ENABLED=true \
-e SIGNUPS_ALLOWED=true \
-e DOMAIN=https://bitwarden.robincn.com \
bitwardenrs/server:latest
# 返回docker的ID

字段说明如下

  • WEB_VAULT_ENABLED=true 开启网页端
  • SIGNUPS_ALLOWED=true 允许用户注册
  • 以上两字段首次使用注册用户需要,之后可改为 false

如遇到问题,可使用以下命令查看相关日志。

docker ps
# 成功可看到STATUS中的 healthy ,确认PORTS映射关系无误
docker logs *ID*  # 查看docker启动日志
docker stop *ID*  # 停止docker实例
docker rm *ID*  # 删除docker实例

5.2 新建用户与导入数据

启动成功后用浏览器访问 https://bitwarden.robincn.com 即可新建用户使用了。

参照官方说明导入数据。

6. 安装Docker Compose并启动服务

6.1 安装

参照官方介绍安装 Docker Compose.

sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

6.2 设置

data 目录下新建 Docker Compress 服务描述文件。

# vim /home/king/bitwarden/docker-compose.yml
version: "3"

services:
        bitwarden:
                image: bitwardenrs/server
                container_name: bitwardenrs
                restart: always
                ports:
                        - "8080:80"
                        - "3012:3012"
                volumes:
                        - ./bw-data:/data
                environment:
                        LOG_FILE: "/data/bitwarden.log"
                        WEBSOCKET_ENABLED: "true"
                        SIGNUPS_ALLOWED: "false"  # 关闭用户注册 
                        WEB_VAULT_ENABLED: "false"  # 关闭浏览器访问
                        DOMAIN: "https://bitwarden.robincn.com"

6.3 启动服务

注意:首先关闭之前启动的Bitwarden

docker stop *ID*
docker rm *ID*

使用 Docker Compose 启动服务。

cd /home/king/bitwarden/
docker-compose up -d  # 启动服务
docker-compose down		# 关闭服务
docker-compose restart  # 重启服务

7. 安装客户端与其他设置

7.1 安装客户端

参照官网下载地址下载安装各平台的客户端和/或插件。

7.2 其他设置

参照bitwarden_rs/wiki 进行其他设置(如fail2ban设置等)。

之前(大约十年前还在读书时)因为经常更新系统所以手写过crontab文件以实现自动更新。

最近时常登陆VPS去更新系统就想起这事,结果一查发现CentOS有一种简单的方法——就是使用yum-cron。

安装yum-cron

使用yum-cron的第一步当然毫不例外是安装 - -

就像安装其他应用一样

sudo yum install yum-cron

设置

参照说明编辑/etc/yum/yum-cron.conf

# sudo vim /etc/yum/yum-cron.conf
apply_updates = yes  # 确保更新被安装
exclude = kernel* mysql*  # 自动更新排除的软件包

启用

编辑完成后,启用服务以使自动更新生效。

sudo systemctl start yum-cron
sudo systemctl enable yum-cron

最近从WSL切换到WSL2之后发现无法ssh到VPS。 使用-vv选项查看,发现最后挂起前提示:

debug2: channel 0: open confirm rwindow 0 rmax 32768

然后Google了一下,发现这其实是路由器的问题。 具体原因就是: 当某些路由器位于NAT之后使用OpenSSH时。 在会话建立期间,在输入密码或交换密钥后,OpenSSH会在IP数据报中设置TOS(服务类型)字段。 部分路由器会被阻塞,导致SSH会话被无限期挂起。表现上来看就是ssh命令很少起作用或根本不起作用。

要解决这个问题其实也简单,临时方式就是在ssh命令后加选项-o IPQoS=0x00

长期方式就是修改配置文件,修改~/.ssh/config或者/etc/ssh/ssh_config都行。

# vim /etc/ssh/ssh_config
Host *
  IPQoS 0x00

P.S. 另一个不推荐的做法就是使用ProxyCommand nc %h %p

今年过了一个难忘的年。。。

珠海跨年之旅受疫情影响,提前结束。

回来之后天天在家,天天陪孩子玩。晚上闲下来发现去年整的profit VPS用起来太慢了,看不存在网站视频也就380p,离1080p差远了。。。

想起来之前的评论系统也没整,还有个cn域名也没用,就想着整个vps自建一个静态blog。。。

购买VPS并进行基本设置

其实profit也是够用了,不过眼瞅着快到期了,就想着换一个试试。对比了多家之后选择了Vultr的小VPS,首充送了50美刀,但是只有一个月的有效期,所以干脆买了一堆不同地方的VPS,测试完再删吧。

VPS的具体购买方式网上有很多教程了,各大主机厂商也提供了很多教程,就不赘述了。

Vultr官方提供了很多镜像选择,开始的适合还是和之前一样选择了FreeBSD,后来发现他们家有CenOS 8的官方镜像,就体验了下新版,由于笔记记得都是CentOS下的操作,所以以下介绍都按照CentOS 8来。

1. 修改密码并更新系统

VPS建好之后,用控制面板带的Console登录root账户,进行初步设置。

# Change root passwd
passwd

# Update
yum update

2. 初步设置SSH并添加常用普通用户

更新完系统后就要进行ssh设置以便客户端登录操作了,具体步骤如下:

vim /etc/ssh/sshd_config

首先修改了一部分配置。

# /etc/ssh/sshd_config
Port SSH_PORT_NUMBER  # 修改默认ssh端口
PermitRootLogin no # 禁止root用户登录

注意 修改端口号后需要修改对应的防火墙设置。

# SELinux 设置
semanage port -a -t ssh_port_t -p tcp SSH_PORT_NUMBER #SSH_PORT_NUMBER是上一步设置的ssh端口号
# firewall 设置
firewall-cmd --zone=public --add-port=SSH_PORT_NUMBER/tcp --permanent
# 使能firewall设置
firewall-cmd --reload
# 重启ssh服务
systemctl restart sshd  #restart ssh server

然后添加一个普通用户并设置密码。CentOS的adduser居然和useradd是一样的,囧,还是“小恶魔”的adduser好用 - -

# 添加用户king并添加到wheel组中
useradd king -G wheel -U
passwd king

由于禁止了root通过ssh登录,所以可以安装sudo以便刚才添加的用户进行日常维护。(此步骤不是必须的)

yum install sudo
visudo

参照文件注释编辑sudo的配置文件

# 允许wheel用户组以root身份运行所有命令
%wheel ALL=(ALL)

3. 上传SSH公钥并完善SSH设置

上述设置完成后,即可从客户端上传公钥文件,并用ssh方式登录服务器。

# 上传公钥文件
ssh-copy-id -i .ssh/xxx.pub king@SERVER_IP_ADDRESS -p SSH_PORT_NUMBER
# ssh登录至服务器
ssh  -i .ssh/xxx.pub king@SERVER_IP_ADDRESS -p SSH_PORT_NUMBER

上述测试成功后,即可禁用密码登录,并关闭浏览器管理面板登录的Console。

# /etc/ssh/sshd_config
# 禁用密码登录
PasswordAuthentication no

想用密钥+密码登录方式也可自行修改,然后重启ssh服务即可。

systemctl restart sshd

到这里服务器初步设置就基本完成了,之后的所有步骤都从客户端完成。

其他设置

再次提醒 以下的所有操作均在客户端完成,ssh登录方式如下:

ssh  -i .ssh/xxx.pub king@SERVER_IP_ADDRESS -p SSH_PORT_NUMBER

1. 安装fail2ban

安装fail2ban并设置把一切尝试ssh登录错的都给禁半天。

sudo yum install -y epel-release
# 安装fail2ban
sudo yum install fail2ban
# 修改fail2ban设置
sudo vim /etc/fail2ban/jail.local
# /etc/fail2ban/jail.local
[DEFAULT]
# Ban hosts for 12 hour:
bantime = 43200
findtime = 600
maxretry = 2

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

启动fail2ban服务并添加默认启动。

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

2. 安装代理软件并设置

该部分笔记都有记录,不便于发表在blog中,概述如下:

  • 在/etc/yum.repos.d中添加源,需要注意系统版本对应的源不同
  • 更新并安装主程序和混淆插件
  • 修改默认配置文件
  • 测试安装与设置(由于使用多端口设置,不能使用ss-server,应该使用ss-manager)
  • 创建自启动服务(需要修改***.service文件中的User等字段,和ExecStart等)
  • 添加防火墙规则
# Update firewall rule
firewall-cmd --zone=public --add-port=xxx1-xxx3/tcp --permanent
firewall-cmd --zone=public --add-port=xxx1-xxx3/udp --permanent
firewall-cmd --reload
sudo systemctl start YOURSERVICE
sudo systemctl enable YOURSERVICE

3. 添加BBR支持

具体是啥可自行Google,不过Vultr的CenOS 8默认已经开啦。就从之前的笔记粘贴过来啦。

开启BBR详细步骤如下,如果内核版本低于4.9需要更新内核,不想编译的添加源就行,老Gentoo用户表示不想多说什么了,哈哈

uname -r
# 版本号低于4.9需要更新内核并重启
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel install kernel-ml -y
# 默认启动项(grub2)
sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'  # 确保第一行就是新版内核并且版本号高于4.9
sudo reboot

版本号高于4.9的可直接开启,具体步骤如下:

# sudo echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
# sudo echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

测试一下吧

sudo sysctl net.ipv4.tcp_available_congestion_control
# output should be:
net.ipv4.tcp_available_congestion_control = reno cubic bbr

sudo sysctl -n net.ipv4.tcp_congestion_control
# output should be:
bbr

lsmod | grep bbr
#output should be
tcp_bbr xxxx xx

后记

此次VPS设置设置说了个七七八八,就当是个记录吧。还有在VPS部署Git服务器等部分笔记,整理整理回头再发吧。。。

最近工作还是很忙碌的,晚上回来之后就想折腾一会。发现国内的多说、友言之类都已经挂了,搜索过程中看到有人在用GitHub Issue 搭建评论系统,简直是人才啊。看着看着就看到用GitHub作图床的blog了。想到前几天GitHub 对个人用户功能扩容,想来微软爸爸也是不差钱的,用GitHub作图床也不是不行啊,今天建了个Repo测试一下。

测试图片链接

测试图片

想到之后可以发一些截图之类的,这样确实是不错滴。

想想我的擅长,好像就是各种平台下各类软件的安装和卸载,哈哈,但是这个好像不能当正事写出来哈。回头还是写一些简单的学习记录吧。争取早日开工~~~~~~~