ansibleguy.infra_haproxy

HAProxy Logo

Ansible 角色 - HAProxy 社区版(带有 ACME, GeoIP 和一些 WAF 功能)

用于部署 HAProxy(专注于社区版

我认为这个角色实现的 frontend => route => backend 抽象非常好用。请给我一些反馈!

请我喝杯咖啡

Molecule 测试状态 YamlLint 测试状态 PyLint 测试状态 Ansible-Lint 测试状态 Ansible Galaxy

Molecule 日志: 简短版完整版

测试环境:

  • 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 监听器

      • 前端

      • 后端

        • 粘滞会话
        • 阻止 TRACE 和 CONNECT 方法

信息

  • 注意: 该角色目前仅支持基于 Debian 的系统

  • 注意: 该角色的大部分功能可以选择开启或关闭。

    有关所有可用选项,请参见 主默认文件 中的默认配置!

  • 警告: 并不是你提供的每个设置/变量都会检查有效性。错误的配置可能会导致角色失效!

  • 信息: 你可以通过使用 filterfilter_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 数据库,请确保你的产品遵循其许可协议:

    • IPinfo: 信息CC4 许可 (允许商业使用 - 需要加上署名)

      署名: <p>IP 地址数据由 <a href="https://ipinfo.io">IPinfo</a> 提供</p>

    • MaxMind: 信息用户许可协议 (允许有限的商业使用 - 需要加上署名)

      署名: 本产品包含由 MaxMind 创建的 GeoLite2 数据,网址为 <a href="https://www.maxmind.com">https://www.maxmind.com</a>。

  • 信息: 对于 GeoIP 令牌,你需要创建一个免费帐户:

  • 信息: 如果你想自行管理 GeoIP 数据库(不推荐) - 该角色将假设它们位于 /var/local/lib/geoip,文件名为 asn.mmdbcountry.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
许可证
other
下载
972
拥有者
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg