Australian cloud for business software — built and run in Sydney since 2003

NetLeverage
NetLeverage

AWS Transit Gateway: route tables, segmentation and blackhole routes

Technical article
Cloud

About this article: AI-assisted writing, reviewed against the cited sources. This is source research, not a lab validation of the procedures. Check the stated versions and your own recovery requirements before making changes.

A transit gateway forwards a packet using the one route table associated with the attachment the packet came in on. Association therefore decides where an attachment can send, and propagation decides which route tables learn how to reach it. A segment is the result of those two settings, not a separate object.

A packet can be dropped because no route matches it or because it matches a blackhole route. AWS counts those separately, so find out which one you have before changing any routes.

Commands below come from the AWS CLI reference, except where marked as written for this article. None were run in a lab.

Why it matters

The defaults build a flat network. A new attachment is associated with and propagated to the default route table when those options are on, so every attachment can reach every other attachment.

That matters when development, production and on-premises networks share a gateway. A single wrong association can open a path between segments, or remove one that an application depends on.

It also matters for fault finding. Three separate configurations have to agree for a two-way conversation: the subnet route tables at each end, the transit gateway route table on each direction, and the routes inside the attachment subnets.

How the forwarding decision works

Association and propagation

Setting Allowed count What it does
Association One route table per attachment That table decides the next hop for traffic coming from the attachment
Propagation One or more route tables Installs the attachment's routes in those tables
Static route Per route table A route you add yourself, to an attachment or as a blackhole

A useful way to remember it, as an editorial shorthand: association answers "where can this attachment send?", and propagation answers "who can send to this attachment?".

What propagates depends on the attachment type:

You cannot filter advertised routes on propagation. If a segment must not learn a route, do not propagate that attachment to the segment's table.

Association also shapes what on-premises networks learn. With dynamic routing, routes in the table associated with the VPN attachment are advertised to the customer gateway. Moving a VPN attachment to another table therefore changes the prefixes your router receives. Direct Connect gateway attachments are different: allowed prefixes control what is advertised.

Route evaluation order

AWS evaluates routes by the most specific destination first. For the same CIDR from different attachment types, the order is:

  1. Static routes
  2. System routes installed for 1:1 NAT
  3. Prefix list referenced routes
  4. VPC-propagated routes
  5. Direct Connect gateway-propagated routes
  6. Transit Gateway Connect-propagated routes
  7. Site-to-Site VPN over private Direct Connect-propagated routes
  8. Site-to-Site VPN-propagated routes
  9. VPN Concentrator-propagated routes
  10. Client VPN-propagated routes
  11. Transit gateway peering-propagated routes (Cloud WAN)

For the same CIDR from the same attachment type, shorter AS path wins, then lower MED, then eBGP over iBGP where supported. AWS cannot guarantee a consistent order when all of those are equal.

Two behaviours catch people during a fault:

So a backup path you cannot see is not evidence that the backup is missing.

The VPC side

The transit gateway is only part of the path. The VPC needs three things:

If a VPC's CIDR is identical to or overlaps an already attached VPC, the new VPC's routes are not propagated. The attachment can exist with no route to show for it.

Segmentation patterns

These are the patterns AWS documents. The association and propagation columns are the whole design.

Pattern Associate Propagate
Flat router All attachments to one table All attachments to that table
Isolated VPCs with shared on-premises access VPCs to table A, VPN to table B VPN to table A, VPCs to table B
Isolated VPCs with a shared services VPC Isolated VPCs to table A; VPN and shared VPC to table B VPN and shared VPC to table A; isolated VPCs to table B. AWS's text also propagates the shared VPC to table B, although its example table does not list that route
Central inspection Spoke VPCs to table A; appliance VPC to table B Spokes to table B; table A holds a static 0.0.0.0/0 to the appliance attachment

In the isolated patterns no VPC propagates to the table its peers are associated with. A packet from one isolated VPC to another reaches the gateway and is blocked because no route matches.

AWS compares extra route tables to virtual routing and forwarding on traditional networks. It also advises you to limit the number of route tables unless the design needs more.

Moving an existing network off the default table

Turning off the default options does not fix existing attachments. Changes made with modify-transit-gateway apply to new attachments only. You must move each existing attachment yourself.

aws ec2 create-transit-gateway-route-table \
  --transit-gateway-id tgw-0123456789abcdef0

Build the new table and check it before moving anything:

aws ec2 enable-transit-gateway-route-table-propagation \
  --transit-gateway-route-table-id tgw-rtb-0aaaaaaaaaaaaaaaa \
  --transit-gateway-attachment-id tgw-attach-0bbbbbbbbbbbbbbbb

aws ec2 search-transit-gateway-routes \
  --transit-gateway-route-table-id tgw-rtb-0aaaaaaaaaaaaaaaa \
  --filters "Name=state,Values=active,blackhole"

Treat an attachment move as a separate network change plan. An attachment can use only one associated table, so a move can interrupt traffic while the association changes. Before the window, record the original association, both forward and return routes, exact attachment identity and service acceptance tests. The plan must wait for the relevant asynchronous association states and specify how to recover if the new table is incomplete. No move sequence was rehearsed for this article, so an executable disassociate/associate procedure is omitted.

Review old propagation dependencies before retiring them. Removing a route that another segment still needs can remove its return path. Prove the intended reachability and isolation on non-production attachments first.

Blackhole routes

A blackhole route is a static route that drops traffic matching it:

For a design example, a blackhole for 10.20.0.0/16 drops matching traffic unless a more-specific route wins. Creating it is an intentional traffic-denial change; review the affected prefixes and rehearse it before production.

Its value comes from the evaluation order. Longest prefix wins, so a /16 blackhole beats a static 0.0.0.0/0.

AWS's own example is central internet egress. Every VPC reaches the egress VPC through a default route, which would also let the VPCs reach each other through it. You can prevent that with a blackhole route for each VPC CIDR.

Two limits follow from the same order:

  • A more specific route for part of the range still wins, so a /16 blackhole does not stop a propagated /24. This is an inference from the longest-prefix rule.
  • A blackhole on the exact CIDR of a propagated route is a static route, so it replaces the propagated route in the table.

The route state is visible with a filter:

aws ec2 search-transit-gateway-routes \
  --transit-gateway-route-table-id tgw-rtb-0aaaaaaaaaaaaaaaa \
  --filters "Name=state,Values=blackhole"

--filters is required on this command. Route states are pending, active, blackhole, deleting and deleted. If AdditionalRoutesAvailable is true, the output is incomplete: narrow the filter or use export-transit-gateway-routes to write the table to S3.

The pages opened for this article describe a blackhole only as a route someone creates. If you find one you did not expect, do not guess. CloudTrail records Transit Gateway API calls, and Event history covers the past 90 days, so search there for who made the change and when.

Finding the drop

Work through these in order. Check both directions, because the return traffic can use a different table: the one associated with the attachment it enters on.

1. Read the association for the attachment the packet enters on

# --query written for this article
aws ec2 describe-transit-gateway-attachments \
  --transit-gateway-attachment-ids tgw-attach-0cccccccccccccccc \
  --query 'TransitGatewayAttachments[].{State:State,Table:Association.TransitGatewayRouteTableId,Assoc:Association.State}'

Expect an attachment state of available, the state in which AWS says traffic can flow between the VPC and the transit gateway. A cross-account attachment can also sit in pendingAcceptance if auto-accept is off.

2. Search that table for the destination

# Filter value written for this article
aws ec2 search-transit-gateway-routes \
  --transit-gateway-route-table-id tgw-rtb-0aaaaaaaaaaaaaaaa \
  --filters "Name=route-search.longest-prefix-match,Values=10.2.3.4/32"

Repeat in the table associated with the destination attachment, searching for the source address. A route in one direction only is the classic result of a segmentation change.

3. Read the metrics

The AWS/TransitGateway namespace separates the two kinds of drop. Use the Sum statistic.

Metric Meaning First check
PacketDropCountBlackhole Matched a blackhole route Whether the route is intended
PacketDropCountNoRoute Matched no route Association and propagation of the ingress table
PacketDropCountNoPolicy No policy rule matched; the equivalent of no route for standard route tables Policy table entries, where used
PacketDropCountTTLExpired Time to live expired A routing loop, as an inference

Metrics exist per gateway and per attachment. Only VPC attachments support per-Availability Zone metrics.

Zero on all four drop counters is a useful result, but not a clean bill of health. The published metrics have no drop counter for packets over the MTU, so that loss shows only in the flow log fields below. With those also clear, investigate subnet routes, network ACLs, security groups and the host next. Missing drop evidence does not prove that the gateway passed every packet: correlate the exact flow, time interval and log coverage before ruling out a layer.

4. Use Transit Gateway Flow Logs for the specific flow

Metrics count drops but do not name the flow. Transit Gateway Flow Logs record tgw-attachment-id, source and destination VPC, subnet and zone, plus these four fields:

  • packets-lost-no-route
  • packets-lost-blackhole
  • packets-lost-mtu-exceeded
  • packets-lost-ttl-expired

The default format includes the fields up to version 6, which covers these. Aggregation must be 60 seconds for transit gateway resources. Flow logs do not affect throughput or latency, but Connect attachments and multicast are not supported. Connect flows appear under the transport attachment, so enable logging on the transit gateway or on that attachment. Publishing can take several minutes to begin.

Only the transit gateway owner can create a flow log unless the owner grants permission.

5. Check the attachment subnet's network ACL

Network ACL evaluation is unusual here, and depends on where the attachment sits.

Traffic Separate attachment subnet Instances share the attachment subnet
Instance to transit gateway Instance subnet outbound rules, then attachment subnet inbound rules Outbound and inbound rules are evaluated
Transit gateway to instance Attachment subnet outbound rules, then instance subnet inbound rules Neither outbound nor inbound is evaluated

Rules use the destination address outbound and the source address inbound. AWS recommends a separate small subnet, for example /28, for each attachment, with its ACL left open in both directions. Filter in the workload subnets instead.

6. Check asymmetry through stateful appliances

Without appliance mode, the transit gateway tries to keep traffic in the originating Availability Zone. Across zones, a response can land on an appliance that never saw the request, and it is dropped.

Appliance mode keeps the flow on one zone of the appliance VPC for its lifetime:

Enabling appliance mode is a topology change. Review the attachment and both flow directions with the appliance owner, and validate the change and recovery path in an isolated environment before production.

Check these before relying on it:

A Network Firewall attachment gets appliance mode automatically and supports static routing only.

7. Check packet size

A transit gateway supports an MTU of 8500 bytes between VPC, Direct Connect, Connect and peering attachments, and 1500 bytes over VPN. It generates Path MTU Discovery responses only for traffic entering on VPC and Connect attachments. A non-zero packets-lost-mtu-exceeded points here. AWS warns of drops during a move from VPC peering, and advises updating both VPCs at the same time.

8. Use Reachability Analyzer with its limits in mind

Reachability Analyzer can follow a path through transit gateway route tables, but with TCP it analyses forward traffic only on that part of the path. It does not support policy tables, and stops at Connect attachments. A positive result does not clear the return direction, so run a second path the other way.

What to choose and why

These are editorial recommendations.

  • Separate subnets for attachments. Use AWS's small dedicated subnet from the start. It removes the most confusing network ACL behaviour.
  • Fewest tables that express the policy. Each table is another place for one direction to be wrong. Most designs need a table per trust zone, not one per VPC.
  • Prefer no route over a blackhole for isolation. If two segments should never talk, leave out the propagation. Keep blackholes for cases where a broader route would otherwise match, such as central egress.
  • Keep auto-association off once you segment. A new attachment landing in the default table can bypass the design.
  • BGP for VPN attachments. AWS recommends BGP connections, with multipath where the device supports it. ECMP is not available on static VPN connections.
  • A unique ASN on each peered gateway. AWS recommends this to take advantage of future route propagation capabilities.
  • One gateway per Region. AWS says you do not need additional transit gateways for high availability, and suggests a single gateway in each Region for disaster recovery.

Risks and limits

Quotas as published on the date checked. Check Service Quotas for your account.

Item Default Adjustable
Route tables per transit gateway 20 Yes
Combined routes across all tables 10,000 Through your AWS account team
Attachments per transit gateway 5,000 Yes
Transit gateways per VPC 5 No
Attachments from one transit gateway to the same VPC 1 No: AWS says a transit gateway cannot have more than one
Peering attachments per transit gateway 50 Yes
Peering attachments between two transit gateways 1 No
Bandwidth per VPC attachment per zone Up to 100 Gbps each direction Through your AWS account team
Packets per second per VPC attachment per zone Up to 7,500,000 Through your AWS account team

Warning: Static routes that target a VPN attachment are not filtered by the Site-to-Site VPN. AWS notes this may allow unintended outbound traffic on a BGP-based VPN. Review them when you segment.

Warning: Associating a policy table with a VPN or Connect attachment stops all BGP advertisements to that peer. An attachment can use a policy table or a route table, not both.

Warning: Enabling appliance mode on an existing attachment can rebalance flows across zones. Treat it as a traffic-affecting change.

Other limits to plan around:

Cost scales with both attachments and traffic. AWS's Ohio example shows USD 0.05 per VPC attachment per hour, and a USD 0.02 data processing charge for 1 GB sent. A partial hour is billed as a full hour. The owner of the VPC sending the traffic pays for data processing, and each gateway owner is billed hourly for a peering attachment. Check the page for your Region before estimating.

Sources

Opened 2026-11-10. Sources behind the corrections reopened 10 November 2026.