Skip to content
ProfessionalProLoad BalancingPrivateLinkAWS VPC

Lab 24: The Gateway Load Balancer Endpoint That Took Traffic In And Never Let It Out

An inspection path built from the getting-started guide. The appliance is healthy, the endpoint is available, and every packet the application sends is inspected and handed back. None of it reaches the internet, and the appliance is the one place in the path that can prove it did its job.

Debugging time
~35 min
Reading time
13 min
Reported by
Security Engineering
Tier
Professional
INC-1857SEV-2InvestigatingOpened 2026-09-29 08:10 UTC

Application subnet lost all internet access after inspection cutover; appliance healthy, endpoint available

Reported by Security Engineering

We cut the application subnet over to inline inspection last night: a Gateway Load Balancer in the security VPC, a Gateway Load Balancer endpoint in the application VPC, ingress routing on the internet gateway, default route on the application subnet pointed at the endpoint. Built from the AWS getting-started guide.

Since the cutover the application host cannot reach anything on the internet, and nothing from the internet completes to it. Package updates hang, the outbound webhook is timing out, the health checker from outside is red.

The parts I can check all check out. The endpoint is available. The appliance is healthy in the target group. The appliance team ran a capture and say they are receiving our traffic and sending it back — they are adamant the problem is not theirs. Security groups and network ACLs have not been touched. There is no error anywhere. The traffic just goes in and does not come out.

What you are working with

Two VPCs in one Availability Zone. The provider side holds the Gateway Load Balancer and one appliance. The consumer side holds the application host and the endpoint.

Starting state — inline inspection through a Gateway Load Balancer endpoint
VPC consumer 10.191.0.0/16 Attached: Internet gateway. AZ a contains gwlbe 10.191.0.0/24, default route 0.0.0.0/0 → ?, holding GWLB endpoint; app 10.191.1.0/24, default route 0.0.0.0/0 → gwlbe, holding App host, SSM endpoints. VPC provider 10.190.0.0/16 AZ a contains appliance 10.190.1.0/24, holding Gateway LB, Appliance.the internetPrivateLinkendpoint → GWLBVPC consumer 10.191.0.0/16AZ agwlbeprivate10.191.0.0/240.0.0.0/0 → ?GWLB endpointavailableappprivate10.191.1.0/24App host10.191.1.50,public IPSSMendpointsscaffoldingVPC provider 10.190.0.0/16AZ aappliancepublic10.190.1.0/24Gateway LBGENEVE 6081Appliancehairpin,healthy0.0.0.0/0 → gwlbeInternet gatewayedge route table → gwlbe

Ingress routing sends internet traffic for the application subnet to the endpoint before it reaches the host. The application subnet's default route sends everything outbound to the same endpoint. Both of those are correct. The endpoint subnet's own route table is the one thing this diagram leaves blank, because it is the thing you are going to read. The SSM endpoints are scaffolding: they are why you can reach the application host at all while it is cut off.

ResourceConfiguration
Gateway Load BalancerProvider VPC, one zone, listener → GENEVE target group
Target groupProtocol GENEVE, port 6081, health check TCP:22
Appliancet3.micro, registered, healthy; hairpins every GENEVE frame back
Endpoint serviceGateway type, acceptance not required
GWLB endpointConsumer VPC, subnet 10.191.0.0/24, available
Internet gateway route table10.191.1.0/24 → vpce (edge association)
Application subnet route table0.0.0.0/0 → vpce
Endpoint subnet route tableread it
Application host10.191.1.50, public IP, Python HTTP server on :80
  1. EC2

    App host

    10.191.1.50 → internet

  2. RTB

    Application subnet route table

    0.0.0.0/0 → vpce

  3. VPCE

    GWLB endpoint

    PrivateLink to the provider VPC

  4. GW

    Gateway Load Balancer

    GENEVE encapsulation, UDP 6081

  5. VPCE

    Appliance

    frame received, frame returned

  6. GW

    Gateway Load Balancer

    decapsulates, returns to the endpoint

  7. RTB

    Endpoint subnet route table

    destination: the internet

    Dropped — The only route in this table is the local one. The packet has been inspected and emitted into the endpoint subnet, and there is no route from here to the internet gateway. The VPC router has nothing to match and discards it.

  8. DEST

    the internet

    never reached

Six hops succeed. The seventh is a route table with one entry in it. Everything the ticket checked is upstream of the failure, and everything upstream is working.

Scope and constraints

  • In scope: why traffic that is inspected and returned never reaches its destination.
  • Out of scope: the load balancer, the target group, the health check, the endpoint service, the endpoint, the ingress routing association, the application subnet's route, security groups and network ACLs. All correct. The reproduction confirms each so you can stop re-checking them.
  • The appliance team is right. Take their claim seriously and verify it on their host, because once you believe it the search space collapses.
  • The fix adds one route to one table. Nothing is removed and nothing is reconfigured.

Deploy the broken state

cd lab-24-gwlb-endpoint-return-route
terraform init
terraform apply

Allow about six minutes. The Gateway Load Balancer takes a few to become active, the endpoint a little longer to become available, and the appliance installs its hairpin on first boot after it has found the load balancer's address. Before testing, confirm the target is healthy:

aws elbv2 describe-target-health \
  --target-group-arn "$(terraform output -raw target_group_arn)" \
  --query 'TargetHealthDescriptions[].TargetHealth.State' --output text
# healthy

If it reports initial, wait a minute and run it again.