如果想看如何配置 NSX 防火墙,请直接点击最后一章。
关于 Keepalived + LVS
参考文档:
https://manpages.debian.org/unstable/keepalived/keepalived.conf.5.en.html
LVS 是 Linux 下常见的四层负载均衡模块,keepalived 可以搭配 LVS 来实现一个高可用的负载均衡。
Keepalived 支持使用下面三种 LVS 转发模式:
- NAT 模式:NAT routing 模式,LVS 进行 DNAT 转换,为了使得 Real Server 返回流量经过 LVS,Real Server 需要将 LVS 节点的 IP(或 VIP)设置为网关,类似于传统负载均衡器的 In-line 路由模式;
- TUN 模式:通过 IP 封装将请求转发给 Real Server,默认使用 IPIP 封装,在 5.2 内核可以使用 GRE 封装;
- DR 模式:Direct Routing,三角传输模式,仅有入向请求会经过 LVS 节点,后续 Real Server 的回应流量均是跳过 LVS 节点,直接给 Client 回应。
本文重点关注第三种 DR 模式。
Keepalived DR 配置
配置完 Keepalived 后重启服务,安装 ipvsadm 工具,查看 LVS 转发表:
DR 模式下的抓包分析
LVS 侧抓包
报文1:TCP SYN
- 源 IP 为 Client IP
- 源 MAC 为网关 MAC
- 目标 IP 为 VIP
- 目标 MAC 为 LVS 节点网卡的真实 MAC
下图为 LVS 上 ARP 结果,44:52 为网关 MAC:
报文1-转发:TCP SYN
- 源 IP 为 Client IP
- 源 MAC 为 LVS 节点网卡的真实 MAC (这里相当于重写二层包头)
- 目标 IP 为 VIP
- 目标 MAC 为 Real Server 的真实 MAC (这里相当于重写二层包头)
报文3:TCP ACK(报文2 SYN/ACK 在此节点看不到,仅有 Real Server 和 Client 可以看到)
- 源 IP 为 Client IP
- 源 MAC 为网关 MAC
- 目标 IP 为 VIP
- 目标 MAC 为 LVS 节点网卡的真实 MAC
报文3-转发:TCP ACK(报文2 SYN-ACK 在此节点看不到,仅有 Real Server 和 Client 可以看到)
- 源 IP 为 Client IP
- 源 MAC 为 LVS 节点网卡的真实 MAC (这里相当于重写二层包头)
- 目标 IP 为 VIP
- 目标 MAC 为 Real Server 的真实 MAC (这里相当于重写二层包头)
Real Server 侧抓包
报文1:TCP SYN
- 源 IP 为 Client IP
- 源 MAC 为 LVS 节点网卡的真实 MAC
- 目标 IP 为 VIP
- 目标 MAC 为本节点的真实 MAC
报文2:TCP SYN-ACK
- 源 IP 为 VIP
- 源 MAC 为本节点的真实 MAC
- 目标 IP 为 Client IP
- 目标 MAC 为网关 MAC
下图为 Real Server 上 ARP 结果,44:52 为网关 MAC:
其他后续报文的原目 IP 及 MAC 和上述报文一致。
NSX 如何影响 DR 模式
如果开启 NSX DFW 的 ESXi 上运行 LVS DR 模式的虚拟机,会发现存在丢包现象,尤其是 Client 往 Server 传输大文件时更明显。
但是如果是一个很轻量的 HTTP 页面访问,则无任何问题。
为什么 NSX 会影响到 DR 模式
下面仅是笔者的猜想:
NSX 默认使用有状态防火墙,在 DR 模式下,仅有 Client to Server 的流量会经过 LVS 节点,所以站在 DFW 角度,LVS 上传输的流量仅有一半,这其实很类似于 SYN Flood 攻击,所以 DFW 会丢弃一些流量。但这个丢弃只有达到一定阈值时才触发,并不是一开始就直接丢弃。
从抓包来看,在会话建立很短的时间内,客户端可以正常接收流量,但从某一时间点开始,因为未收到有些包的 ACK 包,因此重传,一段时间后超时 Reset。
在 LVS 上抓包情如下,大致只能接收 76 个报文,之后所有 Client 发来的报文均接收不到。
Server 端类似,可以接收并回复前面的部分包,但后面的均接收不到。
在 NSX 中查看相关 VM 的网卡统计信息,可以看到大量的 state-mismatch 的 DROP,丢包原因和后续报文的 seq 有关系。
如何正确配置 NSX 防火墙
为了保证 LVS DR 可以在 NSX 防火墙下正常工作,有下面两种配置方式:
(注意:Real Server 不需要这些配置,仅 LVS 虚拟机需要)
将 LVS 虚拟机放在防火墙白名单中
这种方式性能最优,配置也最简单。
1、在 NSX 清单>组中添加一个新组,将 LVS 虚拟机加入其中(注意此处需要通过选择虚拟机的形式加入,不能通过填写 IP 的形式加入)
2、在分布式防火墙的下列位置设置排除列表,关联上面创建的组:
为 LVS 虚拟机设置无状态防火墙规则
1、在 NSX 清单>组中添加一个新组,将 LVS 虚拟机加入其中(注意此处需要通过选择虚拟机的形式加入,不能通过填写 IP 的形式加入)
2、在分布式防火墙下创建一个策略,先不发布,点击最右侧的编辑:
取消勾选下面两项配置:
接着点击策略的应用对象,勾选第一步创建的 LVS 组:
最后,在策略中添加放行规则:
配置完成后点击发布即可。