如果想看如何配置 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 路由模式;

LVS DR 模式下 NSX 防火墙配置_LVS

  • TUN 模式:通过 IP 封装将请求转发给 Real Server,默认使用 IPIP 封装,在 5.2 内核可以使用 GRE 封装;
  • DR 模式:Direct Routing,三角传输模式,仅有入向请求会经过 LVS 节点,后续 Real Server 的回应流量均是跳过 LVS 节点,直接给 Client 回应。

LVS DR 模式下 NSX 防火墙配置_LVS_02

本文重点关注第三种 DR 模式。

Keepalived DR 配置

# global_defs 略....
vrrp_instance VI_1 {
state MASTER
# accept
interface ens32
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.29.7.10/24 brd 10.29.7.255
}
}
virtual_server 10.29.7.10 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 1
protocol TCP

real_server 10.29.7.12 80 {
weight 1
}
}

配置完 Keepalived 后重启服务,安装 ipvsadm 工具,查看 LVS 转发表:

LVS DR 模式下 NSX 防火墙配置_LVS_03

DR 模式下的抓包分析

LVS 侧抓包

报文1:TCP SYN

  • 源 IP 为 Client IP
  • 源 MAC 为网关 MAC
  • 目标 IP 为 VIP
  • 目标 MAC 为 LVS 节点网卡的真实 MAC

LVS DR 模式下 NSX 防火墙配置_Keepalived_04

下图为 LVS 上 ARP 结果,44:52 为网关 MAC:

LVS DR 模式下 NSX 防火墙配置_分布式防火墙_05

报文1-转发:TCP SYN

  • 源 IP 为 Client IP
  • 源 MAC 为 LVS 节点网卡的真实 MAC (这里相当于重写二层包头)
  • 目标 IP 为 VIP
  • 目标 MAC 为 Real Server 的真实 MAC (这里相当于重写二层包头)

LVS DR 模式下 NSX 防火墙配置_分布式防火墙_06

报文3:TCP ACK(报文2 SYN/ACK 在此节点看不到,仅有 Real Server 和 Client 可以看到)

  • 源 IP 为 Client IP
  • 源 MAC 为网关 MAC
  • 目标 IP 为 VIP
  • 目标 MAC 为 LVS 节点网卡的真实 MAC

LVS DR 模式下 NSX 防火墙配置_LVS_07

报文3-转发:TCP ACK(报文2 SYN-ACK 在此节点看不到,仅有 Real Server 和 Client 可以看到)

  • 源 IP 为 Client IP
  • 源 MAC 为 LVS 节点网卡的真实 MAC (这里相当于重写二层包头)
  • 目标 IP 为 VIP
  • 目标 MAC 为 Real Server 的真实 MAC (这里相当于重写二层包头)

LVS DR 模式下 NSX 防火墙配置_NSX_08

Real Server 侧抓包

报文1:TCP SYN

  • 源 IP 为 Client IP
  • 源 MAC 为 LVS 节点网卡的真实 MAC
  • 目标 IP 为 VIP
  • 目标 MAC 为本节点的真实 MAC

LVS DR 模式下 NSX 防火墙配置_丢包_09

报文2:TCP SYN-ACK

  • 源 IP 为 VIP
  • 源 MAC 为本节点的真实 MAC
  • 目标 IP 为 Client IP
  • 目标 MAC 为网关 MAC

LVS DR 模式下 NSX 防火墙配置_Keepalived_10

下图为 Real Server 上 ARP 结果,44:52 为网关 MAC:

LVS DR 模式下 NSX 防火墙配置_LVS_11

其他后续报文的原目 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 DR 模式下 NSX 防火墙配置_分布式防火墙_12

在 LVS 上抓包情如下,大致只能接收 76 个报文,之后所有 Client 发来的报文均接收不到。

LVS DR 模式下 NSX 防火墙配置_丢包_13

Server 端类似,可以接收并回复前面的部分包,但后面的均接收不到。

LVS DR 模式下 NSX 防火墙配置_丢包_14

在 NSX 中查看相关 VM 的网卡统计信息,可以看到大量的 state-mismatch 的 DROP,丢包原因和后续报文的 seq 有关系。

LVS DR 模式下 NSX 防火墙配置_分布式防火墙_15

如何正确配置 NSX 防火墙

为了保证 LVS DR 可以在 NSX 防火墙下正常工作,有下面两种配置方式:

(注意:Real Server 不需要这些配置,仅 LVS 虚拟机需要)


将 LVS 虚拟机放在防火墙白名单中

这种方式性能最优,配置也最简单。

1、在 NSX 清单>组中添加一个新组,将 LVS 虚拟机加入其中(注意此处需要通过选择虚拟机的形式加入,不能通过填写 IP 的形式加入)

LVS DR 模式下 NSX 防火墙配置_Keepalived_16

LVS DR 模式下 NSX 防火墙配置_LVS_17

2、在分布式防火墙的下列位置设置排除列表,关联上面创建的组:

LVS DR 模式下 NSX 防火墙配置_NSX_18

LVS DR 模式下 NSX 防火墙配置_NSX_19

为 LVS 虚拟机设置无状态防火墙规则

1、在 NSX 清单>组中添加一个新组,将 LVS 虚拟机加入其中(注意此处需要通过选择虚拟机的形式加入,不能通过填写 IP 的形式加入)

LVS DR 模式下 NSX 防火墙配置_Keepalived_16

LVS DR 模式下 NSX 防火墙配置_LVS_17

2、在分布式防火墙下创建一个策略,先不发布,点击最右侧的编辑:

LVS DR 模式下 NSX 防火墙配置_NSX_22

取消勾选下面两项配置:

LVS DR 模式下 NSX 防火墙配置_Keepalived_23

接着点击策略的应用对象,勾选第一步创建的 LVS 组:

LVS DR 模式下 NSX 防火墙配置_LVS_24

最后,在策略中添加放行规则:

LVS DR 模式下 NSX 防火墙配置_分布式防火墙_25

配置完成后点击发布即可。