英文:
Cloudformation NATGateway replacement: traffic blocked from vpc
问题
我试图在我的Cloudformation Yaml脚本中将NATGateway实例替换为名为Fck-Nat的Nat实例AMI,以将费用从每月$40降低到大约$4。
关键区别:
# NatGateway:
# Type: AWS::EC2::NatGateway
# Properties:
# AllocationId: !GetAtt ElasticIp.AllocationId
# SubnetId: !Ref PublicSubnet
VpcPrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref StaticIpVpc
PrivateRoute:
Type: AWS::EC2::Route
DependsOn: VpcAttachment
Properties:
DestinationCidrBlock: 0.0.0.0/0
RouteTableId: !Ref VpcPrivateRouteTable
# NatGatewayId: #!Ref NatGateway # - OLD Hook <===============
NetworkInterfaceId: !Ref FckNatInterface # New Hook <===============替换为
PrivateSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref VpcPrivateRouteTable
SubnetId: !Ref PrivateSubnet
'FckNatInterface'与文档中提到的内容相同Fck-nat部署(Cloudformation部分)
一切都没有错误部署,但Lambda函数无法访问ElasticIP或以其他方式访问外部世界,查看下面的axios响应图像,该图像显示了函数内部的响应:
我已经检查了路由、IPv4分配,并且就我所知,体系结构没有问题。我还重新启用了NAT-Gateway,以确保没有在其他地方出错(一切都按预期工作)。因此,问题绝对是与fck-nat桥接从私有到公共的问题,但是我不是网络方面的专家,无法进一步调试。
欢迎任何建议。希望这也对其他人有所帮助。
其他信息:
-
由于LimeLM的安全要求,我的Lambda函数需要静态IP,请告诉我是否需要额外的信息在评论中,我将根据需要进行更新
-
请参阅这里,以获取与NATGateway而不是fck-nat的实现非常接近的变体。
-
一个很好的通用指南,解释VPC架构点击这里
英文:
I am attempting to swap out a NATGateway instance in my Cloudformation Yaml script with a Nat instance AMI named Fck-Nat in order to reduce the (insane) cost from $40/m to around $4/m.
My current VPC Diagram from the console
The key difference:
# NatGateway:
# Type: AWS::EC2::NatGateway
# Properties:
# AllocationId: !GetAtt ElasticIp.AllocationId
# SubnetId: !Ref PublicSubnet
VpcPrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref StaticIpVpc
PrivateRoute:
Type: AWS::EC2::Route
DependsOn: VpcAttachment
Properties:
DestinationCidrBlock: 0.0.0.0/0
RouteTableId: !Ref VpcPrivateRouteTable
# NatGatewayId: #!Ref NatGateway # - OLD Hook <===============
NetworkInterfaceId: !Ref FckNatInterface # New Hook <===============Replaced with
PrivateSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref VpcPrivateRouteTable
SubnetId: !Ref PrivateSubnet
'FckNatInterface' is the same as mentioned in the docs Fck-nat deployment (Cloudformation section)
Everything deploys without error, however the lambda function cannot access the ElasticIP or otherwise reach the outside world see image below of the axios response from inside the function:
I have checked the routes, ipv4 allocation, and as far as I can tell, the architecture is fine. I have also re-enabled the NAT-Gateway to ensure no mistakes where made elsewhere (all worked as intended). So the issue is 100% with fck-nat bridge from private to public, but I'm not enough of an expert in network to debug further.
Any advice is welcome. Hopefully this also helps others.
Other info:
-
A staticIP is a requirement for my lambda Function due to security
requirements of LimeLM,LimeLm Forumn link -
Please let me know if additional information required in the
commnents, I will update as needed -
See Here for a fairly close varient of what my implementation is with NATGateway instead of fck-nat.
-
A great general guide explaining VPC Architecture click Here
答案1
得分: 2
我会首先检查NAT实例上的安全组,并确保该实例启用了IP转发 net.ipv4.ip_forward=1
。
此外,请确保EC2实例的源/目标检查已禁用。
如果Lambda通过其域名访问资源,请确保在VPC设置中启用了"DNS解析"。
如果在将来某个时候,您选择寻找替代自定义NAT实例的解决方案,我建议您考虑查看Aviatrix Secure Egress 解决方案,它已知能够降低NAT成本,并提供FQDN过滤作为额外的优势,而无需太多手工配置。
我们有一个TCO计算器,可以帮助您了解在这里的支出差异:
https://aviatrix.com/tco-calculator/
披露:我为Aviatrix设计网络
英文:
I would start by checking the Security Groups on the NAT instance and ensuring that the instance has IP forwarding enabled net.ipv4.ip_forward=1
.
Also, ensure Source/Destination Check is disabled for the EC2 instance.
If Lambda is accessing resources by their domain name, ensure that "DNS resolution" is enabled in the VPC settings.
If, at some point in the future, you choose to look into alternative solutions to custom-built NAT instances, I would recommend looking into the Aviatrix Secure Egress solution, known to reduce NAT costs and provide FQDN filtering as a bonus without too much manual plumbing.
We have a TCO calculator that can help figure out the difference in expenditure here:
https://aviatrix.com/tco-calculator/
Disclosure: I architect networks for Aviatrix
答案2
得分: 0
互联网网关必须连接到公共路由表:
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
!Ref VpcPublicRouteTable
SubnetId:
!Ref PublicSubnet
'AWS::EC2::Instance' 需要一个允许所有流量通过的 'groupset' 网络接口,而不是直接的 'network interface' 连接:
FckNatEC2Instance:
Type: AWS::EC2::Instance
Properties:
Tags:
- Key: Name
Value: fckNatInstance
SourceDestCheck: false
ImageId: ami-084b3eca5402436bf
InstanceType: t4g.nano
NetworkInterfaces:
- DeleteOnTermination: true
Description: fckNatEC2Instance 网络接口
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref SGAllTrafficFromVPC
AssociatePublicIpAddress: "true"
DeviceIndex: "0"
添加:
SGAllTrafficFromVPC:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupName: SGAllTrafficFromVPC
GroupDescription: 来自VPC CIDR的VPN流量
VpcId: !Ref StaticIpVpc
SecurityGroupIngress:
- IpProtocol: '-1'
CidrIp: !Ref VpcCidrBlock
Description: 来自VPC CIDR的所有流量
Bonus:
还可以添加用于调试的 SSH 支持:
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref StaticIpVpc
GroupDescription: 访问SSH访问
SecurityGroupIngress:
- CidrIp : 10.0.0.0/24
IpProtocol: tcp
FromPort: 22
ToPort: 22
Tags:
- Key: Name
Value: EC2SecurityGroup
英文:
Finally worked out an answer! :
1)
The Internet gateway has to be connected to the public route table:
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
!Ref VpcPublicRouteTable
SubnetId:
!Ref PublicSubnet
2)
The 'AWS::EC2::Instance' requires a network interface with a 'groupset' that allows all traffic through, rather than a direct 'network interface' connection
FckNatEC2Instance:
Type: AWS::EC2::Instance
Properties:
Tags:
- Key: Name
Value: fckNatInstance
SourceDestCheck: false
ImageId: ami-084b3eca5402436bf
InstanceType: t4g.nano
NetworkInterfaces:
# - NetworkInterfaceId: !Ref FckNatInterface OLD
# NEW:
- DeleteOnTermination: true
Description: fckNatEC2Instance network interface
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref SGAllTrafficFromVPC
AssociatePublicIpAddress: "true"
DeviceIndex: "0"
Add:
SGAllTrafficFromVPC:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupName: SGAllTrafficFromVPC
GroupDescription: VPN Traffic from VPC CIDR
VpcId: !Ref StaticIpVpc
SecurityGroupIngress:
- IpProtocol: '-1'
CidrIp: !Ref VpcCidrBlock
Description: All Traffic from VPC CIDR
Bonus:
it also helps to add ssh support for debugging:
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref StaticIpVpc
GroupDescription: Access ssh access to
SecurityGroupIngress:
- CidrIp : 10.0.0.0/24
IpProtocol: tcp
FromPort: 22
ToPort: 22
Tags:
- Key: Name
Value: EC2SecurityGroup
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论