ansibleguy.infra_nftables

NFTables logo

Ansible 角色 - NFTables

在 Linux 服务器上配置 NFTables 防火墙的角色。

请我喝杯咖啡

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

Molecule 日志: 简短, 完整

已测试:

  • Debian 11
  • Debian 12

安装

# 最新版
ansible-galaxy role install git+https://github.com/ansibleguy/infra_nftables

# 从 galaxy 安装
ansible-galaxy install ansibleguy.infra_nftables

# 或者指定自定义角色路径
ansible-galaxy install ansibleguy.infra_nftables --roles-path ./roles

文档

故障排除


用法

想要一个简单的 Ansible GUI?查看我的 Ansible WebUI

配置

根据需要定义配置:

nftables:
  # enable:  # 需要内核支持的功能
  #   sets: true
  #   nat: true
  #   deb11_backport: false  # 使用 Debian 11 的后向移植库在 Debian 10 上安装新版本
  #   bash_completion: false

  _defaults:  # 默认值被所有表和链继承
    table:
      type: 'inet'
    
    chain:
      policy: 'drop'
      type: 'filter'
      priority: 0
      log:
        drop: true

    rules:
      _all: []  # 添加到所有表的所有链的规则
      incoming: []  # 添加到所有表的“incoming”链的规则

  tables:
    example:
      # type: 'inet'  # ipv4 + ipv6
      _defaults:
        rules:
          _all: []  # 添加到此表的所有链的规则

      vars:
        dns_servers: ['1.1.1.1', '1.1.0.0', '8.8.8.8', '8.8.4.4']
        private_ranges: ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8']

      sets:
        blacklist:
          flags: ['dynamic', 'timeout']
          settings:
            timeout: '3m'

      counters:
        invalid_packages:
          comment: '无效'

      chains:
        incoming:
          hook: 'input'
          rules:
            - sequence: 1
              raw: 'ct state invalid counter name invalid_packages log prefix "DROP invalid states" drop'
            - seq: 2
              raw: 'ct state {established, related} counter accept comment "允许开放会话"'
            - s: 3
              raw: 'iifname "lo" accept comment "允许回环流量"'
            - {proto: 'icmp', type: 'echo-request', limit: 'rate 10/second', comment: '允许 icmp-ping'}
            - {proto: 'icmpv6', type: 'echo-request', limit: 'rate 10/second', comment: '允许 icmp-ping'}
            - {proto: 'icmp', code: 30, limit: 'rate 10/second', comment: '允许 icmp-traceroute'}
            - {proto: 'icmpv6', limit: 'rate 10/second', comment: '允许必要的 icmpv6 类型以确保 ipv6 可用',
               type: ['nd-neighbor-solicit', 'nd-router-advert', 'nd-neighbor-advert']}
            - {proto: 'udp', port: 46251, counter: 'invalid_packages'}

        outgoing:
          hook: 'output'
          # policy: 'accept'
          rules:
            - {dest: '$dns_servers', proto: 'udp', port: 53}
            - {dest: '$dns_servers', proto: 'tcp', port: [53, 853]}
            - {proto: ['tcp', 'udp'], port: [80, 443]}
            - {proto: ['icmp', 'icmpv6'], comment: '允许出站 icmp'}

        route:
          hook: 'forward'

        translate:
          hook: 'postrouting'
          type: 'nat'
          policy: 'accept'
          rules:
            - {'src': '$private_ranges', oif: 'eno2', masquerade: true}  # 动态出站 NAT
            - {'src': '$private_ranges', oif: 'eno3', snat: '192.168.0.1'}  # 静态出站 NAT

如果您想要 合并组规则和主机规则,可以这样做:

# 将所有主机使用的基本规则集定义为: 'fw_rules_all'
# 将服务特定的规则定义为: 'fw_rules_group'
# 将主机特定的规则定义为: 'fw_rules_host'

- name: NFTables
  become: true
  hosts: all
  vars:
    nftables:
      tables:
        example:
          chains: "{{ fw_rules_all |
          combine(fw_rules_group|default({}), recursive=true, list_merge='append') |
          combine(fw_rules_host|default({}), recursive=true, list_merge='append') }}"

  pre_tasks:
    - debug:
        var: nftables

  roles:
    - ansibleguy.infra_nftables

执行

运行剧本:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml

还有一些有用的 标签 可用:

  • config_table => 仅配置实际规则集
  • config
  • purge

要调试错误 - 您可以在运行时设置 'debug' 变量:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes

功能

  • 软件包安装

    • Ansible 依赖项 (最小)
    • NFTables
  • 配置

    • 可以定义

      • 全局级别的变量
      • 表级的变量、集合、计数器和限制
      • 链级的变量
    • 在写入之前会验证配置

    • 默认配置

      • 启用的功能 (必须由内核支持)
        • 集合
        • NAT
      • 默认不添加规则
        • 表类型 = inet
        • 链类型 = filter
        • 链策略 = drop
        • 优先级 = 0
        • 添加计数器 = 是
        • 隐式丢弃日志 = 是
      • 集合
        • 集合类型 = ipv4_addr
        • 添加计数器 = 是
      • 规则
        • 策略 = accept (如果要显式移除,请设置为 'none' )
        • 日志丢弃 = 是
    • 默认选项

      • 清除存储在 '/etc/nftables.d/' 中的未管理配置文件
    • 默认忽略选项

      • 在 Debian 10 上运行时从 Debian 11 的后向移植库安装 NFTables (较新版本)
      • 为 'nft' 命令添加 bash-completion 脚本

信息

  • 注意: 大多数角色的功能可以选择启用或禁用。

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

  • 警告: 并非您提供的每个设置/变量都会被检查其有效性。错误的配置可能会导致角色无法正常工作!

  • 信息: 您可以使用 ansibleguy.addons_nftables 角色为 NFTables 添加 DNS 解析和 IP 黑名单 功能!

  • 警告: 一些 核心功能 (NAT/集合) 可能 不被主流发行版内核支持

    参见:故障排除指南 - '不支持的操作'

  • 信息: 阅读 钩子文档 以了解何时以及如何配置 钩子和优先级

  • 信息: 规则可以使用字典格式提供,如示例所示。

    可用字段和别名如下:

    功能 说明
    规则序列 s, id, seq, sequence 在链内对规则进行排序的序列 ID (整数)。如果未提供,则将自动生成一个,从 1000 开始。如果提供重复的序列 ID,角色的配置检查将失败!
    输入接口 if, iif, iifname -
    输出接口 of, oif, oifname -
    协议 proto, pr, protocol -
    协议子类型 t, type -
    协议子代码 co, code -
    目标地址/网络 d, dest, target, destination, 'ip daddr', d6, dest6, target6, 'ip6 daddr' -
    目标端口 dp, port, dport, dest_port -
    源地址/网络 s, src, source, 'ip saddr', s6, src6, source6, 'ip6 saddr' -
    源端口 sp, sport, sport, src_port -
    日志 / 日志消息 l, log, 'log prefix' 如果设置为 'True' 并提供了 'comment',则将用作消息。否则,不会使用消息
    流量计数器 count, counter 设置为 'True' 时,将使用特定于规则的计数器。否则,将使用提供的预定义计数器
    流量限制 lim, limit 为规则设置的限制,见:匿名限制预定义限制
    规则操作 a, action 如果未提供操作,将默认为 'accept'
    源 NAT 伪装 m, masque, masquerade 是否应使用 NAT 伪装
    源 NAT snat, src_nat, source_nat, outbound_nat, 'snat to' -
    目标 NAT dnat, dest_nat, destination_nat, 'dnat to' -
    重定向 redir, redirect, 'redirect to' 通过使用重定向,数据包将被转发到本地机器
    规则注释 c, cmt, comment -
    用户 user, uid 仅匹配来自特定用户的流量
    group, gid 仅匹配来自特定组的流量
    防火墙标记 mark -
    优先级 prio, priority -
    数据包长度 len, length -
    时间戳 time, timestamp 匹配数据包接收的时间戳
    星期 day 匹配星期几 (0 = 星期日到 6 = 星期六,或 "Monday", "tuesday" 以及 "fri", "Sat")
    时间 hour 匹配 24 小时制 "HH:MM:SS",秒是可选的

    一条规则只能设置一个操作、源 NAT、伪装或目标 NAT!

  • 信息: 不能使用规则字典配置特殊/复杂规则。

    您可以使用 'raw' 键提供任何自定义规则,直接添加到规则集中。

  • 信息: 您可以在表级定义 变量、集合、计数器和限制

    • 变量 是键值对。
      var-name: var-value
      var2-name: ['value1', 'value2']
      
    • 集合 具有以下结构:
      set-name:
        flags: [list-of-flags]  # 可选
        settings:
          setting: value  # 可选
      
    • 计数器 具有以下结构:
      counter-name:
        comment: text  # 可选
      
    • 限制 具有以下结构:
      limit-name:
        rate: 'over 1024 bytes/second burst 512 bytes'
        comment: text  # 可选
      
  • 警告: 如果想添加仅计数的规则,需将 'action' 显式设置为 'none' - 否则默认值 'accept' 将被添加!

  • 信息: 如果提供任何不受支持的字段进行规则转换,将会引发错误,因为这可能导致意外结果!

  • 信息: Docker 可能需要 IPTables 作为软件包依赖项。

    参见:Docker 主机用例

关于项目

Ansible Role to provision NFTables firewall on linux servers

安装
ansible-galaxy install ansibleguy.infra_nftables
许可证
other
下载
4.4k
拥有者
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg