Why the hub route table is not the whole path
- The route table attached to the source subnet must send the destination CIDR to the transit attachment.
- The hub route table associated with spoke A's attachment must have a route to spoke B.
- The route table attached to the destination subnet must send the reply toward the transit attachment.
- The hub route table associated with spoke B's attachment must have a route back to spoke A.
What effective routes actually show
10.20.0.0/16 for spoke B. If the source subnet also carries a more specific route such as 10.20.1.0/24 pointing at an old VPN, a NAT appliance, or a peering connection left over from a migration, traffic to 10.20.1.15 follows the /24 and never touches the hub. The hub dashboard stays green the whole time.
Some other patterns show up often enough to check every time:
- A subnet has no explicit route table association, so it quietly uses the VPC's main route table, which nobody updated.
- A transit gateway route shows a blackhole state because the attachment it pointed at was deleted or recreated.
- In Azure, a user-defined route sends a prefix to a next hop of None, or to a virtual appliance that no longer forwards.
- In AWS, the VPC attachment has subnets in only some Availability Zones. Instances in an AZ without an attachment subnet can't reach the transit gateway, even though their subnet route table looks correct.
Checking effective routes on both ends
BASH
# 1. Route table associated with the source subnet (replace IDs with your own)
aws ec2 describe-route-tables \
--filters 'Name=association.subnet-id,Values=subnet-0aaa1111' \
--query 'RouteTables[].Routes[]' --output table
# If that returns nothing, the subnet uses the VPC main route table
aws ec2 describe-route-tables \
--filters 'Name=vpc-id,Values=vpc-0bbb2222' 'Name=association.main,Values=true' \
--query 'RouteTables[].Routes[]' --output table
# 2. Which transit gateway route table this attachment is associated with
aws ec2 describe-transit-gateway-attachments \
--transit-gateway-attachment-ids tgw-attach-0ccc3333 \
--query 'TransitGatewayAttachments[].Association'
# 3. What that table does with the destination IP (longest prefix match)
aws ec2 search-transit-gateway-routes \
--transit-gateway-route-table-id tgw-rtb-0ddd4444 \
--filters 'Name=route-search.longest-prefix-match,Values=10.20.1.15/32'BASH
# Effective routes applied to a specific NIC, including UDRs and BGP-learned routes
az network nic show-effective-route-table \
--resource-group rg-app --name vm-app-nic --output tablegcloud compute routes list shows the VPC routes, and the console's route views or Connectivity Tests can help you confirm which route applies to a given instance. The exact tooling depends on how NCC is set up in your environment.
Finally, check inside the guest OS. Instances with multiple network interfaces, leftover static routes, or VPN clients can send traffic out the wrong interface before the cloud fabric ever sees it.
BASH
# Run on the source instance, then on the destination with the source IP
ip route get 10.20.1.15
# Illustrative output format:
# 10.20.1.15 via 10.10.1.1 dev eth0 src 10.10.1.20 uid 0dev or via, the problem is on the host, not the transit.
Route symmetry and the return trip
| Checkpoint | Forward (A to B) | Return (B to A) |
|---|---|---|
| Source or destination subnet table | B's CIDR goes to the transit attachment | A's CIDR goes to the transit attachment |
| Hub table for the sending attachment | Route to B, not blackhole | Route to A, not blackhole |
| Inspection or appliance hop, if any | Appliance in AZ x | Same appliance, same AZ |
| Guest OS | Correct interface and gateway | Correct interface and gateway |
