管理防火墙
IBM Cloud® Virtual Router Appliance (VRA) 能够处理防火墙规则,保护通过设备路由的 VLAN。
VRA 中的防火墙可以分为两个步骤:
- 定义一组或多组规则。
- 将一组规则应用于接口或区域策略。 一个区域包含一个或多个网络接口。 为从一个区域到另一个区域的流量定义了区域策略。
创建防火墙规则后对其进行测试非常重要,这可确保规则按预期工作,并且确保新规则不会限制对设备的管理访问权。
在 dp0bond1
接口上处理规则时,建议使用 dp0bond0
连接到设备。 也可以选择使用智能平台管理接口 (IPMI) 连接到控制台。
无状态和有状态
缺省情况下,防火墙是无状态的,但如果需要,也可以将其配置为有状态。 无状态防火墙需要针对双向流量的规则,而有状态防火墙用于跟踪连接并自动允许已接受流的返回流量。 要配置有状态防火墙,必须指明要以有状态方式操作的规则。
要启用对 tcp
、udp
或 icmp
流量的“有状态”跟踪,请运行以下命令:
set security firewall global-state-policy icmp
set security firewall global-state-policy tcp
set security firewall global-state-policy udp
请注意,global-state-policy
命令仅跟踪与显式设置相应协议的防火墙规则相匹配的流量状态。 例如:
set security firewall name GLOBAL_STATELESS rule 1 action accept
由于 GLOBAL_STATELESS
未指定 protocol tcp
,因此 global-state-policy tcp
命令不会应用于此规则。
set security firewall name GLOBAL_STATEFUL_TCP rule 1 action accept
set security firewall name GLOBAL_STATEFUL_TCP rule 1 protocol tcp
在本例中,protocol tcp
已显式定义。 global-state-policy tcp
命令将对与 GLOBAL_STATEFUL_TCP
的规则 1 相匹配的流量启用有状态跟踪。
要使单个防火墙规则为“有状态”,请运行以下命令:
set security firewall name TEST rule 1 allow
set security firewall name TEST rule 1 state enable
这将对所有可以进行有状态跟踪且与 TEST
的规则 1 相匹配的流量启用有状态跟踪,而不管 global-state-policy
命令是否存在。
用于协助有状态跟踪的 ALG
有些协议(如 FTP)所利用的会话更为复杂,一般的有状态防火墙操作难以跟踪。 有些预配置的模块支持对这些协议进行有状态管理。
建议禁用这些 ALG 模块,除非必须使用这些模块才能成功使用相应协议。
set system alg ftp 'disable'
set system alg icmp 'disable'
set system alg pptp 'disable'
set system alg rpc 'disable'
set system alg rsh 'disable'
set system alg sip 'disable'
set system alg tftp 'disable'
防火墙规则集
防火墙规则可分组为多个命名集,这样可更轻松地将规则应用于多个接口。 每个规则集都有一个关联的缺省操作。 请考虑以下示例:
set security firewall name ALLOW_LEGACY default-action accept
set security firewall name ALLOW_LEGACY rule 1 action drop
set security firewall name ALLOW_LEGACY rule 1 source address network-group1
set security firewall name ALLOW_LEGACY rule 2 action drop
set security firewall name ALLOW_LEGACY rule 2 destination port 23
set security firewall name ALLOW_LEGACY rule 2 log
set security firewall name ALLOW_LEGACY rule 2 protocol tcp
set security firewall name ALLOW_LEGACY rule 2 source address network-group2
在规则集 ALLOW_LEGACY
中,定义了两条规则。 第一个规则用于丢弃源自名为 network-group1
的地址组的所有流量。 第二种方法会丢弃和记录任何从名为 network-group2
的地址组发送到 telnet 端口 (tcp/23
) 的流量。 默认操作表示接受任何其他操作。 一个好的做法是只允许必要的流量,然后使用规则集的缺省操作来阻塞其余的流量。
允许访问数据中心
IBM Cloud 托管许多子网 (专用服务网络),这些子网为在其数据中心内运行的客户机服务器提供服务和支持。 例如,DNS 解析器服务在 10.0.80.11
和 10.0.80.12
上运行,缺省 NTP 服务器在 10.0.77.54
上运行。 这三个都在 10.0.64.0/29
服务网络中。 在供应和支持期间会使用其他子网。 您可以在 本主题 中找到数据中心内使用的专用服务网络。
通过在防火墙规则集开头放置正确的 SERVICE-ALLOW
规则以及操作 accept
,可允许访问数据中心。 必须应用该规则集的位置取决于实现的路由和防火墙设计。
建议将防火墙规则放入产生重复工作最少的位置。 例如,在 dp0bond0
上允许后端子网入站流量所涉及的工作,要少于对每个 VLAN 虚拟接口允许后端子网出站流量。
按接口防火墙配置
在 VRA 上配置防火墙的一种方法是对每个接口应用防火墙规则集。 在这种情况下,接口可以是内部 VLAN 接口 (VIF) (例如,dp0bond0.1303
),其中一个外部接口 (dp0bond0
(专用) 或 dp0bond1
(公共)) 或隧道接口 (例如,tun0
或 vti0
)。 每个接口有三种可能的防火墙分配:
in
- 防火墙过滤进入接口的数据包。 这些数据包既可以通过 VRA 传输,也可以以 VRA 为目的地。
out
- 防火墙过滤离开接口的数据包。 这些数据包既可以通过 VRA 传输,也可以以 VRA 为目的地。
local
- 防火墙会对目的地为 VRA 的数据包进行检查。 回送接口 lo
可用于过滤任何接口上的本地入站流量。 应用于 local
的防火墙过滤器和规则集将在作为 in
应用于任何接口的任何防火墙规则集之后进行处理。
一个接口可以在每个方向上应用多个规则集。 规则集按配置顺序应用。 请注意,如果防火墙流量源自的 VRA 设备使用了逐个接口应用的防火墙,那么无法做到这一点。
例如,要将 ALLOW_LEGACY
规则集分配给 dp0bond1
接口的 in
选项,需要使用配置命令:
set interfaces bonding dp0bond1 firewall in ALLOW_LEGACY
控制平面管制 (CPP)
控制平面管制 (CPP) 通过允许您配置分配给所需接口的防火墙策略,并将这些策略应用于进入 IBM Cloud® Virtual Router Appliance 的包,从而防御对 VRA 的攻击。
在分配给任何类型的 VRA 接口(例如,数据平面接口或回送)的防火墙策略中使用 local
关键字时,都会实现 CPP。 与应用于遍历 VRA 的包的防火墙规则不同,针对进出控制平面的流量的防火墙规则,其缺省操作为 Allow
。 如果不希望执行缺省行为,用户必须添加显式丢弃规则。
VRA 提供基本的 CPP 规则集作为模板。 可以通过运行以下命令,将其合并到自己的配置中:
vyatta@vrouter# merge /opt/vyatta/etc/cpp.conf
合并此规则集后,将添加名为 CPP
的新防火墙规则集,并将其应用于回送接口。 建议修改此规则集以适合您的环境。
请注意,CPP 规则不能是有状态的,并且仅应用于入口流量。
基于区域的防火墙配置
在基于区域的防火墙配置中,将一个或多个接口分配给一个区域 (尽管不能将一个接口分配给多个区域),并将防火墙规则集从一个区域应用到另一个区域。 对于单专区策略,当流量从第一个专区传递到第二个专区时,将对流量进行过滤,并且仅在出站/出口接口上进行过滤。 区域会丢弃未显式允许的所有传入流量。
接口既可以属于一个区域,也可以按接口进行防火墙配置,但不能同时进行两种配置。
考虑以下有三个部门的办公场景,每个部门都有自己的 VLAN:
- 部门 A - VLAN 10 和 20(接口
dp0bond1.10
和dp0bond1.20
) - 部门 B - VLAN 30 和 40(接口
dp0bond1.30
和dp0bond1.40
) - 部门 C - VLAN 50(接口
dp0bond1.50
)
可以为每个部门创建一个区域,然后可以将该部门的接口添加到该区域。 下面的例子说明了这一点:
set security zone-policy zone DEPARTMENTA interface dp0bond1.10
set security zone-policy zone DEPARTMENTA interface dp0bond1.20
set security zone-policy zone DEPARTMENTB interface dp0bond1.30
set security zone-policy zone DEPARTMENTB interface dp0bond1.40
set security zone-policy zone DEPARTMENTC interface dp0bond1.50
commit
命令会将每个区域作为一个接口填充,并且缺省丢弃规则将废弃尝试从外部进入该区域的所有流量。 在此示例中,VLAN 10 和 20 可以传递流量,因为它们位于同一区域 (DEPARTMENTA
) 中,但 VLAN 10 和 VLAN 30 无法传递流量,因为 VLAN 30 位于不同区域 (DEPARTMENTB
) 中。
每个区域中的接口都可以自由传递流量,并且可为区域之间的交互定义规则。 可以从离开一个区域而进入另一个区域的角度来配置规则集。
以下命令显示有关如何配置规则的示例:
set security zone-policy zone DEPARTMENTC to DEPARTMENTB firewall ALLOW_PING
这条命令将 DEPARTMENTC
到 DEPARTMENTB
的过渡与名为 ALLOW_PING
的规则集关联起来。 从 DEPARTMENTC
区域进入 DEPARTMENTB
区域的流量将根据此规则集进行检查。
重要的是要明白,从 DEPARTMENTC
区进入 DEPARTMENTB
区的这一赋值并不表示反向赋值。 如果没有任何规则允许从 DEPARTMENTB
区域进入 DEPARTMENTC
区域的流量,则流量(ICMP 回复)将不会返回 DEPARTMENTC
中的主机。
ALLOW_PING
将作为 防火墙应用于 区域的接口( 和 )。out
DEPARTMENTB``dp0bond1.30
dp0bond1.40
由于这是由区域策略安装的,因此只有来自源区域接口 (dp0bond1.50
) 的流量才会根据规则集进行检查。
基于区域的防火墙示例
以下示例详细说明了用于监视和调试所有流量的防火墙环境,并对 VRA 进行了处理。
将 "log" 添加到规则 1 将严重影响性能,并且仅应用于调试。
切勿在公共接口范围内保持开放,如本示例中所示。
set security zone-policy zone Public-and-VTI interface dp0bond1
set security zone-policy zone Public-and-VTI interface vti2
set security zone-policy zone Public-Inside interface dp0bond1.807
set security zone-policy zone Private-Outside interface dp0bond0
set security zone-policy zone Private-Inside interface dp0bond0.829
#ruleset to allow all statefully and log every packet
set security firewall name AllowAllLogALL rule 1 action accept
set security firewall name AllowAllLogALL rule 1 log
set security firewall name AllowAllLogALL rule 1 state enable
#security policy pair between public/IPSec and private network servers
set security zone-policy zone Public-and-VTI to Private-Inside firewall AllowAllLogALL
set security zone-policy zone Private-Inside to Public-and-VTI firewall AllowAllLogALL
#security policy pair between public/IPSec and public network servers
set security zone-policy zone Public-and-VTI to Public-Inside firewall AllowAllLogALL
set security zone-policy zone Public-Inside to Public-and-VTI firewall AllowAllLogALL
#security policy pair between service networks/private outside and private network customer servers
set security zone-policy zone Private-Outside to Private-Inside firewall AllowAllLogALL
set security zone-policy zone Private-Inside to Private-Outside firewall AllowAllLogALL
对防火墙规则进行故障诊断
您可以对基于接口的防火墙配置和基于区域的防火墙配置进行故障诊断。
对基于接口的防火墙配置进行故障诊断
要开始检查和故障诊断,请运行以下命令以了解策略的配置方式:
- 要收集应用于每个接口的防火墙规则集以及方向,请运行
show configuration commands | grep firewall | grep interface
。 - 通过使用步骤 1 的输出,您可以找到应用于流中尝试通过运行
show configuration commands | grep -iE '<name of firewall ruleset>'.
进行检查的接口的所有规则 - 检查规则以确保允许正确的子网,端口和协议:
- 如果您正在对服务网络到专用服务器的连接进行故障诊断,并且已将规则集
in
应用于 VIF (dp0bond0.XXX
),那么必须将服务网络定义为目标。 这是因为当流量流入 VIF 时,即客户机服务器发送出站流量时。 - 如果要对服务网络到专用服务器的连接进行故障诊断,并且应用了 VIF (
dp0bond0.XXX
) 的规则集out
,那么必须将服务网络定义为源。 这是因为当流量从 VIF 流出时,它会向客户机服务器执行此操作。 - 如果您正在排除服务网络与私人服务器连接的问题,并且规则集已应用于
in
到dp0bond0
界面,那么您必须将服务网络定义为源。 这是因为进入dp0bond0
界面的流量通常会流向Vyatta背后的服务器。 - 如果要对服务网络到专用服务器的连接进行故障诊断,并且应用了
dp0bond0
接口的规则集out
,那么必须将服务网络定义为目标。 这是因为从dp0bond0
流出的流量方向远离 Vyatta 后面的客户机服务器。
- 如果您正在对服务网络到专用服务器的连接进行故障诊断,并且已将规则集
对基于区域的防火墙配置进行故障诊断
要开始检查和故障诊断,请运行以下命令以了解策略的配置方式:
- 要显示哪些接口位于哪些区域中,请运行
show configuration commands | grep zone | grep interface
。 - 通过使用步骤 1 的输出,您可以通过运行
show configuration commands | grep <name of zone> | grep <name of other zone>
来查找在每个 zone-policy 中应用的防火墙规则集。 - 通过使用步骤 2 的输出,您可以通过运行
show configuration commands | grep -iE '<name of firewall ruleset>|<name of other firewall ruleset>'
来查找应用于流中正在尝试检查的接口的所有规则。 - 检查规则以确保允许正确的子网,端口和协议:
- 如果要对服务网络到专用服务器的连接进行故障诊断,并且策略是从 VIF (
dp0bond0.XXX
) 到dp0bond0
,那么必须将服务网络定义为目标。 - 对于从
dp0bond0
到 VIF (dp0bond0.XXX
) 的策略,必须将服务网络定义为源。
- 如果要对服务网络到专用服务器的连接进行故障诊断,并且策略是从 VIF (
以下示例详细说明了可用于提取确定防火墙是否应允许服务网络所需的信息的命令。
vyatta@gateway02:~$ show configuration commands | grep zone | grep interface
set security zone-policy zone SL-Private-Servers interface 'dp0bond0.1750'
set security zone-policy zone SL-Private-Servers interface 'dp0bond0.1623'
set security zone-policy zone SL-Service interface 'dp0bond0'
vyatta@gateway02:~$ show configuration commands | grep SL-Private-Servers | grep SL-Service
set security zone-policy zone SL-Private-Servers to SL-Service firewall 'To-Private-Service-Network'
set security zone-policy zone SL-Service to SL-Private-Servers firewall 'To-Private-Servers'
vyatta@gateway02:~$ show configuration commands | grep -iE 'To-Private-Service-Network|To-Private-Servers'
set security firewall name To-Private-Servers rule 1 action 'accept'
set security firewall name To-Private-Servers rule 1 source address 'ServiceNetwork'
set security firewall name To-Private-Service-Network rule 1 action 'accept'
set security firewall name To-Private-Service-Network rule 1 destination address 'ServiceNetwork'
set security zone-policy zone SL-Private-Servers to SL-Service firewall 'To-Private-Service-Network'
set security zone-policy zone SL-Service to SL-Private-Servers firewall 'To-Private-Servers'
#Pull the actual subnets that I'm allowing via the defined ServiceNetwork addresses:
vyatta@gateway02:~$ show configuration commands | grep ServiceNetwork
set resources group address-group ServiceNetwork address '10.0.86.0/24'
set resources group address-group ServiceNetwork address '10.2.128.0/20'
set resources group address-group ServiceNetwork address '10.1.176.0/20'
set resources group address-group ServiceNetwork address '10.1.64.0/19'
set resources group address-group ServiceNetwork address '10.1.96.0/19'
set resources group address-group ServiceNetwork address '10.1.192.0/20'
set resources group address-group ServiceNetwork address '10.1.160.0/20'
set resources group address-group ServiceNetwork address '10.2.32.0/20'
set resources group address-group ServiceNetwork address '10.2.64.0/20'
set resources group address-group ServiceNetwork address '10.2.112.0/20'
set resources group address-group ServiceNetwork address '10.2.160.0/20'
set resources group address-group ServiceNetwork address '10.1.208.0/20'
set resources group address-group ServiceNetwork address '10.2.80.0/20'
set resources group address-group ServiceNetwork address '10.2.144.0/20'
set resources group address-group ServiceNetwork address '10.2.48.0/20'
set resources group address-group ServiceNetwork address '10.2.176.0/20'
set resources group address-group ServiceNetwork address '10.3.64.0/20'
set resources group address-group ServiceNetwork address '10.0.64.0/19'
set resources group address-group ServiceNetwork address '10.0.80.11'
set resources group address-group ServiceNetwork address '10.0.80.12'
set resources group address-group ServiceNetwork address '10.200.80.0/20'
set resources group address-group ServiceNetwork address '10.3.160.0/20'
set resources group address-group ServiceNetwork address '10.201.0.0/20'
set resources group address-group ServiceNetwork address '10.3.80.0/20'
set security firewall name To-Private-Servers rule 1 source address 'ServiceNetwork'
set security firewall name To-Private-Service-Network rule 1 destination address 'ServiceNetwork'
会话和包日志记录
VRA 支持两种类型的日志记录,会话和每个包。
会话日志记录
使用命令 security firewall session-log
来配置防火墙会话日志记录。
对于 UDP、ICMP 和所有非 TCP 流,会话在流的生命周期内会依次转换为四个状态。 可以配置 VRA 对每次转换记录一条消息。 TCP 有更多状态转换,可通过配置对每次转换都进行记录。 以下示例详细说明了防火墙的 session-log
配置:
set security firewall session-log icmp established
set security firewall session-log tcp established
set security firewall session-log udp established
每个包记录
对于每个包日志记录,请确保在防火墙或 NAT 规则中包含关键字 log
。 这将记录与规则匹配的每个网络包。
逐个包应用的日志记录发生在包转发路径中,并会生成大量输出。 按数据包记录日志会大大降低 VRA 的吞吐量,造成性能问题,并显著增加日志文件的磁盘空间。 建议您仅将每个包记录用于调试目的。 出于所有操作目的,应改用有状态会话日志记录。
使用防火墙日志进行故障诊断
出于调试目的,您可以设置缺省日志和每个包日志记录。 可以将每个包日志记录添加到每个单独的规则,以在删除或接受包时显示在日志中 (具体取决于规则的操作集)。 缺省日志在发生时记录“隐式”删除。 对于以下基于区域策略的防火墙配置,缺省日志设置将在每次流量与规则 1 不匹配时记录。 这是唯一配置的规则。
set security firewall name To-Private-Servers rule 1 action drop
set security firewall name To-Private-Servers rule 1 source address ServiceNetwork
set security firewall name To-Private-Servers rule 1 log
set security firewall name To-Private-Servers default-log
要查看日志,有两个命令,以下输出演示特定流量的记录块:
journalctl -u vyatta-dataplane | grep <IP Address>
show log firewall name To-Private-Servers | grep <IP Address>
vyatta@gateway02# journalctl -f -u vyatta-dataplane | grep 10.3.84.106
Feb 18 05:47:09 gateway02 vyatta-dataplane.service dataplane[4313]: fw rule To-Private-Servers:10000 block icmp(1) src=//10.3.84.106 dst=dp0bond0.1750//10.126.19.174 len=84 ttl=55 type=8 code=0
Feb 18 05:47:10 gateway02 vyatta-dataplane.service dataplane[4313]: fw rule To-Private-Servers:10000 block icmp(1) src=//10.3.84.106 dst=dp0bond0.1750//10.126.19.174 len=84 ttl=55 type=8 code=0
^C
[edit]