在防火墙构建器中使用地址表对象

在防火墙生成器中使用地址表对象

作者:vadim@fwbuilder.org
Firewall Builder项目页面:http://www.fwbuilder.org

本文继续关于Fireall Builder的一系列文章,一个支持许多开源防火墙平台以及Cisco IOS访问列表和Cisco ASA(PIX)的图形化防火墙配置和管理工具。 防火墙生成器早期在此站点上引入, 使用 防火墙生成器入门,在防火墙生成器使用内置版本控制,在防火墙生成器使用内置策略安装程序在防火墙生成器使用防火墙对象

本文演示如何构建与外部文件中存储的IP地址集匹配的防火墙规则。

有关Firewall Builder,预构建的二进制包和源代码,文档和Firewall Builder Cookbook的更多信息 ,请访问项目网站http://www.fwbuilder.org/ 。 关注Firewall Builder项目博客 ,了解有关使用Firewall Builder的所有方面的公告和文章。

地址表对象

有时,您需要将规则应用于一组地址,但您不知道在撰写策略时将会是哪些地址。 地址表对象可以帮助。

fwbuilder GUI中的地址表对象对话框

地址表对象具有以下字段:

  • 名称:

    地址表对象的名称

  • 编译时间/运行时间:

    指示是否要使用防火墙编译器运行(编译时间)或防火墙运行防火墙脚本(运行时间)时加载该文件。

  • 文件名:

    要加载的文本文件的名称。 (该文件包含IP地址或IP地址范围。)文件名可以有任何扩展名。 如果要在运行时加载文件,则必须指定文件所在的路径和名称 防火墙 机器,不是客户机。

  • 浏览按钮:

    用于填充文件名和路径,如果文件在本地机器上。

  • 预览按钮:

    填写文件名字段后,使用此按钮查看文件。

  • 评论:

    用于注释的自由格式的文本字段

“编译时间”和“运行时间”单选按钮定义何时从文件读取地址:防火墙脚本由防火墙生成器或防火墙运行脚本时。 如果对象配置为“编译时间”,则防火墙生成器策略编译器将在编译期间打开该文件,并使用该文件中的一组地址替换策略规则中的“地址表”对象。 这意味着具有地址的文件必须可以在运行Firewall Builder GUI和策略编译器的计算机上访问。 如果对象被配置为“运行时间”,则策略编译器不会尝试查找和打开该文件,而是生成一个防火墙脚本,该脚本将在激活时执行此操作。 这意味着具有地址的文件必须位于防火墙可以访问的位置,并且对象必须配置在防火墙上的完整路径。

这是一个文件内容的例子(这是您在对象对话框中单击“预览”按钮时看到的):

fwbuilder GUI中的地址表对象内容

请注意,文件中的注释可以以'#'或';'开头,注释可以跟在同一行上的一个地址上,也可以采取整行,并且该行可以从空格开始进行格式化。 此示例文件包含IPv4和IPv6地址,用于说明目的。

所有目标防火墙平台都支持编译时地址表对象,因为地址由编译器读取。 然后,编译器将生成正常的配置行或脚本命令。 运行时地址表对象需要来自目标防火墙的特殊支持,因此只支持其中的一些。 当前运行时地址表对象可用于iptables和PF防火墙的规则

当策略规则中使用的地址表对象首先配置为“编译时间”,然后作为“运行时间”时,我们来看看Firewall Builder为iptables和PF生成的防火墙脚本。 规则很简单,如下所示:

在fwbuilder GUI中使用地址表对象的策略规则

该规则将对象设置为“编译时间”,生成以下输出:

编译时间,iptables编译输出

# Rule 0 (global)
# 
$IPTABLES -A INPUT  -d 192.168.1.1  -j DROP 
$IPTABLES -A FORWARD  -d 192.168.1.2  -j DROP 
$IPTABLES -A FORWARD  -d 192.168.1.3/30  -j DROP 
$IPTABLES -A FORWARD  -d 192.168.2.128/25  -j DROP 
$IPTABLES -A FORWARD  -d 192.168.1.200  -j DROP 
$IPTABLES -A FORWARD  -d 192.168.1.201  -j DROP 

编译器将目标中的对象“address_table_1”替换为文件中的地址。 在防火墙对象设置中,假设防火墙是任何一个“被关闭的”,这就是为什么编译器没有在OUTPUT链中生成规则的原因。 但是,文件中的一个地址与防火墙(192.168.1.1)的其中一个接口的地址匹配,相应的规则进入INPUT链。 其他地址从文件逐字复制,包括网络掩码规范。 此防火墙的策略对象被配置为“IPv4规则集”,因为编译器丢弃了在文件中找到的IPv6地址。 如果将规则集配置为IPv4和IPv6的组合,编译器将在IPv6规则中使用IPv4规则和IPv6地址中的IPv4地址。

编译时间,PF编译输出

# Tables: (1)
table  { 192.168.1.1 , 192.168.1.2 , 192.168.1.3/30 , 192.168.2.128/25 , \
192.168.1.200 , 192.168.1.201 }

# Rule  0 (global)
# 
block in   quick inet  from any  to <tbl.r0.d>
block out  quick inet  from any  to <tbl.r0.d>

PF的输出是简单的,因为Firewall Builder可以使用内置的表格工具。 所有地址从文件逐字复制到表tbl.r0.d.

运行时,iptables编译输出

# Using 1 address table files
check_file "address_table_1" "/home/vadim/addr-table-1.tbl"

# Rule 0 (global)
# 
grep -Ev '^#|^;|^\s*$' /home/vadim/addr-table-1.tbl | while read L ; do
  set $L; at_address_table_1=$1; $IPTABLES -A FORWARD  -d $at_address_table_1  -j DROP 
done

首先,生成的脚本检查防火墙机器中是否存在Address Table对象中指定的文件。 如果找不到该文件,脚本将中止执行,以避免加载不完整的iptables规则。 但是,脚本无法验证该文件是否为您想要的文件,它只是假设如果具有该名称的文件存在,那么它是正确的,并尝试将其解释为IP地址列表,每个地址一个线。 然后脚本逐行读取文件,跳过注释,并将IP地址分配给shell变量at_address_table_1,然后它在iptables命令中使用。

由于编译器没有看到文件中的地址,因此无法检测到其中一个与防火墙的地址相匹配,所有iptables命令都转到FORWARD链。 文件/home/vadim/addr-table-1.tbl应该位于防火墙上,生成的iptables脚本将被执行,以便脚本可以找到它。

如果在防火墙对象设置中打开了“假设防火墙是任何一部分”的选项,那么您将获得以下信息:

运行时间,iptables编译输出,假定防火墙是“any”的一部分

# Rule 0 (global)
# 
grep -Ev '^#|^;|^\s*$' /home/vadim/addr-table-1.tbl | while read L ; do
  set $L; at_address_table_1=$1; $IPTABLES -A OUTPUT  -d $at_address_table_1  -j DROP 
done
grep -Ev '^#|^;|^\s*$' /home/vadim/addr-table-1.tbl | while read L ; do
  set $L; at_address_table_1=$1; $IPTABLES -A FORWARD  -d $at_address_table_1  -j DROP 
done

不同之处在于,编译器生成了两组命令,一组在命令行OUTPUT中,另一组在FORWARD链中。 原始规则在源代码中具有“any”,如果选项“假设防火墙属于任何一个”,则编译器将假定规则的源可能具有未知地址或防火墙。 前者使它在FORWARD链中生成iptables命令,后者使其在OUTPUT链中生成iptables命令。 该逻辑不是特定于地址表对象类型; 无论源为“any”,目标中使用的对象的类型如何,编译器都会执行此操作,并且选项“假定防火墙属于任何一个”。

运行时间,PF编译输出

# Tables: (1)
table  persist file "/home/vadim/addr-table-1.tbl"
# Rule  0 (global)
# 
# 
block in   quick inet  from any  to <address_table_1>
block out  quick inet  from any  to <address_table_1>

在运行时地址表的情况下,PF更容易。 编译器只是使用具有持久性文件选项的工具来引导pfctl打开文件并读取其内容。 在这种情况下,文件应遵循PF的格式化要求。

PF的策略编译器特别处理具有空文件名的地址表对象。 它只在.conf文件的开头生成没有文件规范的行“table <table_name>”。 当加载.conf文件时,不会填充此表,因此将保留为空,但可以在规则中使用。

以后可以使用外部脚本将地址添加到表中,如下所示调用pfctl:

pfctl -t bad_hosts -T add 192.0.2.1

使用动态填充的运行时地址表对象与PF

另一个有趣的可能是如果选项“过载”与规则上的其他速率限制选项结合使用,则自动填充表。 以pf.conf的手册页为例,下面是它的外观:

block quick from <bad_hosts>
pass in on $ext_if proto tcp to $webserver port www keep state \
                   (max-src-conn-rate 100/10, overload <bad_hosts> flush global)

这些规则背后的想法是,如果某些主机尝试连接到Web服务器太频繁 - 比max-src-conn-rate 100/10允许的更频繁,其地址将被PF添加到表<bad_hosts> 。 下次主机尝试连接时,来自其的数据包将立即被阻止规则拒绝。

要在防火墙生成器中实现这些规则,您将创建一个名称为“bad_hosts”的地址表对象,但是会创建一个空白文件名,配置为在运行时解析:

地址表对象bad_hosts

在fwbuilder GUI中使用空表的地址表对象

然后,使用动作“拒绝”的策略规则的源字段中的此Address Table对象。 这是下面的截图中的规则#0。 另一个规则,屏幕截图中的规则#1具有操作“接受”,并且将目的地与Web服务器协议http的地址进行匹配,并且具有设置限制连接数并限制连接重载的限制选项,名称与“地址表”对象的名称匹配的重载表“bad_hosts”。

地址表对象bad_hosts规则

策略规则在fwbuilder GUI中使用具有动态填充地址的地址表对象

这两个规则,如屏幕截图所示,产生与手册页中给出的PF配置相匹配的以下PF配置:

# Tables: (1)
table <bad_hosts> persist

# Rule  0 (global)
# 
block in   log  quick inet  from <bad_hosts>  to any 
# 
# Rule  1 (global)
# 
pass in   quick inet proto tcp  from any  to 192.168.1.1 port 80 \
   keep state  (  max-src-conn-rate 100/10, overload <bad_hosts< flush global )
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏