pimvh.nftables
需求
- 安装 Ansible:
sudo apt install python3
python3 -m ensurepip --upgrade
pip3 install ansible
所需变量
查看默认配置中的变量。
你可以使用以下结构,为你的主机(../host_vars/[主机名].yaml)或主机组(../group_vars/[组名].yaml)添加防火墙定义(参见 molecule.default.vars/test.yaml 示例):
# 该变量指向推送到远程主机的规则
# 它是一个包含表、链和规则的字典,参见 molecule/default/vars/test.yaml
nftables_ruleset:
# 这些键变成表
# 必须是:
# 防火墙家族和名称,例如:
"inet firewall":
# 表的描述
comment: "设备的防火墙"
chains:
# 相应链的名称
input:
# 你希望放入此链的 nftables_rules 中的变量名称
- input_hook
- valid_connections
- ...
# 另一个具有相同结构的表
# 有效的家族有 inet、inet6、netdev 等
# 有关完整参考,参见 nftables 文档
"inet foo":
# 潜在的规则在 `nftables_rules` 下定义
# 每条规则有两个属性:
# -> def: 规则或规则集的有效 nftables 语法定义
# -> depends_on: 可选的来自 nftables_variables 的变量依赖列表
# 参见 molecule/default/vars/test.yaml 示例
nftables_rules:
input_hook: >
type filter hook input priority 0; policy drop;
valid_connections:
def: |
ct state established, related accept
ct state invalid drop
new_connections:
def: |
ct state new accept
# 这些是变量定义,包含在 depends_on 中
# 确保键匹配
# 参见 molecule/default/vars/test.yaml 示例
nftables_variables:
tcp_ports:
comment: tcp 端口配置
def: |
{% if nftables_open_tcp_ports_global %}define OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_global | join(",") }} }{% endif +%}
{% if nftables_open_tcp_ports_local %}define LOCAL_OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_local | join(",") }} }{% endif +%}
{% if nftables_open_tcp_ports_vpn %}define VPN_TCP_PORTS = { {{ nftables_open_tcp_ports_vpn | join(",") }} }{% endif +%}
...
Ansible 剧本将验证是否将正确的变量传递给角色,使用 argument_spec。
示例剧本
最小化(假设你在其他地方传递了变量):
hosts:
- foo
roles:
- pimvh.nftables
简短说明 - 如果我运行这个会发生什么
- 验证规则/其他变量是否已定义
- 安装 nftables 和 Python 接口
- 创建所需的 nftable 表
- 创建动态表作为空表
- 创建一个空的黑名单
- 拷贝 nftables 模板到 nftables 目录
- 编辑 nftables 服务,使其指向我们的新主文件
- 创建脚本重新加载防火墙,该脚本将我们无法控制的表转储到文件,并在之后重新加载防火墙
- 当 nftables_abuseip_api_key 被定义时,添加脚本通过他们的 api 拉取黑名单,并使其成为 systemd 服务
- 当请求时启用 nftable 服务
- 当请求时卸载 iptables
未来改进
- 简化需要传递的规则结构
- 改进
nftables_variables
和nftables_ruleset
的 argument_specs