community.general.ufw 模块 – 使用 UFW 管理防火墙

注意

此模块是 community.general 集合(版本 10.1.0)的一部分。

如果您正在使用 ansible 包,您可能已经安装了此集合。它不包含在 ansible-core 中。要检查是否已安装,请运行 ansible-galaxy collection list

要安装它,请使用:ansible-galaxy collection install community.general。您需要其他要求才能使用此模块,有关详细信息,请参阅要求

要在 playbook 中使用它,请指定:community.general.ufw

概要

  • 使用 UFW 管理防火墙。

要求

执行此模块的主机需要满足以下要求。

  • ufw

参数

参数

注释

comment

字符串

向规则添加注释。需要 UFW 版本 >=0.35。

default

别名: policy

字符串

更改传入或传出流量的默认策略。

选择

  • "allow"

  • "deny"

  • "reject"

delete

布尔值

删除规则。

如果 delete=true 并且为 insert 提供了值,则会忽略 insert

选择

  • false ←(默认)

  • true

direction

字符串

选择规则或默认策略命令的方向。与 interface_ininterface_out 互斥。

选择

  • "in"

  • "incoming"

  • "out"

  • "outgoing"

  • "routed"

from_ip

别名: from, src

字符串

源 IP 地址。

默认值: "any"

from_port

字符串

源端口。

insert

整数

将对应的规则作为规则编号 NUM 插入。

请注意,ufw 从 1 开始编号规则。

如果 delete=true 并且为 insert 提供了值,则会忽略 insert

insert_relative_to

字符串

允许将 insert 中的索引解释为相对于某个位置。

zero 将规则编号解释为绝对索引(即 1 是第一条规则)。

first-ipv4 将规则编号解释为相对于第一条 IPv4 规则的索引,或者相对于当前没有 IPv4 规则时第一条 IPv4 规则将出现的位置。

last-ipv4 将规则编号解释为相对于最后一条 IPv4 规则的索引,或者相对于当前没有 IPv4 规则时最后一条 IPv4 规则将出现的位置。

first-ipv6 将规则编号解释为相对于第一条 IPv6 规则的索引,或者相对于当前没有 IPv6 规则时第一条 IPv6 规则将出现的位置。

last-ipv6 将规则编号解释为相对于最后一条 IPv6 规则的索引,或者相对于当前没有 IPv6 规则时最后一条 IPv6 规则将出现的位置。

选择

  • "first-ipv4"

  • "first-ipv6"

  • "last-ipv4"

  • "last-ipv6"

  • "zero" ←(默认)

interface

别名: if

字符串

指定规则的接口。用于接口的方向(传入或传出)取决于 direction 的值。对于需要同时提供输入和输出接口的路由规则,请参阅 interface_ininterface_out。与 interface_ininterface_out 互斥。

interface_in

别名: if_in

字符串

在 community.general 0.2.0 中添加

指定规则的输入接口。这与 directioninterface 互斥。但是,它与路由规则的 interface_out 兼容。

interface_out

别名:if_out

字符串

在 community.general 0.2.0 中添加

指定规则的输出接口。这与 directioninterface 互斥。但是,它与路由规则的 interface_in 兼容。

log

布尔值

记录与此规则匹配的新连接。

选择

  • false ←(默认)

  • true

logging

字符串

切换日志记录。记录的数据包使用 LOG_KERN syslog 工具。

选择

  • "on"

  • "off"

  • "low"

  • "medium"

  • "high"

  • "full"

name

别名:app

字符串

使用位于 /etc/ufw/applications.d 中的配置文件。

proto

别名:protocol

字符串

TCP/IP 协议。

选择

  • "any"

  • "tcp"

  • "udp"

  • "ipv6"

  • "esp"

  • "ah"

  • "gre"

  • "igmp"

route

布尔值

将规则应用于路由/转发的数据包。

选择

  • false ←(默认)

  • true

rule

字符串

添加防火墙规则

选择

  • "allow"

  • "deny"

  • "limit"

  • "reject"

state

字符串

enabled 会重新加载防火墙并在启动时启用防火墙。

disabled 会卸载防火墙并在启动时禁用防火墙。

reloaded 会重新加载防火墙。

reset 会禁用防火墙并将其重置为安装默认值。

选择

  • "disabled"

  • "enabled"

  • "reloaded"

  • "reset"

to_ip

别名:dest,to

字符串

目标 IP 地址。

默认值: "any"

to_port

别名:port

字符串

目标端口。

属性

属性

支持

描述

check_mode

支持: 完整

可以在 check_mode 中运行并返回已更改状态的预测,而无需修改目标。

diff_mode

支持:

当处于 diff 模式时,将返回有关已更改(或可能需要在 check_mode 中更改)的详细信息。

说明

注意

  • 有关更多示例,请参阅 man ufw

  • 警告: 虽然可以使用并发策略运行模块本身,但 ufw 不支持并发,因为防火墙规则应该是有序的,并且并行执行不能保证顺序。不要使用并发: 结果是不可预测的,如果这样做,模块可能会静默失败。

示例

- name: Allow everything and enable UFW
  community.general.ufw:
    state: enabled
    policy: allow

- name: Set logging
  community.general.ufw:
    logging: 'on'

# Sometimes it is desirable to let the sender know when traffic is
# being denied, rather than simply ignoring it. In these cases, use
# reject instead of deny. In addition, log rejected connections:
- community.general.ufw:
    rule: reject
    port: auth
    log: true

# ufw supports connection rate limiting, which is useful for protecting
# against brute-force login attacks. ufw will deny connections if an IP
# address has attempted to initiate 6 or more connections in the last
# 30 seconds. See  http://www.debian-administration.org/articles/187
# for details. Typical usage is:
- community.general.ufw:
    rule: limit
    port: ssh
    proto: tcp

# Allow OpenSSH. (Note that as ufw manages its own state, simply removing
# a rule=allow task can leave those ports exposed. Either use delete=true
# or a separate state=reset task)
- community.general.ufw:
    rule: allow
    name: OpenSSH

- name: Delete OpenSSH rule
  community.general.ufw:
    rule: allow
    name: OpenSSH
    delete: true

- name: Deny all access to port 53
  community.general.ufw:
    rule: deny
    port: '53'

- name: Allow port range 60000-61000
  community.general.ufw:
    rule: allow
    port: 60000:61000
    proto: tcp

- name: Allow all access to tcp port 80
  community.general.ufw:
    rule: allow
    port: '80'
    proto: tcp

- name: Allow all access from RFC1918 networks to this host
  community.general.ufw:
    rule: allow
    src: '{{ item }}'
  loop:
    - 10.0.0.0/8
    - 172.16.0.0/12
    - 192.168.0.0/16

- name: Deny access to udp port 514 from host 1.2.3.4 and include a comment
  community.general.ufw:
    rule: deny
    proto: udp
    src: 1.2.3.4
    port: '514'
    comment: Block syslog

- name: Allow incoming access to eth0 from 1.2.3.5 port 5469 to 1.2.3.4 port 5469
  community.general.ufw:
    rule: allow
    interface: eth0
    direction: in
    proto: udp
    src: 1.2.3.5
    from_port: '5469'
    dest: 1.2.3.4
    to_port: '5469'

# Note that IPv6 must be enabled in /etc/default/ufw for IPv6 firewalling to work.
- name: Deny all traffic from the IPv6 2001:db8::/32 to tcp port 25 on this host
  community.general.ufw:
    rule: deny
    proto: tcp
    src: 2001:db8::/32
    port: '25'

- name: Deny all IPv6 traffic to tcp port 20 on this host
  # this should be the first IPv6 rule
  community.general.ufw:
    rule: deny
    proto: tcp
    port: '20'
    to_ip: "::"
    insert: 0
    insert_relative_to: first-ipv6

- name: Deny all IPv4 traffic to tcp port 20 on this host
  # This should be the third to last IPv4 rule
  # (insert: -1 addresses the second to last IPv4 rule;
  #  so the new rule will be inserted before the second
  #  to last IPv4 rule, and will be come the third to last
  #  IPv4 rule.)
  community.general.ufw:
    rule: deny
    proto: tcp
    port: '20'
    to_ip: "::"
    insert: -1
    insert_relative_to: last-ipv4

# Can be used to further restrict a global FORWARD policy set to allow
- name: Deny forwarded/routed traffic from subnet 1.2.3.0/24 to subnet 4.5.6.0/24
  community.general.ufw:
    rule: deny
    route: true
    src: 192.0.2.0/24
    dest: 198.51.100.0/24

作者

  • Aleksey Ovcharenko (@ovcharenko)

  • Jarno Keskikangas (@pyykkis)

  • Ahti Kitsik (@ahtik)