AWS VPC路由报错:数据包匹配更具体路由 Terraform网络防火墙配置问题
问题根因
你的配置存在两个核心错误导致路由冲突:
- 防火墙资源不符合分布式部署要求:你为每个AZ创建了独立的Network Firewall实例,正确的分布式模型是单实例多AZ子网挂载,AWS会自动为每个AZ生成对应防火墙端点。
- IGW入站路由前缀匹配冲突:VPC所有路由表默认存在优先级极高的
local路由(目的为VPC CIDR 10.11.0.0/16),你在IGW路由表配置的公网子网/20路由虽然前缀长于VPC CIDR,但同网段路由存在隐式优先级冲突,导致入站流量被本地路由直接转发到公网子网,跳过防火墙。
调整步骤
1. 修正防火墙资源配置
删除现有两个独立的防火墙实例,替换为单个防火墙实例,同时挂载两个AZ的防火墙子网:
resource "aws_networkfirewall_firewall" "distributed_fw" { name = "distributed-firewall" firewall_policy_arn = aws_networkfirewall_firewall_policy.test.arn vpc_id = aws_vpc.eu-central-1.id # 多AZ子网挂载,自动生成两个AZ的防火墙端点 subnet_mapping { subnet_id = aws_subnet.firewall_a.id } subnet_mapping { subnet_id = aws_subnet.firewall_b.id } }
2. 修正公网子网路由表配置
从单个防火墙实例中按AZ提取对应端点ID,替换原有两个独立防火墙的引用:
resource "aws_route_table" "public_a" { vpc_id = aws_vpc.eu-central-1.id route { cidr_block = "0.0.0.0/0" # 提取eu-central-1a对应防火墙端点ID vpc_endpoint_id = [for sync in aws_networkfirewall_firewall.distributed_fw.firewall_status[0].sync_states : sync.attachment[0].endpoint_id if sync.availability_zone == "eu-central-1a"][0] } } resource "aws_route_table" "public_b" { vpc_id = aws_vpc.eu-central-1.id route { cidr_block = "0.0.0.0/0" # 提取eu-central-1b对应防火墙端点ID vpc_endpoint_id = [for sync in aws_networkfirewall_firewall.distributed_fw.firewall_status[0].sync_states : sync.attachment[0].endpoint_id if sync.availability_zone == "eu-central-1b"][0] } }
3. 修正IGW关联路由表配置
将每个公网子网的/20 CIDR拆分为两个更长前缀的/21 CIDR,确保最长前缀匹配优先,绕过本地路由冲突:
10.11.64.0/20 拆分为:10.11.64.0/21、10.11.72.0/21
10.11.80.0/20 拆分为:10.11.80.0/21、10.11.88.0/21
resource "aws_route_table" "igw" { vpc_id = aws_vpc.eu-central-1.id # 拆分后的public_a网段路由,指向1a防火墙端点 route { cidr_block = "10.11.64.0/21" vpc_endpoint_id = [for sync in aws_networkfirewall_firewall.distributed_fw.firewall_status[0].sync_states : sync.attachment[0].endpoint_id if sync.availability_zone == "eu-central-1a"][0] } route { cidr_block = "10.11.72.0/21" vpc_endpoint_id = [for sync in aws_networkfirewall_firewall.distributed_fw.firewall_status[0].sync_states : sync.attachment[0].endpoint_id if sync.availability_zone == "eu-central-1a"][0] } # 拆分后的public_b网段路由,指向1b防火墙端点 route { cidr_block = "10.11.80.0/21" vpc_endpoint_id = [for sync in aws_networkfirewall_firewall.distributed_fw.firewall_status[0].sync_states : sync.attachment[0].endpoint_id if sync.availability_zone == "eu-central-1b"][0] } route { cidr_block = "10.11.88.0/21" vpc_endpoint_id = [for sync in aws_networkfirewall_firewall.distributed_fw.firewall_status[0].sync_states : sync.attachment[0].endpoint_id if sync.availability_zone == "eu-central-1b"][0] } }
4. 保留原有配置项
私网子网路由表、NAT网关、IGW、防火墙子网路由表及所有路由关联配置均保持原有逻辑不变。
流量验证逻辑
调整后完全满足防火墙引流和正常转发要求:
- 入站流量:Internet -> IGW -> 匹配IGW路由表/21路由 -> 对应AZ防火墙端点检测 -> 公网子网EC2
- 出站流量:公网EC2 -> 匹配公网子网默认路由 -> 对应AZ防火墙端点检测 -> 防火墙子网路由到IGW -> Internet
- 私网流量:私网EC2 -> NAT网关 -> 公网子网路由到防火墙 -> 防火墙检测后到IGW -> Internet
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

