PacketFence 再探
在我们 2007 年 4 月刊的 LJ 首篇 PacketFence 文章中,我们介绍了出色的网络访问控制 (NAC) 解决方案,它可以与市场上最好的解决方案相媲美。当时,我们介绍了基于 ARP 的隔离,这种隔离对于小型网络来说效果相对较好。
不幸的是,基于 ARP 的隔离无法真正扩展到数千个节点,并且相对容易通过简单的静态 ARP 表绕过。因此,我们在 Inverse 决定通过添加基于 VLAN 的隔离模式来改进 PacketFence。此项新增功能与其他增强功能相结合,使该解决方案适用于大规模网络。
PacketFence 的 VLAN 隔离的目的是根据设备的 MAC 地址、注册状态和违规状态,将连接到网络的任何设备分配到适当的 VLAN。一个简单的场景是,每个新设备都属于注册 VLAN,已注册且无违规的设备属于“正常” VLAN,而有未解决违规的设备属于隔离 VLAN。如果隔离 VLAN 和注册 VLAN 未路由到“正常” VLAN,则 PacketFence 会将新设备以及任何违反网络策略的设备与常规网络完全隔离,从而有效地防止任何攻击或病毒传播。当然,实际网络要复杂一些,VoIP 电话可能不会与常规计算机或服务器位于同一 VLAN 中。但是,无论您的网络 VLAN 设计如何,PacketFence 都能胜任这项任务。
为了使 VLAN 隔离代码正常工作,您必须使用可管理的交换机。特别是,交换机必须提供远程更改端口 VLAN 的方法,并且必须能够向 PacketFence 发送 SNMP(简单网络管理协议)陷阱。SNMP 陷阱包括交换机的 IP 地址;端口号,以及根据陷阱类型,可能包括端口状态(例如,设备已连接时的“up”和断开连接时的“down”);设备的 MAC 地址(主要用于 MAC 通知和安全违规陷阱);连接到交换机端口的 MAC 数量等等。
当交换机向 PacketFence 发送 SNMP 陷阱时,snmptrapd 守护进程接收它并将其写入日志文件 /usr/local/pf/contrib/log/snmptrapd.log。PacketFence 的 setVlanOnTrapd 守护进程持续读取此日志文件,并为每个新陷阱确定是否需要更改端口的 VLAN。如果是这种情况,它会向交换机发送相应的 SNMP 命令。
VLAN 隔离的一个关键部分是了解设备何时连接到网络或从网络断开连接。在 2006 年初,我们开始开发 VLAN 隔离代码,首先支持两个非常基本的 SNMP 陷阱:linkup 和 linkdown 陷阱。绝大多数交换机供应商都支持这两种陷阱,这使得我们的实现可以立即在各种网络硬件上使用。不幸的是,仅仅依赖 linkup 和 linkdown 陷阱也有其缺点,从性能和功能角度来看,包括
由于交换机需要在端口上看到一些网络流量才能确定连接设备的 MAC 地址,因此 linkup 陷阱无法包含任何 MAC 地址。因此,PacketFence 的 setVlanOnTrapd 必须在每次 linkup 陷阱之后重复查询交换机,以确定新连接设备的 MAC 地址,这会引入一些开销。
大多数 VoIP 电话都包含一个内置交换机来连接 PC。当您连接电话时,交换机会发送 linkup 陷阱;当您将 PC 连接到电话时,交换机不会发送第二个 linkup 陷阱。因此,在这种部署场景中,仅依赖 linkup 和 linkdown 陷阱无法为 setVlanOnTrapd 的正确工作提供足够的信息。
解决这些问题的一种可能的解决方案是 MAC 通知陷阱。每次交换机在端口上学习到 MAC 地址时,它都会发送一个“MAC learned”陷阱,其中包含 MAC 地址。当然,PacketFence 现在也支持 MAC 通知陷阱。
除了在设备连接到网络时为其分配适当的 VLAN 之外,PacketFence 还会在设备违反网络策略时隔离已连接到网络的设备。有两种不同的选项可用
PacketFence 可以通过管理方式关闭交换机端口并在不久后重新打开它,从而短暂地断开设备与网络的连接。在这种情况下,交换机发送一个 linkdown 陷阱,然后是一个 linkup 陷阱。当 PacketFence 收到 linkup 陷阱时,它会确定该设备存在未解决的违规行为,并将端口切换到隔离 VLAN。在计算机端,网络适配器注意到网络链路已断开,并自动续订其 IP 地址——这次是在隔离 VLAN 中。然后,PacketFence 的 captive portal 会通知用户已被隔离。
当使用 VoIP 电话时,以管理方式关闭交换机端口可能会有问题,因为这样做可能会结束通话。如果 PacketFence 可以访问隔离 VLAN,则实际上不需要关闭端口。更改端口的 VLAN 并进行一些 ARP 欺骗通常足以使用户可以使用 captive portal。
到目前为止,我们只提到了注册 VLAN 和隔离 VLAN,但 PacketFence 使用第三个 VLAN,即 MAC 检测 VLAN。此 VLAN 是每个端口的默认 VLAN,不得包含对任何 DHCP 服务器的访问权限,并且可以被视为空 VLAN。它的存在是为了允许交换机在新建连接的设备从 DHCP 服务器获得响应之前学习该设备的 MAC 地址。
从 www.packetfence.org 安装 PacketFence 1.7。如果您使用的是 Red Hat EL5 或 CentOS5,最简单的方法是安装官方 RPM。
在本示例中,我们在 Cisco Catalyst 2960 交换机(IP 地址 192.168.0.3)上设置 VLAN 隔离。PacketFence 服务器的 IP 地址为 192.168.0.10。让我们进一步假设您正在使用以下 VLAN,并且这些 VLAN 已经在您的交换机上创建
“正常” VLAN
隔离 VLAN
注册 VLAN
MAC 检测 VLAN
使用以下命令在交换机上全局启用 SNMP 陷阱
snmp-server enable traps snmp authentication linkdown linkup snmp-server enable traps mac-notification snmp-server host 192.168.0.10 version 2c public mac-notification snmp mac-address-table notification interval 0 mac-address-table notification mac-address-table aging-time 300
然后,使用以下命令配置 PacketFence 应处理的每个接入端口
switchport access vlan 4 switchport mode access snmp trap mac-notification added spanning-tree portfast
编辑 VLAN 隔离配置文件 /usr/local/pf/conf/switches.conf,使其包含正确的 SNMP community string。然后,按如下方式调整 VLAN 定义
vlans = 1,2,3,4 normalVlan = 1 isolationVlan = 2 registrationVlan = 3 macDetectionVlan = 4
最后,为您的交换机添加一个新部分
[192.168.0.3] ip = 192.168.0.3 type = Cisco::Catalyst_2960 mode = production uplink = 23,24
接下来,您可以执行 PacketFence 和交换机之间的通信测试
/usr/local/pf/bin/pfcmd_vlan -getVlan -switch 192.168.0.3 -ifIndex 10001
下一个测试是确定交换机是否可以向 PacketFence 发送 SNMP 陷阱。启动 snmptrapd
service snmptrapd start
并观察日志文件
tail -f /usr/local/pf/logs/snmptrapd.log
每次设备连接到网络和从网络断开连接时,您都应该在日志文件中看到新行。
现在,配置 PacketFence 对 VLAN 1、2 和 3 的访问。将 PacketFence 插入的交换机端口的配置设置为“trunk 模式”,并允许 VLAN 1 中的数据包在不标记的情况下通过交换机。在 PacketFence 服务器上,添加两个新的 NIC,用于读取和写入 VLAN 2 和 3 的 802.1q 标记数据包。不要忘记将这些新的 NIC 添加到您的配置文件 /usr/local/pf/conf/pf.conf。
为了简化安装,在 PacketFence 框上为 VLAN 2 和 3 配置 DHCP 服务。DHCP 服务器应将其自身(特定于 VLAN)的 IP 地址作为网关和 DNS 服务器返回。最后但并非最不重要的一点是,为 VLAN 2 和 3 设置一个“伪造” DNS 服务,该服务使用其自身的 IP 地址响应所有查询。现在,验证连接到注册 VLAN 的主机是否能够获得 IP 地址,以及无论它发送什么 DNS 查询,PacketFence 都以其自身的 IP 回答。
如果所有这些测试都运行良好,您可以启动 setVlanOnTrapd
service setVlanOnTrapd start
并查看日志文件以验证您的设备在连接到交换机后是否分配到正确的 VLAN
tail -f /usr/local/pf/logs/setvlanontrapd.log
此设置对于已注册的设备应该是透明的,因为它们最终会进入“正常” VLAN;未注册的设备将被分配到注册 VLAN,在那里它们可以访问的只是 PacketFence 服务器,该服务器将显示带有注册屏幕的 captive portal。
PacketFence 也与无线网络集成得非常好。与其有线对应物交换机一样,无线接入点 (AP) 需要实现一些特定功能才能使集成完美运行。特别是,AP 需要支持以下功能
多个 SSID,每个 SSID 内有多个 VLAN。
针对 RADIUS 服务器的身份验证。
动态 VLAN 分配(通过 RADIUS 属性)。
SNMP 取消身份验证陷阱。
关联站点的取消身份验证。
然后,我们可以在 AP 上配置两个 SSID,第一个 SSID 保留给访客和未注册的客户端。在此 SSID 中,通信将不会加密,用户将连接到注册 VLAN 或访客 VLAN(取决于其注册状态)。第二个 SSID 将允许为注册用户进行加密通信。此处的 VLAN 是“正常” VLAN 和隔离 VLAN(如果 MAC 存在未解决的违规行为)。
在本示例中,我们配置 Cisco 1242 AP(IP 地址 192.168.0.4)。其他供应商的 AP 的配置类似。首先,在 AP 上定义正常 VLAN、隔离 VLAN、注册 VLAN 和访客 VLAN,以及适当的有线和无线接口,如隔离 VLAN 所示
dot11 vlan-name isolation vlan 2 interface FastEthernet0.2 encapsulation dot1Q 2 no ip route-cache bridge-group 253 no bridge-group 253 source-learning bridge-group 253 spanning-disabled interface Dot11Radio0.2 encapsulation dot1Q 2 no ip route-cache bridge-group 253 bridge-group 253 subscriber-loop-control bridge-group 253 block-unknown-source no bridge-group 253 source-learning no bridge-group 253 unicast-flooding bridge-group 253 spanning-disabled
然后,创建两个 SSID
dot11 ssid WPA2 vlan 2 backup normal authentication open eap eap_methods authentication key-management wpa accounting acct-methods mbssid guest-mode dot11 ssid MACauth vlan 3 backup visitor authentication open mac-address mac_methods accounting acct_methods mbssid guest-mode
配置 RADIUS 服务器(我们在此假设 FreeRADIUS 服务器和 PacketFence 服务器位于同一台机器上)
radius-server host 192.168.0.10 auth-port 1812 ↪acct-port 1813 key secretKey aaa group server radius rad_eap server 192.168.0.10 auth-port 1812 acct-port 1813 aaa authentication login eap_methods group rad_eap aaa group server radius rad_mac server 192.168.0.10 auth-port 1812 acct-port 1813 aaa authentication login mac_methods group rad_mac
启用 SNMP 取消身份验证陷阱
snmp-server enable traps deauthenticate snmp-server host 192.168.0.10 public deauthenticate
最后,激活无线电上的 SSID
interface Dot11Radio0 encryption vlan 1 mode ciphers aes-ccm encryption vlan 2 mode ciphers aes-ccm ssid WPA2 ssid MACauth
现在,使用 Wi-Fi 卡检查您是否真的可以看到两个新的 SSID。您还无法连接到它们,因为 RADIUS 服务器尚未启动并运行。
通过在 /etc/raddb/clients.conf 的末尾添加以下行,开始配置 FreeRADIUS 服务器
client 192.168.0.3 { secret = secretKey shortname = AP1242 }
在 /etc/raddb/eap.conf 中,在 eap {} 部分的开头将默认 eap 类型设置为 peap
default_eap_type = peap
并且,在 tls {} 部分中设置您的加密密钥。
然后,更新 /etc/raddb/radiusd.conf,首先通过将以下行添加到 modules {} 部分
perl { module = ${confdir}/rlm_perl_packetfence.pl }
然后,在 authorize {} 部分的末尾添加“perl”。脚本 /etc/raddb/rlm_perl_packetfence.pl 使用 Calling-Station-Id RADIUS 请求属性,其中包含无线站点的 MAC 地址,以确定其注册和违规状态。基于此信息,它设置 Tunnel-Medium-Type、Tunnel-Type 和 Tunnel-Private-Group-ID RADIUS 回复属性。AP 在收到这三个属性后,会将无线站点限制到指定的 VLAN 中。
要编辑的最后一个文件是 /etc/raddb/users,以定义非 EAP 消息默认应导致身份验证接受
DEFAULT EAP-Message !* "", Auth-Type := Accept
然后,添加一个本地测试用户,使用
testUser User-Password == "testPwd"
现在,在调试模式下启动 FreeRADIUS
radiusd -x
尝试使用您的 Wi-Fi 卡连接到两个新 SSID 之一,您将看到 FreeRADIUS 收到的数据包以及生成的响应。
同样值得注意的是,您在此处学习到的关于将 PacketFence 与无线网络结合使用的概念与在有线网络上使用 802.1x 的概念相同,PacketFence 当然也支持 802.1x。
我们在设计 VLAN 隔离功能时,从一开始就考虑到了可扩展性。所有受支持的交换机都通过 Perl 对象表示,并且我们广泛使用继承。例如
在最高级别,您拥有 pf::SNMP 对象,该对象定义了通用功能,例如 SNMP 会话创建和删除、数据库连接以及一些标准化的 SNMP 查询。
在下一级别是特定于供应商的对象,例如 pf::SNMP::Cisco 和 pf::SNMP::Nortel。它们包括解析 SNMP 陷阱的必要功能,并且在大多数情况下,还包括读取和写入端口 VLAN 分配的功能。
最后,在最低级别,是特定于型号的对象,仅包含特定于型号的代码。
这种架构简化了添加对来自已支持供应商的新产品的支持;它归结为仅重新定义非常有限数量的方法,并且可以在几个小时内完成。
正如您在本文中所看到的,PacketFence 以有效的方式保护有线和无线网络。在两个网络上提供相同的安全级别并使用相同的 NAC 解决方案使 PacketFence 成为必不可少的安全工具之一。
资源
Ludovic Marcotte 和 Dominik Gehl 撰写的“PacketFence”,LJ,2007 年 4 月:www.linuxjournal.com/article/9551
PacketFence: www.packetfence.org
Inverse—PacketFence 基于 VLAN 的隔离模式: www.inverse.ca/contributions/packetfence.html
Net-SNMP—snmptrapd 守护进程: www.net-snmp.org
FreeRADIUS 项目: www.freeradius.org
Regis Balzard (rbalzard@inverse.ca) 拥有法国鲁昂高等电气工程师学院 (ESIGELEC) 的计算机工程学位。他目前是 Inverse, Inc. 的系统架构师,Inverse, Inc. 是一家位于蒙特利尔市中心的 IT 咨询公司,专门从事基于 PacketFence 和 SOGo 等免费和开源组件的基础设施部署。
Dominik Gehl (dgehl@inverse.ca) 拥有蒙特利尔大学的计算机科学硕士学位。他目前是 Inverse, Inc. 的系统架构师,Inverse, Inc. 是一家位于蒙特利尔市中心的 IT 咨询公司,专门从事基于 PacketFence 和 SOGo 等免费和开源组件的基础设施部署。