在Firewall Builder中使用接口对象
作者:vadim@fwbuilder.org http://www.fwbuilder.org |
本文继续关于Fireall Builder的一系列文章,一个支持许多开源防火墙平台以及Cisco IOS访问列表和Cisco ASA(PIX)的图形化防火墙配置和管理工具。 防火墙生成器早期在此站点上引入, 使用 防火墙生成器入门,在防火墙生成器中使用内置版本控制,在防火墙生成器中使用内置策略安装程序 , 在防火墙生成器中使用防火墙对象 。 本文演示如何使用Firewall Builder中的Interface对象。
有关Firewall Builder,预构建的二进制包和源代码,文档和Firewall Builder Cookbook的更多信息 ,请访问项目网站www.fwbuilder.org 。 观看项目博客 ,了解使用Firewall Builder的所有方面的公告和文章。
接口对象
接口对象属于防火墙或主机对象。 接口对象不能单独存在。
属于防火墙或主机的接口对象的对话框为此处描述的参数提供控件。
- 名称:Firewall Builder中的接口对象的名称必须与其所代表的防火墙机器的接口的名称完全一致。 这将是“eth0”,“eth1”,“en0”,“br0”等等。
- 标签:在大多数操作系统的这个字段不被使用并且用于描述性标签的目的。 Firewall Builder GUI使用标签(如果不是空白)显示树中的接口。 该领域的一个建议用途是标记接口以反映网络拓扑(“外部”,“内部”)或目的(“Web前端”或“备份子网”)。 该标签对于Cisco PIX是强制性的,但必须反映网络拓扑。
- 管理界面:当防火墙有多个网络接口时,其中一个可以被标记为“管理界面”。 管理界面用于Firewall Builder与防火墙之间的所有通信。 例如,当内置策略安装程序将生成的脚本或配置文件复制到其中时,将使用管理界面的地址通过ssh连接到防火墙。
- 外部接口(不安全):标记连接到Internet的接口。
- 未受保护的界面:标记防火墙生成器不应分配任何访问列表或防火墙规则的界面。 未受保护的接口由Cisco IOS访问列表和PF的策略编译器识别。 IOS ACL的编译器只是跳过未受保护的接口,并且在选择与哪个接口相关联的ACL时,不会为它们分配任何ACL。 PF的编译器生成“设置跳过 “无保护接口的子句。
- 常规接口:如果接口手动分配了IP地址(静态IP地址),则使用此选项。
- 地址被动态分配:如果接口具有动态地址(通过DHCP或PPP或其他协议获得),则使用此选项。 在这种情况下,当Firewall Builder生成防火墙策略时,地址是未知的。 一些防火墙允许在策略中使用接口名称而不是其IP地址; 防火墙引擎随后在策略激活时甚至在运行时选择地址。 一些其他防火墙支持特定语法,用于匹配与防火墙机器相关的数据包的规则。 这两种情况的例子是OpenBSD PF和Netfilter。 可以使用接口名称构建PF规则; 当它将规则加载到内存中时,PF会自动使用当前的接口地址。 Netfilter支持被称为“INPUT”和“OUPUT”的特殊“链”,保证只检查前往防火墙机器(“INPUT”)或发起防火墙的数据包(“OUTPUT”)。 这两种方法都允许防火墙构建器构建影响具有动态IP地址的接口的正确的防火墙策略规则,但是必须将接口标记为使策略编译器根据目标防火墙平台使用正确的技术。 在规则必须使用接口的实际IP地址(例如:反欺骗规则)的情况下,编译器将通过添加shell脚本片段来模拟此功能,以确定执行防火墙脚本时的地址,然后使用规则。 这样的仿真只能在防火墙配置采用shell脚本形式的平台上进行,最显着的是在Linux上的iptables脚本。
- 无编号接口:如果接口永远不会有IP地址,例如用于在一些ADSL连接上运行PPPoE通信的以太网接口或隧道端点接口,则使用此选项。 虽然无编号的接口没有地址,但防火墙策略规则或访问列表可以与其关联。
- 桥接端口:此选项用于桥接防火墙端口。 当编译器选择接口来附加策略和nat规则时,跳过网桥端口。 对于支持桥接并需要特殊配置参数以匹配桥接数据包的目标防火墙平台,编译器使用此属性生成正确的配置。 例如,在iptables编译器使用-m physdev --physdev-in或-m physdev --physdev-out作为桥接端口接口的情况下。
- 安全级别:取决于防火墙平台,安全级别为外部/内部或数字值介于0和100之间,其中0最不安全,100是最安全的级别。 GUI对话框中的此字段自动显示适合当前防火墙的控件。 并非所有防火墙都支持安全区域的概念。
- 网络区域:此接口的网络区域,仅与Cisco PIX(ASA)一起使用。 网络区域下拉列表显示树中存在的所有网络对象和地址组和网络组。 选择其中一个来告诉编译器可以通过该接口访问哪些网络和地址块。 通常外部接口(将防火墙连接到Internet的接口)将“网络区域”设置为“任意”。 还建议您创建一组对象以表示防火墙上所有其他接口的网络区域。 编译器使用此信息根据规则目的地中使用的地址来决定每个ACL规则应与哪个接口相关联。
更多关于安全级别和网络区域
请考虑以下屏幕截图中显示的网络布局。
这里的防火墙有三个接口:'outside','dmz'和'inside'。 在防火墙后面有一个路由器,它又连接到三个子网的子网A','子网B'和'子网C'。 子网A在路由器和防火墙之间共享(每个设备在此子网上都有一个接口)。 我们还假设我们为每个子网创建了网络对象,并称它们为“子网”,“子网A”,“子网B”和“子网C”(请注意,对象名称中允许使用空格)。 对于此设置,网络区域应配置如下:
接口 | 网络区域 |
---|---|
外 | 任何 |
dmz | 子网DMZ |
内 | 子网A,子网B,子网C |
由于“内部”接口的网络区域由多个对象组成,所以必须创建一个组,以便您可以将该组用作网络区域对象。
以下解释了防火墙平台解释防火墙接口的安全级别和网络区域参数中的值的差异。
防火墙平台 | 安全级别值 | 网络区域 |
---|---|---|
iptables | 两个值:“外部”或“内部” | 不适用 |
ipfilter | 两个值:“外部”或“内部” | 不适用 |
pf | 两个值:“外部”或“内部” | 不适用 |
思科PIX | 数字,0 - 100 | 对组或网络对象的引用 |
请注意,“外部”界面选项可能会在将来的程序版本中被废弃
在PIX中,访问列表必须始终附加到接口。 PIX的策略编译器使用关于接口网络区域的信息来确定规则应该与哪个接口关联,如果它的“接口”列没有指定一个(设置为“全部”)。 而不是将此规则放在连接到所有接口的访问列表中,它将规则的“源”和“目标”中的地址与接口的网络区域进行比较,并且仅使用匹配的接口。 这有助于生成更加紧凑的PIX配置。
在规则中使用接口对象
Firewall Builder中的策略规则具有名为“Interface”的特殊规则元素或列。 您可以将接口对象拖放或复制/粘贴到规则的此列中,以使防火墙不仅匹配源和目标地址和服务,而且还要匹配防火墙的接口,通过该接口进入或退出数据包。 方向由“方向”栏中的设置定义。 请考虑以下示例:
规则#0是依赖于定义接口和方向的能力的“反欺骗”规则。 它匹配源地址等于防火墙接口或内部网络地址的数据包。 该数据包从外部进入,这是通过比较他们进入防火墙的接口来确定的。 具有这样的地址的数据包通常不能来自外部,所以如果他们这样做,他们必须被欺骗,应该被丢弃。 这是这个规则做的,它会丢弃并记录这些数据包。 规则#1允许从内部网络发出的连接出来,但是它确保这些数据包通过其内部接口进入防火墙。
这两个规则生成以下iptables脚本:
#
# Rule 0 (eth0)
#
$IPTABLES -N In_RULE_0
$IPTABLES -A FORWARD -i eth0 -s 192.0.2.1 -j In_RULE_0
$IPTABLES -A FORWARD -i eth0 -s 172.16.22.1 -j In_RULE_0
$IPTABLES -A FORWARD -i eth0 -s 192.168.2.1 -j In_RULE_0
$IPTABLES -A FORWARD -i eth0 -s 172.16.22.0/24 -j In_RULE_0
$IPTABLES -A In_RULE_0 -j LOG --log-level info --log-prefix "RULE 0 -- DENY "
$IPTABLES -A In_RULE_0 -j DROP
#
# Rule 1 (eth1)
#
$IPTABLES -A FORWARD -i eth1 -s 172.16.22.0/24 -m state --state NEW -j ACCEPT
这里所有的iptables命令都具有“-i eth0”或“-i eth1”子句,这使得iptables比较了接口和方向。
如果我们为PF编译相同的规则,我们得到的是:
# Tables: (1)
table <tbl.r9999.d> { 192.0.2.1 , 172.16.22.1 , 192.168.2.1 }
#
# Rule 0 (eth0)
#
block in log quick on en0 inet from <tbl.r9999.d> to any
block in log quick on en0 inet from 172.16.22.0/24 to any
#
# Rule 1 (eth1)
#
pass in quick on en1 inet from 172.16.22.0/24 to any keep state
#
对于PF,编译器生成块快速登录eth0子句,使规则匹配接口和方向。
在Cisco IOS访问列表的情况下,规则中定义接口使得将此规则生成的编译器地址代码附加到给定接口的ACL。 IOS ACL的编译器总是为每个接口生成入站和出站访问列表,但是如果规则同时指定了接口和方向“入站”或“出站”,生成的配置只会进入相应的访问列表。 以下是针对Cisco IOS ACL的上述规则生成的输出:
ip access-list extended inside_in
! Rule 1 (eth1)
!
permit ip 172.16.22.0 0.0.0.255 any
exit
ip access-list extended outside_in
! Rule 0 (eth0)
!
deny ip host 192.0.2.1 any log
deny ip host 192.168.2.1 any log
deny ip 172.16.22.0 0.0.0.255 any log
exit
interface FastEthernet1
ip access-group inside_in in
exit
interface FastEthernet0
ip access-group outside_in in
exit
到目前为止,本章中的示例演示了如何使用接口对象将策略规则与接口相匹配,以匹配穿过特定接口的数据包。 接口对象可以像任何其他可寻址对象一样用于规则的“soruce”和“destination”。 在这种情况下,fwbuilder会使用一组地址替换接口对象,仅选择与分配给规则集的地址族(IPv4或IPv6)匹配的那些地址。 这是这样的样子。 我们从防火墙配置开始,其中接口eth1有两个IP地址,一个是IPv4,另一个是IPv6。 请注意,这可能是主机对象,因为接口可以属于防火墙或主机对象。
接口eth1具有IPv4地址172.16.22.1和IPv6地址fe80 :: 21d:9ff:fe8b:8e94; 它在简单的策略规则中使用如下:
策略规则集被配置为混合的IPv4 + IPv6规则集。 对于iptables,编译器生成以下代码:
# ================ IPv4
# Rule 0 (global)
#
$IPTABLES -A INPUT -p tcp -m tcp -d 172.16.22.1 --dport 22 -m state --state NEW -j ACCEPT
# ================ IPv6
# Rule 1 (global)
#
$IP6TABLES -A INPUT -p tcp -m tcp -d fe80::21d:9ff:fe8b:8e94 --dport 22 -m state --state NEW -j ACCEPT
对于PF,我们得到以下内容:
# Rule 0 (global)
#
#
pass in quick inet proto tcp from any to 172.16.22.1 port 22 keep state
pass out quick inet proto tcp from any to 172.16.22.1 port 22 keep state
# Rule 0 (global)
#
#
pass in quick inet6 proto tcp from any to fe80::21d:9ff:fe8b:8e94 port 22 keep state
pass out quick inet6 proto tcp from any to fe80::21d:9ff:fe8b:8e94 port 22 keep state
由于接口有两个地址,一个IPv4和另一个IPv6,编译器在脚本的IPv4部分和IPv6部分都生成了命令,但它们在每个接口中只使用正确的地址。 除此之外,当在规则的源或目标元素中使用时,接口对象的行为就像一组地址。 它也可以用于NAT规则,这里是一个例子:
这将为iptables生成以下代码:
# Rule 0 (NAT)
#
$IPTABLES -t nat -A POSTROUTING -o eth0 -s 172.16.22.0/24 -j SNAT --to-source 192.0.2.1
#
# Rule 1 (NAT)
#
$IPTABLES -t nat -A PREROUTING -p tcp -m tcp -d 192.0.2.1 --dport 80 -j DNAT --to-destination 172.16.22.100
对于PF:
# Rule 0 (NAT)
#
nat on eth0 proto {tcp udp icmp} from 172.16.22.0/24 to any -> 192.0.2.1
#
# Rule 1 (NAT)
#
rdr on eth0 proto tcp from any to 192.0.2.1 port 80 -> 172.16.22.100 port 80
在规则中使用接口对象与动态地址
示例说明当在策略和NAT规则中使用具有一个或多个IP地址的接口时会发生什么。 让我们来看看界面动态分配地址的情况。 这意味着当fwbuilder策略编译器生成配置脚本时,该地址将被清除。 编译器使用目标防火墙的功能来解决这个问题。 这是接口对象eth0的配置 ,单选按钮“地址被动态分配”。
以下策略规则使用接口eth0 :
这是我们得到的iptables:
getaddr eth0 i_eth0
getaddr6 eth0 i_eth0_v6
# ================ IPv4
# Rule 0 (global)
#
test -n "$i_eth0" && $IPTABLES -A INPUT -p tcp -m tcp -d $i_eth0 --dport 22 -m state --state NEW -j ACCEPT
# ================ IPv6
# Rule 0 (global)
#
test -n "$i_eth0_v6" && $IP6TABLES -A INPUT -p tcp -m tcp -d $i_eth0_v6 --dport 22 -m state --state NEW -j ACCEPT
Shell函数getaddr和getaddr6在脚本前面定义。 生成的脚本在执行时确定接口eth0的 IPv4和IPv6 IP地址,然后使用iptables命令中的值。 如果接口没有地址,则相应的变量将获取一个空字符串作为其值,并且使用它的iptables命令被跳过。
PF允许在规则中使用接口名称并自动获取其当前的IP地址。 这是PF生成的:
# Rule 0 (global)
#
pass in quick inet proto tcp from any to (en0) port 22 keep state
pass out quick inet proto tcp from any to (en0) port 22 keep state
# Rule 0 (global)
#
pass in quick inet6 proto tcp from any to (en0) port 22 keep state
pass out quick inet6 proto tcp from any to (en0) port 22 keep state
由于规则集被配置为IPv4 + IPv6组合,因此我们仍然可以获得IPv4和IPv6两个独立的部分,但是在这两种情况下编译器只是使用接口名称,因为它的实际IP地址是动态的,并且在生成配置时是未知的。
在iptables桥接规则中使用接口对象
在“正常”iptables防火墙的情况下,fwbuilder会在生成的iptables命令中添加“-i eth0”或“-o eth0”参数,以使其匹配接口和方向。 如果在接口对象中打开单选按钮“Bridge port” ,编译器会使用不同的选项使iptables与跨越桥接端口的数据包匹配。 以下是配置为桥接端口的“eth1”接口:
请考虑以下规则在该接口所属的防火墙策略中:
此规则匹配接口“eth1”,并生成以下iptables命令:
$IPTABLES -A FORWARD -m physdev --physdev-in eth1 -s 172.16.22.0/24 -d 172.16.22.255 -m state --state NEW -j ACCEPT
由于接口现在是桥接端口,编译器使用-m physdev --physdev-in eth1来匹配它。