ansibleguy.infra_haproxy

Ansible 角色 - HAProxy 社区版(带有 ACME, GeoIP 和一些 WAF 功能)
用于部署 HAProxy(专注于社区版)
我认为这个角色实现的 frontend
=> route
=> backend
抽象非常好用。请给我一些反馈!
测试环境:
- Debian 12
安装
# 最新版
ansible-galaxy role install git+https://github.com/ansibleguy/infra_haproxy
# 从 Galaxy 安装
ansible-galaxy install ansibleguy.infra_haproxy
# 或者安装到自定义角色路径
ansible-galaxy install ansibleguy.infra_haproxy --roles-path ./roles
路线图
- 安全性
- 基本速率限制(GET/HEAD 和 POST/PUT/DELETE 分开)
- 通用客户端指纹
- '接口' 用于字典到映射文件的转换/创建
- 选项以轻松下载和整合 IP 列表(如 Tor 出口节点)
- 简单的方法覆盖默认错误文件
使用
想要一个简单的 Ansible 图形界面?请查看我的 Ansible WebUI
示例
这里有一些详细的配置示例及其结果:
配置
最小示例
haproxy:
acme:
enable: true
email: '[email protected]'
frontends:
fe_web:
bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
acme:
enable: true
routes:
be_intern:
domains: ['app.template.ansibleguy.net']
default_backend: 'be_fallback'
backends:
be_intern:
servers:
- 'srv-1 192.168.10.11:80'
- 'srv-2 192.168.10.12:80'
be_fallback:
lines: 'http-request redirect code 302 location https://github.com/ansibleguy'
根据需要定义配置:
haproxy:
version: '2.8'
acme:
enable: true
email: '[email protected]'
# 前端
frontends:
fe_web:
bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
acme:
enable: true
domains: ['app.template.ansibleguy.net'] # 路由中的域名也将被添加
routes:
be_app01:
domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']
# 定义要添加的原始配置部分/行
lines:
section1:
- ...
default_backend: 'be_fallback'
fe_dbs:
mode: 'tcp'
default_backend: 'be_db'
fe_restricted:
bind: ['[::]:8080 v4v6', '[::]:8443 v4v6 ssl crt /etc/myapp/mycert.pem']
geoip:
enable: true
security:
restrict_methods: true
allow_only_methods: ['HEAD', 'GET', 'POST']
fingerprint_ssl: true # 创建并记录客户端的 JA3 SSL 指纹
# 根据用户代理匹配的基本过滤坏机器人
block_script_bots: true
block_bad_crawler_bots: true
routes:
be_app02:
filter_country: ['AT', 'DE', 'CH']
# filter_ip: ['10.0.0.0/8']
domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']
# 定义要添加的原始配置部分/行
lines:
section1:
- ...
default_backend: 'be_fallback'
# 后端
backends:
be_app01:
servers:
- 'app01-1 10.0.1.1:80'
- 'app01-2 10.0.1.2:80'
check_uri: '/health'
check_expect: 'status 200'
be_app02:
security:
# 根据用户代理匹配的基本过滤坏机器人
block_script_bots: true
block_bad_crawler_bots: true
ssl: true
ssl_verify: 'none' # 默认;例如:'required ca-file /etc/ssl/certs/my_ca.crt verifyhost host01.intern'
servers:
- 'app02-1 10.0.1.1:443'
- 'app02-2 10.0.1.2:443'
be_db:
mode: 'tcp'
balance: 'roundrobin'
# 定义要添加的原始配置部分/行
lines:
section1:
- 'option mysql-check user haproxy_check'
servers:
- 'mysql-1 10.0.0.1:3306'
- 'mysql-2 10.0.0.2:3306'
be_fallback:
lines:
default: 'http-request redirect code 302 location https://github.com/ansibleguy'
# 一般设置
stats:
enable: true # 启用统计信息 http 监听器
bind: '127.0.0.1:8404' # 默认
geoip:
enable: true
provider: 'ipinfo' # 或 'maxmind'
token: '<YOUR-TOKEN>'
# 定义全局/默认设置为键/值对(可使用多值列表)
global:
ca-base: '/etc/ssl/certs'
defaults:
mode: 'http'
'timeout connect': 3000
'timeout server': 5000
'timeout client': 5000
你可能想使用 'ansible-vault' 来加密密码:
ansible-vault encrypt_string
功能
软件包安装
配置
默认配置:
- 全局/默认 - 在默认安装中可见
默认可选项:
- 前端
- HTTP 模式
- 将非 SSL 流量重定向到 SSL
- 记录用户代理
- 设置基本安全头
- 阻止 TRACE 和 CONNECT 方法
- HTTP 模式
- 前端
默认不可选项:
统计信息 http 监听器
前端
- ACME/LetsEncrypt
- GeoIP 查找
- 阻止已知的脚本机器人
- SSL 指纹识别(JA3)
后端
- 粘滞会话
- 阻止 TRACE 和 CONNECT 方法
信息
注意: 该角色目前仅支持基于 Debian 的系统
注意: 该角色的大部分功能可以选择开启或关闭。
有关所有可用选项,请参见 主默认文件 中的默认配置!
警告: 并不是你提供的每个设置/变量都会检查有效性。错误的配置可能会导致角色失效!
信息: 你可以通过使用
filter
和filter_not
设置轻松过滤访问后端:filter_ip
,filter_not_ip
,filter_country
,filter_not_country
,filter_asn
,filter_not_asn
信息: 可以为前端和后端激活非常基本的用户代理脚本和坏爬虫机器人的阻止功能。查看 默认设置 以了解被阻止的机器人列表。
信息: 你可以通过将
security.restrict_methods
设置为 true,并指定security.allow_only_methods
来轻松限制特定前端或后端允许的 HTTP 方法。信息: 查看 指纹识别文档 以获取有关如何跟踪客户端的详细信息。
信息: 如果你使用 Graylog Server 收集和分析日志,请确保使用管道规则将 HAProxy 日志分成多个字段。示例: HAProxy Community - Graylog 管道规则
提示: 你可以通过设置全局设置 tune.stick-counters 来增加可用的
track-sc
数量。这在有复杂速率限制设置的环境中可能会很有用。
GeoIP
警告: 如果使用自动提供的 GeoIP 数据库,请确保你的产品遵循其许可协议:
信息: 对于 GeoIP 令牌,你需要创建一个免费帐户:
信息: 如果你想自行管理 GeoIP 数据库(不推荐) - 该角色将假设它们位于
/var/local/lib/geoip
,文件名为asn.mmdb
和country.mmdb
。信息: 你可以通过使用 curl 手动测试 GeoIP 查找微服务:
curl 'http://127.0.0.1:10069/?lookup=country&ip=1.1.1.1'
WAF
注意: 该角色提供的 WAF/安全功能集与 HAProxy 企业版默认提供的功能相去甚远。如果你有预算,建议使用企业版。
提示: 如果你使用
security.flag_bots
,可以使用这个基本的布尔标志来增强对可能机器人的规则。示例:
降低机器人的速率限制:
http-request deny deny_status 429 if !{ var(txn.bot) -m int 0 } { sc_http_req_rate(0) gt 50 }
严禁机器人注册帐户:
http-request deny deny_status 400 if !{ var(txn.bot) -m int 0 } { method POST } { path_sub -m str -i /register/ }
将标志传递给应用程序以显示漂亮的错误:
http-request add-header X-Bot %[var(txn.bot)]
注意: 如果你想使用
security.block_script_kiddies
,请确保查看 默认设置 中的阻止列表,并根据需要添加排除项。
TCP
信息: 如果你想动态捕获数据,可以使用
tcp-request content capture
。你需要手动启用捕获数据的日志记录,通过修改日志格式:
{% raw %}<DEFAULT LOG FORMAT HERE> {%[capture.req.hdr(0)]|%[capture.req.hdr(1)]}{% endraw %}
这可以用于记录 SNI 或 GeoIP 信息。
执行
运行剧本:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml
还有一些有用的 标签 可用:
- install
- config => 仅更新配置和 ssl 证书
- ssl 或 acme
- geoip
- lua
要调试错误,可以在运行时设置 'debug' 变量:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
Provision HAProxy Community (with ACME, GeoIP and some WAF-Features)
ansible-galaxy install ansibleguy.infra_haproxy