防火墙访问策略规则集,第5部分
作者:vadim@fwbuilder.org http://www.fwbuilder.org |
本文将继续关于Firewall Builder的一系列文章,这是一个图形化的防火墙配置和管理工具,它支持许多开源防火墙平台以及Cisco IOS访问列表和Cisco ASA(PIX)。 防火墙生成器早期在此站点上引入了防火墙生成器入门,在防火墙生成器中使用防火墙对象 。 防火墙访问策略规则集,第1部分 。 防火墙访问策略规则集,第2部分 。
本文继续介绍访问策略规则的示例,并演示如何构建分支规则。
有关Firewall Builder,预构建的二进制包和源代码的更多信息,请参见项目网站http://www.fwbuilder.org/上的文档 。 “ Firewall Builder用户指南”中提供了许多iptables,pf和其他规则的示例 。 关注Firewall Builder项目博客 ,了解有关使用Firewall Builder的所有方面的公告和文章。
分支规则
许多防火墙平台支持机制,通过该机制,控制可以从一组规则传递到另一组规则,就像编程语言一样,控制可以传递给一个子程序。 在这种操作中获得控制的规则集可以对数据包进行最终决定,接受或拒绝它,或者可以将控制权返回到之前运行的规则集。 防火墙构建器使用分支动作(对iptables防火墙称为“Chain ”) ,PF防火墙的“Anchor”分别重用熟悉iptables和pf中使用的名称。
平台特定的动作名称“链”和“锚点”将在Firewall Builder v4.0中消失。 在规则集处理序列中创建分支的操作的名称将只是“分支”,而不管所选的目标防火墙平台如何。
分支规则可用于创建优化的规则集或提高可读性或两者兼而有之。 考虑下面的截图所示的例子:
防火墙fw2有两个规则集:“策略”和“rate_limit”。 我将演示如何使用第二个规则集来限制匹配主规则集“策略”中不同规则的限制数据包。
文章“防火墙访问策略规则集第4部分”展示了如何向防火墙添加策略规则集对象。
让我们创建一个规则来将ssh会话与防火墙进行匹配,而不是立即接受或放弃它们,而是将控制权传递给规则集“rate_limit”,只有当它们没有打开得太快时才接受它们。 首先,创建此规则并选择操作“链”,然后双击该操作,并将规则集对象“rate_limit”拖动到操作对话框中,如屏幕截图所示:
现在我们可以在“rate_limit”规则集中配置速率限制规则。 我将使用iptables模块“hashlimit”配置相当复杂的速率限制。 当我为PF重新创建相同的例子时,选项将看起来不同。
这是由程序为这些规则生成的iptables脚本:
# Rule 0 (global) # $IPTABLES -N rate_limit $IPTABLES -A INPUT -p tcp -m tcp --dport 22 -j rate_limit # ================ Table 'filter', rule set rate_limit # # Rule rate_limit 0 (global) # $IPTABLES -A rate_limit -m state --state NEW \ -m hashlimit --hashlimit 5/minute --hashlimit-mode srcip \ --hashlimit-name htable_rule_0 -j ACCEPT
熟悉iptables的人会注意到,Firewall Builder使用第二个规则集(“rate_limit”)的名称创建了用户定义的链,并使用“-j”选项将控件从顶层规则传递给它。
从单一规则分支不是很有趣。 我可以使用与顶级策略规则集中的规则#0相同的选项,并获得相同的结果,除了用户定义的链“rate_limit”,这一切都将在同一个iptables命令中完成。 但是,如果要使用相同的速率限制来控制对完全不同协议的防火墙后面的多个服务器的访问,则分支到专用规则集将变得更加有用。 这是新的例子:
以下是iptables脚本的生成方式:
# ================ Table 'filter', rule set Policy # # Rule 0 (global) # $IPTABLES -N rate_limit $IPTABLES -A INPUT -p tcp -m tcp --dport 22 -j rate_limit # # Rule 1 (global) # $IPTABLES -A FORWARD -p tcp -m tcp -d 192.168.1.100 --dport 25 -j rate_limit # # Rule 2 (global) # $IPTABLES -A FORWARD -p tcp -m tcp -d 192.168.1.200 --dport 80 -j rate_limit # ================ Table 'filter', rule set rate_limit # # Rule rate_limit 0 (global) # $IPTABLES -A rate_limit -m state --state NEW \ -m hashlimit --hashlimit 5/minute --hashlimit-mode srcip \ --hashlimit-name htable_rule_0 -j ACCEPT
这里有三个匹配不同地址和服务的iptables规则,但是将控制权传递给同一个链“rate_limit”。 现在如果我需要调整所有目的地的速率限制参数,我可以在一个地方而不是三个地方。
“rate_limit”规则集中的规则#0只有在每个源IP地址每分钟不超过5个速率的情况下才匹配数据包。 符合这些条件的数据包将被接受,但不符合规则的数据包。 由于该规则是分支规则集中的最后一个,因此控制将返回到顶层,防火墙将继续检查数据包,该规则低于通过控制“rule_limit”规则集的规则。 最终,它可能会触发“捕获所有”规则并丢弃,但更复杂的策略可能会对这些数据包执行其他操作,例如尝试不同的速率限制条件或标记流量整形。
仅当目标防火墙平台提供某种机制来支持时,才能在防火墙生成器中创建分支。 在iptables中,它是用户定义的链,在PF中是锚点。 不幸的是,在Cisco IOS访问列表和PIX中无法实现分支。 让我们尝试重新编译PF的相同规则。 首先,我们需要改变速率限制参数,因为它在PF中的实现与iptables不同。
我在主策略中使用相同的三个规则来限制与防火墙本身的连接以及其后面的两个服务器。 生成的PF配置被分割,使得主策略规则在文件“fw2-pf.conf”中 ,规则集“rate_limit”的规则位于文件“fw2-pf-rate_limit.conf”中 。 当为PF编译具有多个规则集的配置时,每个新的分支规则集都有自己的单独文件,其名称由防火墙对象的名称和规则集对象的名称组成。
文件fw2-pf.conf :
# Tables: (1) table <tbl.r9999.d> { 192.0.2.1 , 192.168.1.1 } # Policy compiler errors and warnings: # # Rule 0 (global) # anchor rate_limit in inet proto tcp from any to <tbl.r9999.d> port 22 # # Rule 1 (global) # anchor rate_limit inet proto tcp from any to 192.168.1.100 port 25 # # Rule 2 (global) # anchor rate_limit inet proto tcp from any to 192.168.1.200 port 80
文件fw2-pf-rate_limit.conf :
# Tables: (0) # Policy compiler errors and warnings: # # Rule rate_limit 0 (global) # pass quick inet from any to any keep state ( max-src-conn 10, max-src-conn-rate 5/60 )
Firewall Builder还生成一个shell脚本来加载这些规则。 该脚本与名称与防火墙名称相同的文件,扩展名为“.fw”:
这是在fw2-pf.fw文件中加载规则的代码:
$PFCTL -f ${FWDIR}/fw2-pf.conf || exit 1 $PFCTL -a rate_limit -f ${FWDIR}/fw2-pf-rate_limit.conf || exit 1
来自文件“fw2-pf-rate_limit.conf”的规则被加载到锚“rate_limit”中。