Ansible iptables
模块
一、简介
- 功能:
iptables
模块用于管理 Linux 系统上的防火墙规则。通过这个模块,可以添加、删除和修改 iptables 规则,以控制进出系统的网络流量。 - 使用场景:适用于需要管理防火墙规则的场景,如限制特定端口的访问、允许特定 IP 的连接、配置 NAT 等。
二、基本用法
2.1 语法
使用 iptables
模块的基本命令格式:
ansible <pattern> -m iptables -a "chain=<chain> protocol=<protocol> source=<source> destination=<destination> jump=<target> state=<state>"
<pattern>
: 指定要操作的主机或主机组,例如all
、webservers
。-m iptables
: 指定使用iptables
模块。-a "..."
: 提供模块的参数,如链、协议、源地址、目标地址、跳转目标、状态等。
2.2 示例
-
添加一条规则以允许 HTTP 流量:
ansible all -m iptables -a "chain=INPUT protocol=tcp destination_port=80 jump=ACCEPT state=present"
- 解释:在所有主机上添加一条 iptables 规则,允许所有 TCP 80 端口的流量(通常用于 HTTP)。
-
删除特定的规则:
ansible all -m iptables -a "chain=INPUT protocol=tcp destination_port=22 jump=ACCEPT state=absent"
- 解释:在所有主机上删除一条 iptables 规则,删除允许 TCP 22 端口(通常用于 SSH)的流量规则。
-
添加一条规则以阻止特定 IP 的访问:
ansible all -m iptables -a "chain=INPUT source=192.168.1.100 jump=DROP state=present"
- 解释:在所有主机上添加一条规则,阻止来自
192.168.1.100
的所有流量。
- 解释:在所有主机上添加一条规则,阻止来自
三、输出结果
执行 iptables
模块后的典型输出示例:
localhost | CHANGED => {
"changed": true,
"cmd": "/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT",
"invocation": {
"module_args": {
"chain": "INPUT",
"protocol": "tcp",
"destination_port": "80",
"jump": "ACCEPT",
"state": "present"
}
}
}
CHANGED
:表示 iptables 规则发生了变化。changed
: 为true
表示规则已被修改或添加。cmd
:显示实际执行的 iptables 命令。invocation
:显示模块的参数。
如果没有变化(例如规则已存在或要删除的规则不存在),输出将类似于:
localhost | SUCCESS => {
"changed": false,
"msg": "rule is already present"
}
SUCCESS
: 表示操作成功。changed
: 为false
表示规则未被修改。
四、常见选项
4.1 chain
-
功能:指定要操作的 iptables 链。常用的链包括
INPUT
、OUTPUT
、FORWARD
等。 -
用法:
ansible all -m iptables -a "chain=INPUT protocol=tcp destination_port=443 jump=ACCEPT state=present"
- 解释:在所有主机的
INPUT
链上,添加允许 TCP 443 端口(HTTPS)的流量规则。
- 解释:在所有主机的
4.2 protocol
-
功能:指定要匹配的协议。可以是
tcp
、udp
、icmp
等。 -
用法:
ansible all -m iptables -a "chain=INPUT protocol=udp source_port=53 jump=ACCEPT state=present"
- 解释:在所有主机上添加一条规则,允许 UDP 53 端口(通常用于 DNS)的流量。
4.3 source
和 destination
-
功能:指定源地址和目标地址。可以使用 IP 地址、CIDR 子网或
any
。 -
用法:
ansible all -m iptables -a "chain=INPUT source=192.168.1.0/24 destination=any jump=ACCEPT state=present"
- 解释:在所有主机上添加一条规则,允许来自
192.168.1.0/24
网络的所有流量。
- 解释:在所有主机上添加一条规则,允许来自
4.4 jump
-
功能:指定跳转目标。常用的目标包括
ACCEPT
、DROP
、REJECT
、LOG
等。 -
用法:
ansible all -m iptables -a "chain=INPUT jump=DROP state=present"
- 解释:在所有主机的
INPUT
链上添加一条规则,阻止所有流量。
- 解释:在所有主机的
4.5 state
-
功能:指定规则的状态。可以是
present
(添加或更新规则)或absent
(删除规则)。 -
用法:
ansible all -m iptables -a "chain=INPUT protocol=tcp destination_port=22 jump=ACCEPT state=absent"
- 解释:在所有主机上删除允许 TCP 22 端口(SSH)的流量规则。
五、注意事项
- 权限要求:更改 iptables 规则需要具有适当的权限(通常是 root 权限),确保 Ansible 用户具备相应的 sudo 权限。
- 持久化规则:
iptables
规则默认情况下在系统重启后不会自动保存。确保在修改规则后使用适当的命令(如service iptables save
或iptables-save
)来保存规则,以便在重启后应用。 - 规则顺序:
iptables
规则是按顺序匹配的,新的规则会插入到链的开头或结尾,具体取决于执行的命令。要注意规则的顺序,确保预期的流量控制。 - 测试新规则:在添加新规则或更改现有规则时,建议首先测试规则,以避免意外阻止合法流量,尤其是在远程管理服务器时,防止自身被锁定。