ansibleguy.infra_nftables

Ansible 角色 - NFTables
在 Linux 服务器上配置 NFTables 防火墙的角色。
已测试:
- 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