Internet → Pod: where the packet goes, and what to check when it doesn't
Hop 0 / 10
Path
Zones client / DNS ingress VPC · LB routing cluster VPC · node pod · mesh
Hop 0 / 10
Understand it — click a question
Troubleshoot this hop
Mesh
Zones DNS · app Service · kube-proxy · ENI pod · mesh
Hop 0 / 6
Understand it — click a question
Troubleshoot this hop
The path, hop by hop
Assumes the common enterprise pattern: an internet-facing load balancer in a dedicated ingress VPC, the AWS Load Balancer Controller in IP target mode (targets are Pod IPs), VPC CNI (Pod IPs are VPC IPs), Transit Gateway between VPCs, and a service mesh (Istio-style) sidecar. Swap values for your environment.
#
Hop
What routes it
Verify with
Common cause when it stops here
Inside the Pod — the iptables that reach the sidecar
These NAT rules live in the Pod's own network namespace, installed by istio-init (or the Istio CNI). An inbound request is REDIRECT-ed to Envoy's inbound listener on :15006 before it ever reaches the app; the outbound rules break the loop so Envoy's own traffic (uid 1337) isn't re-captured. View them with kubectl exec <pod> -c istio-proxy -- iptables-save -t nat.
# nat table — inside the Pod's netns# 1) every inbound TCP packet jumps into Istio's own chain
-A PREROUTING -p tcp -j ISTIO_INBOUND# 2) leave Envoy's own management ports alone (RETURN = don't touch)
-A ISTIO_INBOUND -p tcp --dport 15008 -j RETURN # HBONE tunnel (newer Istio)
-A ISTIO_INBOUND -p tcp --dport 15090 -j RETURN # Envoy metrics
-A ISTIO_INBOUND -p tcp --dport 15021 -j RETURN # health / readiness
-A ISTIO_INBOUND -p tcp --dport 15020 -j RETURN # agent# 3) …everything else → the redirect chain
-A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT# 4) THE line that sends traffic to the sidecar:-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15006# outbound: stop Envoy's own egress from being re-captured (the loop-break)
-A OUTPUT -p tcp -j ISTIO_OUTPUT
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN # traffic FROM Envoy (uid 1337) → skip
-A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN # loopback to the app stays local
-A ISTIO_OUTPUT -p tcp -j ISTIO_REDIRECT
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001 # app's outbound → Envoy :15001
Ports & ids to know: 15006 Envoy inbound (the REDIRECT target) · 15001 Envoy outbound · 15008 HBONE mTLS tunnel · 15021 health · 15090/15020 metrics · uid/gid 1337 = istio-proxy (the loop-break). This is Istio default REDIRECT mode; TPROXY and ambient/HBONE differ. No rules present → istio-init/CNI didn't run and Envoy is being bypassed.