nginx proxy manager使用reCAPTCHA/Turnstile

上一篇文章,使用cloudflare tunnel把家里的服务开放出去了,显然暴露服务是很不安全的

今天给服务加上人机校验,加一层保障,防刷,防爬虫。工具用到crowdsec,参考了官方文档

1、需要申请reCAPTCHA,目前我是根据官方的例子,创建了reCAPTCHA v2的复选框方式

2、部署crowdsec
2.1、跑起来
crowdsec是连接到官方平台的工具,官方提供了很多中方式安装,打开 https://www.crowdsec.net/ ,注册登录后,在Security Engines菜单就可以看到了,我是使用docker的方式安装的。这里还要注意最下方的执行命令,这是安装成功后,要控制台执行的

docker run -d \
  --name crowdsec \
  --volume /etc/crowdsec:/etc/crowdsec \
  --volume /var/lib/crowdsec/data/:/var/lib/crowdsec/data/ \
  --volume /var/log:/var/log:ro \
  crowdsecurity/crowdsec:latest


安装的配置,基本上没有不用改,根据默认的配置,改改冲突的端口就可以点亮了


2.2、配置
进入后容器里面,在上一步官网页面最下方有一条命令,这时候,就可以执行了,带sudo可能会报错,可以把sudo去掉执行,执行成功后,你会发现官网上,已经能看到你注册的机子信息

cscli console enroll -e context XXXXX

机子成功后,我们要创建一个bouncers,让你的nginx proxy manager连接。执行下面的命令后,控制台会返回一个api key记录下来

sudo cscli bouncers add npm-proxy

为了让captcha起作用,需要给profiles.yaml添加配置,文件路径在/etc/crowdsec/profiles.yaml,在文件前面添加数据,注意是前面,还有不要漏了三个"-",文件最终配置看截图,注意点已特别标出。

name: captcha_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip" && Alert.GetScenario() contains "http"
decisions:
- type: captcha
  duration: 4h
on_success: break
---

3、配置nginx proxy manager
nginx proxy manager同样是使用docker安装的,crowdsec有自己弄过的镜像,名称是lepresidente/nginx-proxy-manager,直接用最新的就行。配置重点讲讲端口的,8181是管理界面,8080是http,4443是https。对于我来说,ssl证书是cloudflare提供的,所以我这里只用得上http的端口。注意,下面修改配置的操作都是容器内操作的!

3.1、修改crowdsec-openresty-bouncer.conf,路径是/config/crowdsec/crowdsec-openresty-bouncer.conf,下面代码里<>的替换成自己的配置就可以了

ENABLED=true
API_URL=<第二步部署crowdsec的地址,端口是8080的>
API_KEY=<第二步第二小点创建bouncers生成的api key>
CACHE_EXPIRATION=1
# bounce for all type of remediation that the bouncer can receive from the local API
BOUNCING_ON_TYPE=all
FALLBACK_REMEDIATION=ban
REQUEST_TIMEOUT=3000
UPDATE_FREQUENCY=10
# live or stream
MODE=live
# exclude the bouncing on those location
EXCLUDE_LOCATION=
#those apply for "ban" action
# /!\ REDIRECT_LOCATION and RET_CODE can't be used together. REDIRECT_LOCATION take priority over RET_CODE
BAN_TEMPLATE_PATH=/config/crowdsec/templates/ban.html
REDIRECT_LOCATION=
RET_CODE=403
#those apply for "captcha" action
#valid providers are recaptcha, hcaptcha, turnstile
CAPTCHA_PROVIDER=recaptcha
# Captcha Secret Key
SECRET_KEY=<密钥>
# Captcha Site key
SITE_KEY=<网站密钥>
CAPTCHA_TEMPLATE_PATH=/config/crowdsec/templates/captcha.html
CAPTCHA_EXPIRATION=3600

3.2、获取正确的客户端ip
启动后,发现nginx获取到的客户端ip是代理服务器的ip,不是客户端ip,全部都是172.17.0.1,这个ip是cloudflare代理容器的ip,需要修改一下nginx.conf,获取到正确的客户端ip

打开/etc/nginx/nginx.conf文件,找到real_ip_header X-Real-IP,需要改成

real_ip_header X-Forwarded-For

这篇文章有说明,nginx经过多层代理后获取真实来源ip - chenjianwen - 博客园
修改后,重启nginx或者重启容器后,就可以看到真实的客户端ip了

3.3、设置网站proxy
在nginx proxy manager,配置域名转发内网服务,并且在cloudflare tunnel转发的地址,全部改成nginx的http地址。


4、测试
可以指定一个ip地址测试人机校验,在第二步的机子容器内执行命令,不知道请求ip的,可以先请求一次,像第三步第二小节的截图那样。执行命令后,重新请求,就可以看到crowdsec人机校验页面了。

cscli decisions add -i <测试IP> -t captcha

4 个赞

感谢分享教程,很详细

感谢分享。

感谢分享