构建更好的防火墙 - Linux HA 防火墙教程
许多企业网络的关键系统(如网络防火墙)都需要冗余的 HA(高可用性)基础设施。本文演示了如何使用开源软件包的组合来构建和管理基于 Linux 的 HA 防火墙对,其中包括对商业防火墙中常见的许多高级功能的支持。
我在本文中用于创建 HA 防火墙的开源软件包集合包括 iptables、conntrackd、keepalived 和 Firewall Builder。图 1 中的网络图显示了将要配置的示例环境。
该示例使用一对运行 Ubuntu Server 10.10 的服务器,它们将被配置为以 Active-Backup(主-备)配置运行。这意味着流量在任何给定时间都将仅通过一个防火墙。更复杂的 Active-Active(主-主)解决方案也是可能的,但超出了本文的范围。
conntrackd 和 keepalived 软件包都使用 apt-get 安装在两台服务器上。由于许多命令需要 root 权限才能运行,因此示例中使用了 root 用户,以使内容简洁明了。
Conntrackd 是由 netfilter.org 项目开发的守护进程,该项目也是 iptables 的开发者。Conntrackd 同步运行 iptables 的两个或多个防火墙之间的活动连接状态。
在 Active-Backup 配置中,如本文中的示例,每次允许连接通过活动防火墙时,有关此连接的信息都会发送到备份防火墙。在发生故障转移的情况下,备份防火墙已经拥有关于活动允许连接的信息,因此在发生故障转移后,现有连接无需重新建立。
这里的示例基于 conntrackd 附带的示例配置文件之一。此配置使用 FTFW 可靠协议来同步防火墙之间的连接数据。还有一个名为 primary-backup.sh 的脚本,它提供了 keepalived 和 conntrackd 之间的集成。对于 Ubuntu,这些示例文件位于 /usr/share/doc/conntrackd/examples/sync/ 目录中。
运行下面列出的命令,将示例配置文件和故障转移脚本复制到 conntrackd 的默认目录 /etc/conntrackd/conntrackd.conf
root@lj-fw-1:/# cd /usr/share/doc/conntrackd/examples/sync root@lj-fw-1:/# gunzip ftfw/conntrackd.conf.gz root@lj-fw-1:/# cp ftfw/conntrackd.conf /etc/conntrackd/ root@lj-fw-1:/# cp primary-backup.sh /etc/conntrackd
打开 /etc/conntrackd/conntrackd.conf 文件进行编辑,并找到文件中名为 Multicast 的部分。编辑此部分中的默认值,以匹配图 1 中所示的示例网络环境。
Multicast { IPv4_address 225.0.0.50 IPv4_interface 192.168.100.2 # IP of eth2 interface, # used for conntrackd synch Interface eth2 Group 3780
接下来,找到配置文件底部的名为 IgnoreTrafficFor 的部分,并编辑此部分中的默认值以匹配示例网络环境
IgnoreTrafficFor { IPv4_address 127.0.0.1 # loopback IPv4_address 192.168.1.2 # eth0 interface IP IPv4_address 10.1.1.2 # eth1 interface IP IPv4_address 192.168.100.2 # eth2 interface IP }
对 lj-fw-2 服务器重复相同的过程,确保为 lj-fw-2 服务器使用正确的接口 IP 地址。
双接口防火墙
此示例使用专用接口进行 conntrackd 同步流量,建议这样做以获得最佳的安全性和性能。如果您的防火墙只有两个网络接口,请修改 conntrackd.conf 的“Multicast”部分,以使用内部接口名称和 IP 地址。
安装软件包后,将创建一个 /etc/init.d/conntrackd 脚本。要测试配置,请启动 conntrackd,然后运行 status 命令以验证它是否正常运行(注意:conntrackd 需要在 lj-fw-1 和 lj-fw-2 防火墙上都启动)
root@lj-fw-1:/# /etc/init.d/conntrackd start root@lj-fw-1:/# conntrackd -s cache internal: current active connections: 1
keepalived 守护进程允许两个或多个服务器共享一个虚拟 IP 地址。只有一台服务器(称为 master)将响应发送到虚拟 IP 地址的数据包。其他服务器处于备份模式,准备在 master 服务器发生故障时接管虚拟 IP 地址。
默认情况下,keepalived 使用配置文件 /etc/keepalived/keepalived.conf。以下是一个非常基本的 keepalived.conf 配置
lj-fw-1 /etc/keepalived/keepalived.conf 文件内容
vrrp_sync_group { group { fw-cluster-eth0 fw-cluster-eth1 } notify_master "/etc/conntrackd/primary-backup.sh primary" notify_backup "/etc/conntrackd/primary-backup.sh backup" notify_fault "/etc/conntrackd/primary-backup.sh fault" } vrrp_instance fw-cluster-eth0 { state MASTER interface eth0 virtual_router_id 20 priority 100 virtual_ipaddress { 192.168.1.1/24 brd 192.168.1.255 dev eth0 } } vrrp_instance fw-cluster-eth1 { state MASTER interface eth1 virtual_router_id 30 priority 100 virtual_ipaddress { 10.1.1.1/24 brd 10.1.1.255 dev eth1 } }
其他选项(如邻居身份验证)也可用。有关高级配置选项的更多信息,请访问 keepalived 网站(请参阅资源)。
lj-fw-2 的配置非常相似,只有少数值被更改以标识此系统充当备份
vrrp_sync_group { group { fw-cluster-eth0 fw-cluster-eth1 } notify_master "/etc/conntrackd/primary-backup.sh primary" notify_backup "/etc/conntrackd/primary-backup.sh backup" notify_fault "/etc/conntrackd/primary-backup.sh fault" } vrrp_instance fw-cluster-eth0 { state BACKUP interface eth0 virtual_router_id 20 priority 50 virtual_ipaddress { 192.168.1.1/24 brd 192.168.1.255 dev eth0 } } vrrp_instance fw-cluster-eth1 { state BACKUP interface eth1 virtual_router_id 30 priority 50 virtual_ipaddress { 10.1.1.1/24 brd 10.1.1.255 dev eth1 } }
keepalived 的优点之一是它提供了 sync_groups 功能,以确保如果 sync_group 中的一个接口从 master 转换为 backup,则 sync_group 中的所有其他接口也转换为 backup。这对于 Active-Backup HA 防火墙部署非常重要,在这些部署中,所有流量都必须流入和流出同一个防火墙。
sync_group 配置包括有关在本地服务器上发生 VRRP 转换到 master、backup 或 fault 状态时要调用的脚本的信息。primary-backup.sh 脚本(之前已复制到 /etc/conntrackd 目录)通知 conntrackd VRRP 状态转换,以便 conntrackd 知道当前哪个防火墙充当 master。
VRRP 使用优先级编号来确定当两个防火墙都处于在线状态时,哪个防火墙应成为 master。优先级编号最高的防火墙被选为 master。由于 lj-fw-1 服务器具有最高的优先级编号,因此只要 lj-fw-1 服务器“存活”,它就会响应发送到虚拟 IP 地址的流量。如果 lj-fw-1 服务器发生故障,lj-fw-2 服务器将自动接管虚拟 IP 地址并响应发送到它的流量。
当使用 VRRP 时,网络上的设备应配置为通过 虚拟 IP 地址 路由。在本示例中,内部 LAN 上通过 HA 防火墙对向外发送数据的设备应配置默认网关为 10.1.1.1。
现在已经配置了两台服务器并准备好充当 HA 防火墙,是时候添加规则了。在大多数 HA 对中,规则在两个防火墙上应该是相同的。虽然这可以通过手动输入 iptables 命令来完成,但这可能难以维护并且容易发生错误。Firewall Builder 使在两个 HA 防火墙服务器上配置和维护同步的规则集变得简单。
Firewall Builder 是一个基于 GUI 的防火墙配置管理应用程序,它支持各种防火墙,包括 iptables。有关下载和安装 Firewall Builder 的信息可以在 Firewall Builder 网站上找到,包括快速入门指南(请参阅资源),该指南提供了 GUI 布局和关键概念的高级概述。
可以使用 Firewall Builder 从单个工作站管理多个防火墙。SSH 和 SCP 用于将生成的防火墙脚本传输到远程防火墙,因此建议在不同的工作站而不是在防火墙服务器之一上运行 Firewall Builder 应用程序。
关于 Firewall Builder
Firewall Builder 最初于 2000 年启动,是一个开源项目,全球有成千上万的用户使用它来管理生产防火墙。除了 iptables 之外,Firewall Builder 还包括对配置 BSD pf、Cisco ASA、PIX 和 FWSM 防火墙、Cisco 路由器访问、ipfw 和 ipfilter 防火墙的支持。商业许可证可用于预构建的 MS Windows 和 Mac OS X 软件包。
本文的重点是使用 Firewall Builder 的集群功能来管理 HA 防火墙对的单个防火墙策略,但让我们首先快速概述一些关键的 Firewall Builder 概念。
对象构成了 Firewall Builder GUI 的基础。对象用于表示常见的防火墙规则元素,例如 IP 网络、IP 主机以及 TCP 和 UDP 协议。Firewall Builder 附带数百个预定义对象,用于常见元素,例如众所周知的 TCP 服务。同一个对象可以用于多个防火墙上的防火墙规则,允许用户定义一次对象并根据需要多次使用它。
在为防火墙对象创建并配置了规则后,Firewall Builder 会生成一个脚本,该脚本将在目标防火墙服务器上运行,以实现 GUI 中定义的防火墙规则。创建此脚本的过程称为编译防火墙规则。生成的防火墙脚本还可以用于管理接口 IP 地址、静态路由和各种系统设置。
有关 Firewall Builder 基础知识的更多信息,请访问 NetCitadel 网站(请参阅资源),其中包括全面的用户指南。
现在,让我们深入了解如何使用 Firewall Builder 配置防火墙集群。为了创建 HA 防火墙对(在 Firewall Builder 中称为集群),您首先需要配置将成为集群成员的各个防火墙对象。
单击主窗口中间的“创建新防火墙”按钮,启动新的防火墙向导,该向导提供一系列对话窗口,引导您完成创建新防火墙对象的过程。
在第一个对话框中设置防火墙名称 (lj-fw-1) 和平台类型 (iptables),然后单击“下一步”按钮。在下一个对话框窗口中保留“手动配置接口”的默认设置,然后单击“下一步”按钮。最后一个对话框窗口是定义防火墙接口的位置。按照下面显示的步骤为 lj-fw-1 防火墙添加接口。
步骤 1:单击绿色的 + 号以创建新接口
将接口名称设置为“eth0”。
将接口标签设置为“outside”。
单击“添加地址”按钮。
输入 192.168.1.2,子网掩码为 255.255.255.0。
步骤 2:单击绿色的 + 号以创建新接口,并重复步骤 1 中的步骤以配置 eth1(“eth1”、“inside”、10.1.1.2、255.255.255.0)。
步骤 3:单击绿色的 + 号以创建新接口,并重复步骤 1 中的步骤以配置 eth2(“eth2”、“synch”、192.168.100.2、255.255.255.0)。
步骤 4:单击绿色的 + 号以创建新接口,并重复步骤 1 中的步骤以配置 lo(“lo”、“loopback”、127.0.0.1、255.0.0.0)。
图 2 显示了在定义第一个接口 eth0 后,接口对话框窗口的示例。配置完所有接口后,单击“完成”按钮以创建防火墙对象。
新创建的防火墙对象将显示在左侧对象树面板中的对象树中。右键单击 lj-fw-1 对象,然后从菜单中选择“复制→放置在库用户中”。这将在对象树中创建 lj-fw-1 的精确副本,并在屏幕底部的编辑器面板中打开它进行编辑。
将新创建的防火墙对象重命名为 lj-fw-2。在显示的关于更改所有子对象名称的警告消息上单击“是”。lj-fw-2 防火墙对象将显示在对象树中,其中所有子对象都已展开。
复制防火墙时,新防火墙上的接口 IP 地址与原始防火墙上的接口 IP 地址相同。更新接口 IP 地址以匹配 lj-fw-2 防火墙上 eth0 接口的正确 IP 地址,如图 3 所示。对接口 eth1 和 eth2 的 IP 地址重复此过程。
最后一步是确定将用于管理每个 lj-fw-1 和 lj-fw-2 防火墙的接口。安装程序稍后将使用此信息来确定要用于连接到防火墙的 IP 地址。双击 lj-fw-1 防火墙上名为“eth1”的接口对象以打开它进行编辑,然后在编辑器面板中选中标记为“管理接口”的复选框。对 lj-fw-2 防火墙重复此过程。
现在已经创建了防火墙对象,下一步是创建一个新的集群对象,并将 lj-fw-1 和 lj-fw-2 防火墙作为集群的成员。右键单击对象树中的“集群系统”文件夹,然后选择“新建集群”菜单项。这将启动新的集群向导,该向导引导您完成创建新防火墙集群所需的步骤。
在第一个对话框窗口中,输入集群名称 (lj-fw-cluster),然后选择 lj-fw-1 和 lj-fw-2 作为集群成员(确保 lj-fw-1 是主节点)。单击“下一步”按钮。
在下一个对话框窗口中保留默认设置,然后单击“下一步”按钮。
第三个对话框窗口(图 4)是定义故障转移协议和虚拟 IP 地址的位置。对于对话框窗口顶部的每个接口选项卡,根据表 1 中的信息输入值。
表 1. 集群接口配置参数
接口 | 标签 | 故障转移协议 | 虚拟 IP | 子网掩码 |
---|---|---|---|---|
eth0 | cluster-outside | VRRP | 192.168.1.1 | 255.255.255.0 |
eth1 | cluster-inside | VRRP | 10.1.1.1 | 255.255.255.0 |
eth2 | cluster-synch | 无 | 不适用 | 不适用 |
lo | cluster-loopback | 无 | 不适用 | 不适用 |
配置完所有接口后,单击“下一步”。在下一个对话框窗口中,保留“不使用任何规则,我将创建新的策略和 NAT 规则”的默认设置,然后单击“下一步”。最后一个对话框窗口将显示集群配置的摘要。查看它,如果一切正确,请单击“完成”以创建集群对象。
创建集群后,它将显示在对象树中。双击新创建的 lj-fw-cluster 对象下的“状态同步组”对象。状态同步组定义了用于 conntrackd FTFW 同步流量的接口。单击编辑器面板底部的“管理成员”按钮。在出现的对话框窗口中,单击 lj-fw-1 防火墙下方的 eth2 接口,然后单击右箭头以将该接口添加为集群成员。对 lj-fw-2 防火墙的 eth2 接口重复此过程。单击“确定”以接受更改。
双击对象树中 lj-fw-cluster 对象下的“策略”对象。“策略”是配置防火墙规则的位置。单击窗口顶部的绿色 + 号以添加新规则。默认情况下,新的防火墙规则设置为拒绝所有内容。通过从对象树中拖放对象到规则的字段中来编辑规则。
对于此示例,让我们创建三个简单的防火墙规则和一个 NAT 规则。第一个防火墙规则应该是允许防火墙使用环回接口与自身通信的规则。这是必需的,因为许多应用程序依赖于对环回的非过滤访问以进行进程间通信。
从对象树中的 lj-fw-cluster 中拖放名为“lo”的接口对象到右侧规则的“接口”字段。右键单击规则的“操作”字段,然后选择“接受”。最后,右键单击规则的“选项”字段,然后选择“日志记录关闭”。完成此操作后,规则应如图 5 所示。
请注意,规则中使用的 lo 接口对象来自集群对象,而不是单个防火墙的环回接口对象。当 Firewall Builder 为每个单独的防火墙生成防火墙配置脚本时,它会自动将集群接口对象替换为该防火墙的本地接口值。
接下来的两个规则使用名为“内部 LAN”的网络对象,该对象已创建,值为 10.1.1.0/24。要创建新的网络对象,请双击对象树中的“对象”文件夹,右键单击“网络系统”文件夹,然后选择“新建网络”。在屏幕底部的编辑器面板中填写对象名称和网络值。
右键单击第一个规则,然后选择“在下方添加新规则”以向防火墙添加另一个规则。第二个防火墙规则将允许来自“内部 LAN”对象的流量使用 SSH 访问内部 eth1 接口上的防火墙。将“内部 LAN”对象从对象树拖放到新创建规则的“源”字段。将 eth1 接口从 lj-fw-cluster 集群拖放到“目标”字段。
Firewall Builder 附带数百个预定义对象,包括大多数众所周知的协议,如 SSH。切换到标准对象库以访问预定义对象。图 6 显示了对象树顶部的库选择菜单的位置。
要在标准库中快速找到 SSH 对象,请键入ssh到对象树顶部的过滤器框中。将 ssh 对象拖放到防火墙规则的“服务”字段。记住通过单击过滤器框旁边的 X 来清除过滤器。
切换回用户库,并将 eth1 对象从 lj-fw-cluster 对象拖放到规则的“接口”字段。右键单击“方向”字段,然后选择“入站”。最后,右键单击“操作”字段并将其设置为“接受”。如果您想记录到防火墙的 SSH 连接,请将“选项”字段设置为“日志记录开启”;否则,将其设置为“日志记录关闭”。
按照相同的过程创建第三个规则,该规则应允许内部 LAN 使用 HTTP 和 HTTPS 通过 eth0 “外部”接口访问 Internet Web 服务器。图 7 显示了所有三个防火墙规则的策略配置。
请注意,我们没有输入任何规则来允许防火墙之间的 VRRP 或 conntrackd 流量。Firewall Builder 会根据集群的配置自动生成这些规则。
最后一步是配置 NAT 规则,该规则会将来自内部 LAN 并发往 Internet 的所有流量的源 IP 地址转换为防火墙的外部虚拟 IP 地址。使用虚拟 IP 地址作为转换后的源可确保在从主防火墙故障转移到备份防火墙时,通过防火墙的流量将继续流动。
双击 hq-fw-cluster 对象下的 NAT 子对象,打开 NAT 表进行编辑。就像在策略规则中一样,单击绿色的 + 图标以向 NAT 配置添加新规则。
将“内部 LAN”对象从对象树拖放到 NAT 规则的“原始源”字段,然后将 eth0 “cluster-outside”接口从 lj-fw-cluster 对象拖放到“转换后的源”字段。最终的 NAT 规则应如图 8 所示。
该过程的最后一步是生成防火墙脚本并将它们安装在防火墙集群成员上。为了使文章简短,我使用 root 用户在防火墙服务器上安装 Firewall Builder 生成的防火墙脚本,但 Firewall Builder 也支持使用具有适当 sudo 权限的非 root 用户。这在在线用户指南中有所介绍。
在可以在集群成员防火墙上安装规则之前,请在 lj-fw-1 和 lj-fw-2 服务器上创建一个名为 /etc/fw 的目录。这是 Firewall Builder 将安装生成的防火墙脚本的默认位置。
如前所述,Firewall Builder 将规则转换为将在防火墙上运行的防火墙脚本的过程称为编译规则。要编译并使用内置安装程序来部署规则,请单击 Firewall Builder 顶部的“安装”按钮以启动安装向导。
单击集群名称旁边的复选框,并确保为 lj-fw-1 和 lj-fw-2 选中“安装”复选框。如果配置中存在任何错误,编译器将显示这些错误;否则,您将看到一个对话框窗口(图 9),显示集群已成功编译。编译集群后,将为集群的每个成员创建一个防火墙,并将其本地保存在运行 Firewall Builder 的计算机上。
单击此窗口中的“下一步”将启动安装程序对话框窗口(图 10)。集群中的每个防火墙都将有自己的安装程序窗口。安装程序使用 SCP 将为集群成员生成的防火墙脚本传输到防火墙。复制防火墙脚本后,Firewall Builder 使用 SSH 登录以运行该脚本。安装程序包括以详细模式运行的选项,该模式显示在远程防火墙上运行的每个命令。安装完成后,将出现 lj-fw-2 的新安装程序,并重复相同的过程。
本文仅粗略地介绍了使用 Firewall Builder 配置防火墙集群。您可以在 Firewall Builder 用户指南中找到更多信息,包括如何在单个集群成员上安装自定义策略,该指南可在 NetCitadel 网站上在线获取。
资源
Netfilter: www.netfilter.org
Conntrackd 用户手册: conntrack-tools.netfilter.org/manual.html
Keepalived: www.keepalived.org
NetCitadel 的 Firewall Builder: www.fwbuilder.org
NetCitadel 的 Firewall Builder 快速入门指南: www.fwbuilder.org/4.0/quick_start_guide.html
Mike Horn 是 NetCitadel LLC 的联合创始人,该公司开发和支持 Firewall Builder。他在网络和安全技术领域工作了 15 年以上,曾在从小型的初创公司到大型全球互联网服务提供商等公司工作。