防火墙访问策略规则集,第2部分
作者:vadim@fwbuilder.org http://www.fwbuilder.org |
本文将继续关于Firewall Builder的一系列文章,这是一个图形化的防火墙配置和管理工具,它支持许多开源防火墙平台以及Cisco IOS访问列表和Cisco ASA(PIX)。 防火墙生成器早期在此站点上引入了防火墙生成器入门,在防火墙生成器中使用防火墙对象 。 防火墙访问策略规则集,第1部分 。
本文演示了几个关于iptables , PF和Cisco PIX的Access策略规则和生成配置的示例。
有关Firewall Builder,预构建的二进制包和源代码的更多信息,请参见项目网站http://www.fwbuilder.org/上的文档 。 “ Firewall Builder用户指南”中提供了许多iptables,pf和其他规则的示例 。 关注Firewall Builder项目博客 ,了解有关使用Firewall Builder的所有方面的公告和文章。
示例中使用的防火墙对象
我们从防火墙对象开始,如下图所示。 这个防火墙有三个接口:eth0(外部),eth1(内部)和loopback。 静态分配所有地址。 内部接口“eth1”的地址是192.168.1.1/24,我们也有网络对象名为“net-192.168.1.0”,定义内部网络192.168.1.0/24。
为了说明本文中iptables / Linux以外平台的生成配置,我使用了具有不同平台和主机操作系统设置的类似配置的防火墙对象。
允许内部LAN连接到Internet
在此示例中,我们创建一个规则,以允许我们的内部LAN使用任何协议连接到Internet。 网络对象“net-192.168.1.0”应配置与防火墙后面内部网络上使用的IP地址和网络掩码。 由于本示例中的内部LAN使用专用地址块,因此此处描述的规则不足,并应附带相应的NAT(网络地址转换)规则。 我们在下一篇文章中讨论NAT规则。
以下是为此示例生成的iptables命令:
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Rule 0 (global) # $IPTABLES -A INPUT -s 192.168.1.0/24 -m state --state NEW -j ACCEPT $IPTABLES -A OUTPUT -s 192.168.1.0/24 -m state --state NEW -j ACCEPT $IPTABLES -A FORWARD -s 192.168.1.0/24 -m state --state NEW -j ACCEPT # # Rule 1 (global) # $IPTABLES -N RULE_1 $IPTABLES -A OUTPUT -j RULE_1 $IPTABLES -A INPUT -j RULE_1 $IPTABLES -A FORWARD -j RULE_1 $IPTABLES -A RULE_1 -j LOG --log-level info --log-prefix "RULE 1 -- DENY " $IPTABLES -A RULE_1 -j DROP
利用模块的规则 州 并匹配状态 已建立,相关 允许回复分组,例如TCP ACK,UDP回复分组和与已知会话相关联的ICMP消息。 如果在防火墙对象“高级”设置对话框中打开选项“在第一个规则之前接受ESTABLISHED和相关数据包”,这些规则将自动添加到生成的iptables脚本的开头。 如果您关闭此选项,该规则将不会自动添加,您必须自己添加。 您可以使用Custom Service对象 已建立 你可以在中找到 标准 对象库这样做。
第一条规则放在所有三条链中: 输入 , 输出 和 前锋 因为此防火墙对象的“高级”设置对话框中的选项“假定防火墙属于任何一个”。 此选项指示策略编译器假定该对象 “任何” 也匹配防火墙本身。 换句话说,在规则的目的地中使用“任何”等效于使用任何地址和防火墙的组合。 为了匹配前往防火墙的数据包,应将规则放在 输入 链。 另外,地址192.168.1.0/24内的网络对象与该网络上具有地址的防火墙接口匹配。 这意味着,这个规则还应该匹配防火墙本身发送的数据包,源地址是内网上的接口。 这需要iptables命令 输出 链。 最后,iptables命令在 前锋 链匹配内部网络上的机器发送的数据包。
规则#1捕获来自防火墙和防火墙的所有其他数据包,并记录并删除它们。
让我们看看如果选项“假设防火墙是任何一部分”,关闭iptables会生成什么内容:
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Rule 0 (global) # $IPTABLES -A FORWARD -s 192.168.1.0/24 -m state --state NEW -j ACCEPT # # Rule 1 (global) # $IPTABLES -N RULE_1 $IPTABLES -A FORWARD -j RULE_1 $IPTABLES -A RULE_1 -j LOG --log-level info --log-prefix "RULE 1 -- DENY " $IPTABLES -A RULE_1 -j DROP
在“ESTABLISHED”,“相关”状态下匹配数据包的自动添加规则不受“假设防火墙属于任何一个”选项的影响,并且始终在链INPUT,OUTPUT和FORWARD中匹配。
由于编译器不会假定防火墙匹配“any”,所以具有“any”的规则是目的地仅在FORWARD链中产生iptables命令。 这适用于允许从内部LAN发送连接和“全部捕获”规则#1的规则。 选择此选项的设置取决于策略设计者。 有些人发现它更直观地离开它,并添加规则来显式控制访问和从防火墙访问。 请注意,所有链的默认策略设置为DROP,并在生成的iptables脚本的顶部使用以下命令:
$IPTABLES -P OUTPUT DROP $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP
这意味着如果您不添加允许访问防火墙的规则,并选择“假设防火墙是任何一个”的关闭,那么所有生成的iptables规则将在FORWARD链中,并且所有对防火墙的访问将被INPUT链中的默认策略。 另一方面,如果选项“假设防火墙属于任何一个”,则允许从内部网络访问“任何”的规则也会允许访问防火墙的副作用。 这取决于你是否是一件好事或坏事。 您可以随时限制对防火墙的访问,并在策略开头附近的几个规则进行控制,无论此选项的设置如何。
即使您选择选择“假定防火墙属于任何一个”,并且不添加任何规则来允许访问策略规则集中的防火墙,则可以在防火墙对象“高级”设置对话框中使用其他选项。 该选项称为“始终允许ssh从管理站访问防火墙”,并允许您输入单个IP地址或子网,然后自动向生成的脚本添加规则,以允许从该地址访问防火墙的ssh。 我们在以下文章之一展示此功能。
下面的示例已经编译,其中选项“假定防火墙是任何一个”的开启。
以下是为相同规则创建的PF配置:
# Rule 0 (global) # pass quick inet from 192.168.1.0/24 to any keep state # # Rule 1 (global) # block log quick inet from any to any
Firewall Builder总是使用它来生成PF配置 “快” 子句切换到第一个匹配模式。 在该PF配置示例中,第一条规则允许源地址在192.168.1.0/24网络上的数据包,并停止处理。 第二条规则只会检查不符合第一条规则的数据包。
以下是为相同的规则组合生成的PIX配置的片段:
! Rule 0 (global) ! access-list inside_acl_in remark 0 (global) access-list inside_acl_in permit ip 192.168.1.0 255.255.255.0 any ! ! Rule 1 (global) ! access-list outside_acl_in remark 1 (global) access-list outside_acl_in deny ip any any log 4 interval 300 access-list dmz50_acl_in remark 1 (global) access-list dmz50_acl_in deny ip any any log 4 interval 300 access-list inside_acl_in remark 1 (global) access-list inside_acl_in deny ip any any log 4 interval 300 access-group dmz50_acl_in in interface dmz50 access-group inside_acl_in in interface inside access-group outside_acl_in in interface outside
由于规则#0中的源地址仅限于内部网络,因此策略编译器能够确定访问列表命令应与哪个接口相关联,并将其添加到ACL “inside_acl_in” 。
的 “访问组” 命令实际上位于生成的脚本的最底层,毕竟其他的 访问列表 命令。 显示在此处的ACL规则旁边进行演示。
让某些协议通过,同时阻止一切
这是您可能希望防火墙所做的最简单,最基本的任务之一 - 阻止所有流量,同时让特定协议通过。 假设我们有一个由防火墙“firewall1”组成的网络和其后面的几个主机。 我们想让SMTP通过Internet从邮件服务器,并阻止一切。 我们需要做的是将以下规则放在全局策略中:
规则#0允许SMTP通过服务器,而规则#1阻止并记录其他所有内容。 值得一提的是,此政策还阻止了对防火墙本身的所有访问,包括从内部主机访问防火墙。
我们不需要任何额外的规则来处理从服务器返回到客户端的“回复”数据包,因为我们的底层防火墙软件支持状态检查并“理解”这些数据包应该被通过。
这是为这两个简单规则生成的iptables脚本:
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Rule 0 (global) # $IPTABLES -A OUTPUT -p tcp -m tcp -d 192.168.1.100 \ --dport 25 -m state --state NEW -j ACCEPT $IPTABLES -A FORWARD -p tcp -m tcp -d 192.168.1.100 \ --dport 25 -m state --state NEW -j ACCEPT # # Rule 1 (global) # $IPTABLES -N RULE_1 $IPTABLES -A OUTPUT -m state --state NEW -j RULE_1 $IPTABLES -A INPUT -m state --state NEW -j RULE_1 $IPTABLES -A FORWARD -m state --state NEW -j RULE_1 $IPTABLES -A RULE_1 -j LOG --log-level info --log-prefix "RULE 1 -- DENY " $IPTABLES -A RULE_1 -j DROP
生成的iptables规则放在两者中 输出 和 前锋 因为此防火墙对象的“高级”设置对话框中的选项“假定防火墙属于任何一个”。 换句话说,在规则的Source中使用“Any”相当于使用任何地址和防火墙的组合。 结果的iptables命令应放在 输出 链接以匹配防火墙生成的数据包 前锋 以匹配穿过防火墙的数据包。 如果关闭此选项,程序将仅生成iptables规则 前锋 这个规则的链。
以下是为同一规则为PF生成的代码:
# Rule 0 (global) # pass quick inet proto tcp from any to 192.168.1.100 port 25 keep state # # Rule 1 (global) # block log quick inet from any to any
在PF中,我们不必担心链,并且没有选项“假设防火墙是任何一个”,因为没有任何区别。
以下是PIX为同一规则生成的代码:
! Rule 0 (global) ! access-list outside_acl_in remark 0 (global) access-list outside_acl_in permit tcp any host 192.168.1.100 eq 25 access-list dmz50_acl_in remark 0 (global) access-list dmz50_acl_in permit tcp any host 192.168.1.100 eq 25 access-list inside_acl_in remark 0 (global) access-list inside_acl_in permit tcp any host 192.168.1.100 eq 25 ! ! Rule 1 (global) ! access-list outside_acl_in remark 1 (global) access-list outside_acl_in deny ip any any log 0 interval 300 access-list dmz50_acl_in remark 1 (global) access-list dmz50_acl_in deny ip any any log 0 interval 300 access-list inside_acl_in remark 1 (global) access-list inside_acl_in deny ip any any log 0 interval 300
在PIX中,所有访问列表必须连接到防火墙的接口。 由于规则没有指定源地址,因此程序必须生成与任何源匹配的访问列表,这意味着它们应该被附加到防火墙的所有接口。 由于我的PIX测试对象有三个接口: 外 , 内 和 dmz 我最后在三个访问列表中的ACL行,每个接口一个。
让某些协议通过特定来源
在这个例子中,我们来看一下与前一个规则相似的规则,但也匹配源地址。 此规则允许从DMZ上的邮件转发访问邮件服务器,也可以从其他来源访问邮件服务器。 生成的iptables和pf的规则非常相似,只是添加了源地址匹配。 生成的PIX规则是不同的,因为程序可以智能地选择正确的访问列表,并避免生成冗余规则。
这是从这个规则为iptables生成的代码:
# Rule 0 (global) # $IPTABLES -A FORWARD -p tcp -m tcp -s 192.168.2.22 -d 192.168.1.100 \ --dport 25 -m state --state NEW -j ACCEPT
由于源规则元素仅限于DMZ上的主机,因此生成的iptables规则仅放在FORWARD链中,并且还使用“-s”子句匹配源。
我们来看一下从同一规则为PIX生成的配置:
! Rule 0 (global) ! access-list dmz50_acl_in remark 0 (global) access-list dmz50_acl_in permit tcp host 192.168.2.22 host 192.168.1.100 eq 25 access-group dmz50_acl_in in interface dmz50 access-group inside_acl_in in interface inside access-group outside_acl_in in interface outside
规则只放置在DMZ接口的接入列表中,因为DMZ主机的源地址数据包只能通过防火墙的接口,假设欺骗的数据包被特殊规则阻塞,下面将讨论。