ENI详解

ENI - elastic network interface 是VPC中虚拟网卡,它可以跟以下组件做关联:

  • 一个主private IP、一个或多个secondary private IP
  • 每个private IP上可以绑一个EIP
  • 一个Public IP
  • 一个或多个安全组
  • 一个MAC地址

ENI存在于特定的AZ,可以将它解绑然后挂到同AZ的其他实例,这样流量就到达了新的实例上:

image-20220903221840647

Primary network interface

每个EC2都有一个默认的ENI,也叫primary network interface,这个ENI不能从实例上解绑下来。但实例上可以挂额外的ENI,每种实例可以挂的ENI数量不同,参考: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI

image-20220903221209206

如果实例上被分配 Public IP,那么这个Public IPprimary network interface进行关联

虽然EC2上可以挂多个ENI,但是挂多个ENI并不能增加EC2的总带宽。所有ENI共享EC2的最大带宽

ENI使用场景之一 - Dual home

EC2上绑两块ENI,一个ENI在公网,一个ENI在私网,这样EC2既能跟公网通讯,又能跟私网通讯:

image-20220903222705117

Requester-managed ENI

之所以托管的AWS服务能够被用户自己的vpc访问到,是因为这些服务的机器上有两块ENI,一块在服务自身的VPC,另一块在用户的VPC

Requester-managed ENI是指AWS服务在用户VPC创建的ENI,用户并不能自己管理这些ENI。这些ENI与AWS托管服务关联,例如RDS、NAT Gateway、Interface VPC Endpoint、MSK

1.你可以在AWS帐号中看到这些Requester-managed ENI,并且可以添加tag,但不能做任何的属性更改
2.不可以对Requester-managed ENI做detach操作
3.当这些托管服务被删除时,Requester-managed ENI会一起被删除;如果没有被删除,这时可以手动删除

如何查看是否是Requester-managed ENI

Network Interface页面,点击具体的ENI,有一个属性叫Requester-managed,如果为True则表示是AWS服务在用户VPC里创建的ENI:

image-20220903225038351

使用CLI查看所有Requester-managed ENI

aws ec2 describe-network-interfaces --filters Name=requester-managed,Values=true --region ap-southeast-1 | jq '.NetworkInterfaces[] | {Description:.Description, PrivateIpAddress:.PrivateIpAddress, RequesterId:.RequesterId}'

image-20220903225841686

image-20220903225919360

从中可以看到,每个托管服务的RequesterID都不同,但它们的实现原理都一样——强行在用户的VPC里创建一个ENI,这样用户就能跟它通讯了。例如Lambda in VPC, 其实是Lambda在用户的VPC里创建ENI,这样Lambda就能访问VPC内的资源了:

image-20220903223122081

再比如EKS的控制平面,它的master节点本身存在于AWS管理的VPC,但它在用户的VPC里创建了ENI,所以Worker节点能和它通讯。