ansible.builtin.iptables 模块 – 修改 iptables 规则
注意
此模块是 ansible-core 的一部分,包含在所有 Ansible 安装中。在大多数情况下,即使不指定 collections 关键字,也可以使用简短的模块名称 iptables。但是,我们建议您使用 完全限定集合名称 (FQCN) ansible.builtin.iptables,以便轻松链接到模块文档并避免与可能具有相同模块名称的其他集合冲突。
概要
- ansible.builtin.iptables 用于设置、维护和检查 Linux 内核中 IP 数据包过滤规则的表。 
- 此模块不处理规则的保存和/或加载,而只是操作内存中存在的当前规则。这与此模块内部使用的 - iptables和- ip6tables命令的行为相同。
参数
| 参数 | 注释 | 
|---|---|
| 规则应附加到底部还是插入顶部。 如果规则已存在,则链不会被修改。 选项 
 | |
| 指定要修改的 iptables 链。 这可以是用户定义的链,也可以是标准 iptables 链之一,例如  | |
| 这指定将添加到规则的注释。 | |
| 要匹配的连接状态列表,在 conntrack 模块中。 可能的值为  默认值:  | |
| 目标规范。 地址可以是网络名称、主机名、网络 IP 地址(带 /掩码)或普通 IP 地址。 主机名将仅在规则提交到内核之前解析一次。请注意,指定任何需要使用远程查询(例如 DNS)来解析的名称都是一个非常糟糕的主意。 掩码可以是网络掩码或普通数字,指定网络掩码左侧 1 的数量。因此,掩码 24 等效于 255.255.255.0。地址规范之前的  | |
| 目标端口或端口范围规范。这可以是服务名称或端口号。可以使用格式 first:last 指定包含范围。如果省略第一个端口,则假定为“0”;如果省略最后一个端口,则假定为“65535”。如果第一个端口大于第二个端口,则它们将被交换。这只在规则还指定以下协议之一时有效:tcp、udp、dccp 或 sctp。 | |
| 这指定要匹配的多个目标端口号或端口范围,在 multiport 模块中。 它只能与协议 tcp、udp、udplite、dccp 和 sctp 结合使用。 默认值:  | |
| 指定要匹配的目标 IP 范围,在 iprange 模块中。 | |
| 刷新指定表和链的所有规则。 如果没有指定链,则清除整个表。 忽略所有其他参数。 选项 
 | |
| 这意味着该规则仅引用分段数据包的第二个和后续片段。 由于无法判断此类数据包的源端口或目标端口(或 ICMP 类型),因此此类数据包将不匹配任何指定它们的规则。 当“!”参数位于 fragment 参数之前时,该规则将仅匹配头部片段或未分段的数据包。 | |
| 这指定要发送克隆数据包的主机的 IP 地址。 此选项仅在  | |
| 指定在按所有者规则匹配中使用的 GID 或组。 | |
| 这指定处理应在用户指定的链中继续。 与 jump 参数不同,return 不会在此链中继续处理,而是在通过 jump 调用我们的链中继续处理。 | |
| 这允许指定 ICMP 类型,可以是数字 ICMP 类型、类型/代码对,或命令  | |
| 接收数据包的接口名称(仅适用于进入  在接口名称前使用 如果接口名称以 如果省略此选项,则任何接口名称都将匹配。 | |
| 此规则应适用的IP协议版本。 选项 
 | |
| 这指定了规则的目标;即,如果数据包匹配规则,则该做什么。 目标可以是用户定义的链(非此规则所在的链),决定数据包命运的特殊内置目标之一,或扩展(参见下面的扩展)。 如果在一个规则中省略此选项(并且未使用goto参数),则匹配规则不会影响数据包的命运,但规则上的计数器将递增。 | |
| 指定每秒允许的最大平均匹配数。 此数字可以使用 | |
| 指定在上述限制生效之前的最大突发数。 | |
| 根据syslogd定义的优先级进行日志记录级别。 值可以是1-8的字符串或数字。 此参数仅在 选项 
 | |
| 指定规则的日志文本。仅在LOG跳转时才有意义。 | |
| 指定要使用的匹配项,即测试特定属性的扩展模块。 匹配项集合构成了调用目标的条件。 如果匹配项作为数组指定,则按从前到后的顺序进行评估,并以短路方式工作,换句话说,如果一个扩展返回false,则评估将停止。 默认值:  | |
| 指定match_set参数所需的标志。 必须与 使用iptables集合扩展。 在2.17版本中添加了 选项 
 | |
| 此参数控制iptables的list -action的运行,该操作由模块内部使用。 不影响实际功能。如果iptables在创建链或更改策略时挂起,请使用此选项。 如果为 例如,在设置策略或创建链时,内部使用列表。 选项 
 | |
| 将要发送数据包的接口名称(对于进入 在接口名称前使用 如果接口名称以 如果省略此选项,则任何接口名称都将匹配。 | |
| 要检查的规则或数据包的协议。 指定的协议可以是 也允许来自 协议前的 数字零等效于所有。 
 | |
| 指定在拒绝时返回的错误数据包类型。这意味着 | |
| 将规则插入为给定的规则编号。 这仅适用于 | |
| 这允许管理员初始化规则的数据包和字节计数器(在 | |
| 源规范。 地址可以是网络名称、主机名、网络 IP 地址(带 /掩码)或普通 IP 地址。 主机名将仅在规则提交到内核之前解析一次。请注意,指定任何需要使用远程查询(例如 DNS)来解析的名称都是一个非常糟糕的主意。 掩码可以是网络掩码或普通数字,指定网络掩码左侧 1 的数量。因此,掩码 24 等效于 255.255.255.0。地址规范之前的  | |
| 源端口或端口范围规范。 这可以是服务名称或端口号。 也可以使用 如果省略第一个端口,则假定为 如果第一个端口大于第二个端口,则将它们交换。 | |
| 指定要与iprange模块匹配的源IP范围。 | |
| 规则是否应该不存在或存在。 选项 
 | |
| 这允许匹配设置了SYN位并且未设置ACK和RST位的数据包。 否定时,这将匹配设置了RST或ACK位的所有数据包。 选项 
 | |
| 此选项指定命令应在其上操作的数据包匹配表。 如果内核配置了自动模块加载,则如果尚未加载该表的相应模块,则将尝试加载该模块。 选项 
 | |
| TCP标志规范。 
 | |
| 要检查的标志列表。 | |
| 要设置的标志。 | |
| 这指定了要与 没有这个,目标地址将永远不会更改。 | |
| 这指定了要使用的目标端口或端口范围,没有这个,目标端口将永远不会更改。 只有当规则也指定了协议 | |
| 这指定了与 没有这个,源地址将不会被更改。 | |
| 指定在按所有者规则匹配中使用的UID或用户名。 从Ansible 2.6开始,如果在前面添加 | |
| 等待N秒以获取xtables锁,以防止程序的多个实例同时运行。 | 
属性
| 属性 | 支持 | 描述 | 
|---|---|---|
| 支持:完全支持 | 可以在check_mode下运行并返回更改状态预测,而无需修改目标,如果不支持,则将跳过此操作。 | |
| 支持:不支持 | 在diff模式下,将返回关于已更改内容(或可能需要在check_mode下更改的内容)的详细信息。 | |
| 平台:Linux | 可以对其进行操作的目标操作系统/系列。 | 
备注
注意
- 此模块只处理单个规则。如果您需要高级规则链,建议的方法是模板化iptables恢复文件。 
示例
- name: Block specific IP
  ansible.builtin.iptables:
    chain: INPUT
    source: 8.8.8.8
    jump: DROP
  become: yes
- name: Forward port 80 to 8600
  ansible.builtin.iptables:
    table: nat
    chain: PREROUTING
    in_interface: eth0
    protocol: tcp
    match: tcp
    destination_port: 80
    jump: REDIRECT
    to_ports: 8600
    comment: Redirect web traffic to port 8600
  become: yes
- name: Allow related and established connections
  ansible.builtin.iptables:
    chain: INPUT
    ctstate: ESTABLISHED,RELATED
    jump: ACCEPT
  become: yes
- name: Allow new incoming SYN packets on TCP port 22 (SSH)
  ansible.builtin.iptables:
    chain: INPUT
    protocol: tcp
    destination_port: 22
    ctstate: NEW
    syn: match
    jump: ACCEPT
    comment: Accept new SSH connections.
- name: Match on IP ranges
  ansible.builtin.iptables:
    chain: FORWARD
    src_range: 192.168.1.100-192.168.1.199
    dst_range: 10.0.0.1-10.0.0.50
    jump: ACCEPT
- name: Allow source IPs defined in ipset "admin_hosts" on port 22
  ansible.builtin.iptables:
    chain: INPUT
    match_set: admin_hosts
    match_set_flags: src
    destination_port: 22
    jump: ALLOW
- name: Tag all outbound tcp packets with DSCP mark 8
  ansible.builtin.iptables:
    chain: OUTPUT
    jump: DSCP
    table: mangle
    set_dscp_mark: 8
    protocol: tcp
- name: Tag all outbound tcp packets with DSCP DiffServ class CS1
  ansible.builtin.iptables:
    chain: OUTPUT
    jump: DSCP
    table: mangle
    set_dscp_mark_class: CS1
    protocol: tcp
# Create the user-defined chain ALLOWLIST
- iptables:
    chain: ALLOWLIST
    chain_management: true
# Delete the user-defined chain ALLOWLIST
- iptables:
    chain: ALLOWLIST
    chain_management: true
    state: absent
- name: Insert a rule on line 5
  ansible.builtin.iptables:
    chain: INPUT
    protocol: tcp
    destination_port: 8080
    jump: ACCEPT
    action: insert
    rule_num: 5
# Think twice before running following task as this may lock target system
- name: Set the policy for the INPUT chain to DROP
  ansible.builtin.iptables:
    chain: INPUT
    policy: DROP
- name: Reject tcp with tcp-reset
  ansible.builtin.iptables:
    chain: INPUT
    protocol: tcp
    reject_with: tcp-reset
    ip_version: ipv4
- name: Set tcp flags
  ansible.builtin.iptables:
    chain: OUTPUT
    jump: DROP
    protocol: tcp
    tcp_flags:
      flags: ALL
      flags_set:
        - ACK
        - RST
        - SYN
        - FIN
- name: Iptables flush filter
  ansible.builtin.iptables:
    chain: "{{ item }}"
    flush: yes
  with_items:  [ 'INPUT', 'FORWARD', 'OUTPUT' ]
- name: Iptables flush nat
  ansible.builtin.iptables:
    table: nat
    chain: '{{ item }}'
    flush: yes
  with_items: [ 'INPUT', 'OUTPUT', 'PREROUTING', 'POSTROUTING' ]
- name: Log packets arriving into an user-defined chain
  ansible.builtin.iptables:
    chain: LOGGING
    action: append
    state: present
    limit: 2/second
    limit_burst: 20
    log_prefix: "IPTABLES:INFO: "
    log_level: info
- name: Allow connections on multiple ports
  ansible.builtin.iptables:
    chain: INPUT
    protocol: tcp
    destination_ports:
      - "80"
      - "443"
      - "8081:8083"
    jump: ACCEPT
