目录
概要
直接原因是xray-ui虽然有账密保护,但是架不住暴力破解,得整一个验证码
另外考虑到将来部署的其他服务不一定有自带的账密或者验证码保护,整一个看门的对大家都有好处
稍加观察,发现Authelia风评不错,开整
步骤
安装
先按着这个步骤安装:https://www.authelia.com/integration/deployment/bare-metal/#apt-repository
文档简洁得可恶,只讲了安装依赖和添加仓库,甚至不愿意把安装的指令写下来
apt update
apt install authelia
Authelia配置
装完之后,就填配置文件/etc/authelia/configuration.yml,主要需要关注的是下面部分
- server:因为是用caddy反代的,所以监听本地就好,端口随便
- totp:验证码相关设置
- identity_validation:默认配置就没注释这部分,只需要把密钥改一下就好
- authentication_backend:草台班子用file就足够了
- access_control:给所有子域名都开two_factor就好
- session:改一下密钥,注意要取消注释cookies后面接的列表的“-”,藏得很猥琐
- storage:因为已经有mariadb了,就用上
- notifier:草台班子用file就够了
在authentication_backend里面说的文件里定义用户:https://www.authelia.com/reference/guides/passwords/
注意密钥需要用给的命令行指令生成,字符串不可以是空的
运行
命令行运行
authelia --config /etc/authelia/configuration.yml
要是配置有问题这里会报错的,按着报错改就可
确认能跑之后,用systemctl运行服务并设置开机自启
systemctl xxx authelia
这一步可能会说没权限访问notifier文件,解决方法就是把这个文件所有权给authelia:authelia,前面是用户名,后面是用户组,并确保这个用户有读写运行的权限
正确得到用户ip
这个部分需要极高的阅读理解造旨,折腾了好久
主要问题是,登录的状态是跟着X-Forwarded-For给的ip走的
- 如果用了cloudflare和caddy的话,首先cloudflare会把自己的ip添里混淆视听
- 其次caddy不信cloudflare,又会把
X-Forwarded-For的值改成直接的访问者,也就是某个cloudflare的服务器
为了让正确的ip显示出来就需要改一下这俩的配置
- cloudflare需要加一条规则把
X-Forwarded-For无条件干掉:https://www.authelia.com/integration/proxies/forwarded-headers/ - caddy需要把cloudflare的地址都加到信任代理里面:https://www.authelia.com/integration/proxies/caddy/#trusted-proxies
caddy那部分写得尤为模糊,示例给的是信任本地地址,但其实你需要信任cloudflare的ip。具体来说是要在caddyfile的最开头,添
{
servers {
trusted_proxies static 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 等等
}
}
这些ip是这里写的:https://www.cloudflare.com/zh-cn/ips/
反代
这部分就很简单了:https://www.authelia.com/integration/proxies/caddy/#subdomain
- 把需要保护的服务配一个子域名
- 添一个子域名反代到authelia
- 在需要保护的服务的子域名里面添一个
forward_auth
验收
浏览器访问authelia监听的地址,第一次的话是只需要输入账密,不需要验证码
登录成功之后,会有按钮给你添加设备,然后就是正常的扫码填验证码,然后验证码就启用了
注意authelia说给你发邮件的话,其实是发到notifier的文件里了,因为我们没配置smtp
注意如果authelia没收到正确的ip的话,设置验证码会有奇怪问题,比如说一直loading…,然后二维码也不加载,并且会报错说ip变了,这就是因为authelia收到的是cloudflare的ip,cloudflare稍微负载均衡一下登陆状态就寄了
注销只能在authelia页面注销
尝试访问被保护的服务,caddy会先把你送到authelia,验证通过之后会跳到对应的服务
然后就搞定
