集中式防火墙控制提供了一种集中管理运行 iptables 的多台服务器或负载均衡器防火墙的方法。通过这种方式,你可以使用一条命令在多台服务器上快速允许/阻止/删除/搜索滥用地址段等。它通过 SSH 访问这些服务器。
支持 IPv4 和 IPv6。
已在 Debian 6.x / 7.x / 8.x / 9.x 上测试,但应适用于任何发行版。
要使用 IPv6 的 'precheck'、'protected' 和 'findip' 功能,需要安装 'netaddr' Python 模块。IPv4 不需要该模块,因为它使用 IP 二进制形式的前缀匹配。
Debian: apt-get install python3-netaddr
配合 'ipset' 使用 iptables 效率更高。Ipset 可用于管理 iptables 可以引用和使用的列表。这种方式速度更快,列表操作也更灵活,是使用此脚本的首选方法。
Debian: apt-get install ipset
由于此脚本通过 SSH 连接到指定服务器,因此必须存在相应的 SSH 访问权限才能使用。
首次使用时,将 cfc.cfg-example 示例配置复制为 cfc.cfg。
配置文件中可以设置以下选项:
action: 添加规则时设置的动作,默认值: DROP
checkaggrbin: checkaggr.py 脚本的路径,默认值: ./checkaggr.py
cleanupconfirmation: 运行清理命令前是否需要确认,用于 cron 时设为 false,默认值: true
date: 设置防火墙注释的日期格式,默认值: $(date +%d%m%Y) -> 22062016
dateipset: 设置 ipset 防火墙注释的日期格式,建议保持默认以避免某些功能失效,默认值: $(date +%Y%m%d) -> 20160622
ipsetname: 设置 IPSET 列表名称,默认值: blockedips
ipsetservers: 设置使用 IPSET 而非 iptables 的服务器,默认值: "lvs05.example.com lvs06.example.com"
fwchain: 添加/删除/搜索的防火墙链名称,默认值: INPUT
masklimit: 可添加的 IP 范围的最大掩码大小,默认值: /21
precheck: 检查即将添加的 IP 是否已在防火墙中,或是否属于已添加的更大范围。对于大型 IPv6 防火墙可能较慢(每台服务器搜索 500 个 IP 范围约需 25 秒),默认值: true
protected: 启用已添加的保护范围,默认值: true
protectedranges: 从 'add' 功能中排除的 IP 范围,通常是本地网络所拥有的范围,默认值: "172.16.0.0/12 10.0.0.0/8 192.168.0.0/16"
pythonbin: 所使用的 Python 二进制文件位置,默认值: /usr/bin/python3
servers: 设置仅使用 iptables 的服务器,默认值: "lvs01.example.com lvs02.example.com lvs03.example.com lvs04.example.com"
IPv6 功能通过后缀 '6' 标记
在执行以下命令输入 IP/范围时,请使用 CIDR 表示法,系统会进行验证,其他格式将不被接受。
add:
cfc.sh add n.n.n.n/NN '<可选注释>'
cfc6.sh add <IPv6地址范围> '<可选注释>'
将指定的 IP(范围)添加到防火墙,并对来自该源的所有流量执行配置的动作。默认会添加当前日期的注释,你也可以在单引号中添加可选注释,例如添加该范围的原因或所有者。后续可根据该注释进行搜索。
addstring:
cfc.sh addstring <协议>:<目标端口> <字符串>
cfc6.sh addstring <协议>:<目标端口> <字符串>
针对特定协议和目标端口向 iptables 添加字符串阻止规则。一个实际例子是阻止针对一组 Web 服务器的某个 User-Agent,例如针对目标端口 80 的 TCP 连接中包含字符串 "Firefox/28.0",所有匹配该字符串且发往 TCP 80 端口的入站流量都将被阻止:
cfc.sh addstring tcp:80 'Firefox/28.0'
注意,如果字符串不够具体,可能会产生严重后果!
clean:
cfc.sh clean <天数>
清理所有超过 n 天历史的 CFC 防火墙规则。请注意,这取决于默认的日期格式!如果你自定义了日期格式,则需调整脚本中的 'clean' 部分。
del:
cfc.sh del n.n.n.n/NN
cfc6.sh del <IPv6地址范围>
从防火墙中删除指定的 IP(范围)/规则。
delstring:
cfc.sh delstring <协议>:<目标端口> <字符串>
cfc6.sh delstring <协议>:<目标端口> <字符串>
删除 iptables 中针对特定协议和目标端口的字符串阻止规则。
find:
cfc.sh find <字符串>
cfc6.sh find <字符串>
在防火墙中搜索指定的字符串(不区分大小写),可以是 IP / 范围 / 注释的一部分。
findip:
cfc.sh findip n.n.n.n/NN
cfc6.sh findip <IPv6地址范围>
检查防火墙中是否已包含指定的 IP(范围)作为已添加规则的一部分。对于大型 IPv6 防火墙可能较慢(每台服务器搜索 500 个 IP 范围约需 25 秒)。IPv4 使用 IP 二进制形式的前缀匹配,速度大约快 500%,该方式也用于 precheck 和 protectedranges 功能。
ipsethostinit:
cfc.sh ipsethostinit <服务器名称>
cfc6.sh ipsethostinit <服务器名称>
在指定主机上添加 IPSET 列表以及引用该列表的 iptables 规则,使用 cfc.cfg 中定义的参数。此操作仅在添加防火墙规则前执行一次即可。
last:
cfc.sh last <最近规则数量>
cfc6.sh last <最近规则数量>
显示最近 条添加到防火墙的条目。