NSX分布式防火墙是如何工作的?

本文涉及的产品
云防火墙,500元 1000GB
简介: 今天我们来聊一聊VMware NSX的分布式防火墙DFW,本文提及的NSX,均指NSX for vSphere,即NSX-V,有关NSX-T的讨论,将在后续推出。

今天我们来聊一聊VMware NSX的分布式防火墙DFW,本文提及的NSX,均指NSX for vSphere,即NSX-V,有关NSX-T的讨论,将在后续推出。

了解过NSX的朋友一定很清楚,NSX的管理平面、控制平面和转发平面是相互独立分离的。对于管理平面,大家比较熟悉的是vCenter和NSX Manager;对于vsfwd,可能就比较陌生。那么,这是个什么组件?与我们讨论的NSX分布式防火墙又有什么千丝万缕的联系呢?

image.png

在部署NSX解决方案的时候,其中有一个关键的步骤,叫Host Preparation主机准备。在这个阶段,NSX Manager通过vCenter的ESX Agent Manager Service(EAM),以集群为单位,在每一台ESXi主机上安装一个叫做esx-nsxv的vSphere Installation Bundle(VIB)。

我们可以通过以下命令在ESXi安装的VIB列表中找到这条记录:# esxcli software vib list

image.png

这个小小的VIB会在ESXi的Kernal Space内核空间运行三个非常关键的模块,其中的vsip module就和我们今天所讲述的NSX DFW息息相关。

我们可以通过以下命令找到这个加载并运行的模块:# vmkload_mod -l

image.png

除此以外,esx-nsxv还会在ESXi的User Space用户空间运行一个名为vShield-Stateful-Firewall的服务,这就是我们所说的vsfwd。

我们可以通过以下命令验证这个服务是否运行:# /etc/init.d/vShield-Stateful-Firewall status

image.png

在了解了上述内容后,我们再回过头来看NSX的DFW原理图。

image.png

在ESXi用户空间运行的vsfwd,会和NSX Manager的TCP5671端口保持连接,用以接受NSX Manager下发的分布式防火墙规则。vsfwd通过Virtual Machine Communication Interface(VMCI),与在ESXi内核空间运行的vsip module通信,vsip module会将接收到的分布式防火墙规则下发到对应虚拟机的虚拟网卡vnic上。

在VM虚拟机的虚拟网卡vnic和上联的虚拟机端口组之间,有一条隐性的链路,叫IO Chain。这条IO链上有很多插槽,其中Slot0-3,Slot12-15是VMware预留,Slot4-11提供给合作伙伴,NSX的分布式防火墙就作用在Slot2插槽

举个简单的例子,当流量从VM向外转发时,会首先经过IO Chain的Slot2插槽,此时vsip module会根据应用在vnic上的规则进行匹配和控制,如果规则禁止转发,那么流量根本不会经过ESXi主机的上联物理网卡vmnic到达物理网络。由于IO链一直存在,除非特殊情况,否则虚拟机的迁移不会影响分布式防火墙生效。VMware NSX的安全无处不在,就是通过这种方式实现的。


下面,我们做一个简单的实验,来验证上文所说的内容。

1.验证ESXi的vsfwd,与NSX Manager的TCP5671端口保持连接

# esxcli network ip connection list | grep 5671

image.png

2.我们开启一台ESXi虚拟机作为测试用例,该虚拟机共有6个vnic,其中vnic0和vnic1作为管理网络负载网卡,管理地址为172.20.5.53

image.png

3.管理员通过Web Client,添加一条防火墙规则,禁止所有到该虚拟机的流量

image.png

4.可以看到外部已经无法PING通该虚拟机

image.png

5.在承载该虚拟机的ESXi命令行,查阅并找到该虚拟机的网卡信息

# summarize-dvfilter | more

image.png

6.可以看到该虚拟机一共有6块网卡,分别是eth0-eth5,同时分布式防火墙运行在每一块vnic与虚拟机端口组之间IO链的Slot2插槽

image.png

7.我们可以进一步查看作用在每一块vnic上的分布式防火墙规则集合

# vsipioctl getrules -f 网卡名称

可以看到图中rule 1018就是阻止所有入向流量的规则,它被包含在规则集合domain-c80中

image.png

8.此时,我们通过命令停止ESXi用户空间运行的vsfwd

# /etc/init.d/vShield-Stateful-Firewall stop

image.png

9.可以看到,即使我们停止了vsfwd,分布式防火墙规则依旧生效,我们还是无法PING通虚拟机

各位可以回顾一下,vsfwd只在接受并传达给vip module分布式防火墙规则阶段有参与,而VM流量能否通过Slot2,是由vsip module根据规则去处理,与vsfwd无关

image.png

10.那么,如果我们删除应用在vnic上的防火墙规则,结果又会如何呢?

# vsipioctl vsipfwcli Override -f 网卡名称 -c "create ruleset 规则集合名称;"

有些版本,命令可能是# vsipioctl vsipfwcli -Override -f 网卡名称 -c "create ruleset 规则集合名称;"

image.png

11.我们发现,即使删除了eth0的防火墙规则,虚拟机依旧无法访问,这和我们之前的描述大相径庭,问题出在哪里呢?别忘了,承载该esxi-1a虚拟机管理网络的还有eth1,我们还需要删除应用给eth1的防火墙规则

image.png

12.可以看到,在删除eth0和eth1两块vnic的分布式防火墙规则后,外部终于可以PING通172.20.5.53,即esxi-1a的管理地址

image.png

image.png

这种方式可以用来解决vCenter被DFW屏蔽的情况

13.但是对于eth2-eth5,可以看到之前的防火墙规则依旧存在。只是esxi-1a虚拟机的管理流量不会经过它们的iochains,因此这些规则是否存在不会影响外界能否PING通172.20.5.53

image.png

14.我们保持vsfwd停止运行的状态,通过Web Client新建一条策略,允许任意源SSH访问esxi-1a

image.png

15.可以看到,虽然管理员添加并应用了该防火墙规则,但由于vsfwd未正常运行,因此ESXi虚拟机无法接受NSX Manager下发的规则,也无法将这些规则通过vsip module应用到对应的虚拟机,虚拟机vnic上的规则集合保持着之前空的状态

image.png

16.此时,我们重新启动vsfwd

# /etc/init.d/vShield-Stateful-Firewall start

image.png

17.很快,我们就能发现原本可以PING通的esxi-1a虚拟机又不可达了,原因是防火墙策略重新下发并应用给该虚拟机后阻止了一切非SSH入向流量

image.png

18.通过命令行,我们可以看到这些变化

image.png

19.根据防火墙规则,外部是可以通过SSH访问esxi-1a的

image.png

怎么样,现在通过上文的论述和实验,大家对NSX的分布式防火墙是否有所了解了呢?

本文最后,特别感谢好友Coco,Eagle在工作和学习中对我的帮助,在与他们的交流过程中,学到了不少非常有用的虚拟化技术和项目经验。

在下尚在学习阶段,文中如有谬误,欢迎各位斧正。

相关文章
|
3月前
|
人工智能 安全 物联网
什么是分布式防火墙?
【8月更文挑战第23天】
82 0
什么是分布式防火墙?
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
110 2
基于Redis的高可用分布式锁——RedLock
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
7天前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
40 16
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
59 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
1月前
|
NoSQL Redis 数据库
计数器 分布式锁 redis实现
【10月更文挑战第5天】
47 1
|
1月前
|
NoSQL 算法 关系型数据库
Redis分布式锁
【10月更文挑战第1天】分布式锁用于在多进程环境中保护共享资源,防止并发冲突。通常借助外部系统如Redis或Zookeeper实现。通过`SETNX`命令加锁,并设置过期时间防止死锁。为避免误删他人锁,加锁时附带唯一标识,解锁前验证。面对锁提前过期的问题,可使用守护线程自动续期。在Redis集群中,需考虑主从同步延迟导致的锁丢失问题,Redlock算法可提高锁的可靠性。
73 4
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
60 4

热门文章

最新文章