What a Misconfigured VPC Peering Connection Actually Breaks
A peering connection between two VPCs is usually set up once, during an early integration, and rarely revisited. That's exactly the profile of a change that quietly drifts out of alignment with what the network actually needs, and it's worth walking through how a small, common misconfiguration turns into a real exposure.
Vendors Covered in this Article
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
The setup: a peering connection meant for one service
A team peers their application VPC with a partner's VPC so one internal service can call a shared API over private IPs instead of the public internet. The route table entry they add, to keep things simple, covers the partner's entire CIDR block rather than the single subnet the shared service lives in.
At the time, this looks harmless: the security group on the calling service still restricts which ports are open, so the wider route doesn't seem to matter.
Where it breaks: a new subnet joins the other side
Months later, the partner spins up a new subnet in that same VPC for an unrelated internal tool, with a permissive security group because it's meant to be internal-only on their side. Because the peering route covers the whole CIDR block, every instance in the original VPC can now reach that new subnet, and because the new subnet's own security posture assumed nothing outside its VPC could reach it, the two teams have accidentally built a path neither side intended or reviewed.
Neither team's own change, viewed alone, looks wrong. The original wide route and the partner's assumption of isolation only become a problem together.
What actually exposed the gap
A routine network scan turned up a service responding on an unexpected private IP range. Tracing it back took longer than it should have, because the peering connection wasn't documented anywhere beyond the initial ticket that created it, and nobody currently on the team had context on why the route existed at that scope.
The four checks that would have caught it earlier
Scope every peering route to the specific subnet or CIDR the integration actually needs, never the whole VPC, even when it's more convenient to write once. Document every peering connection with the specific service and subnet it's meant to serve, in a place your team actually checks, not just the ticket that created it. Review peering routes on a schedule, not only when something breaks, since drift on the other side of the connection is invisible to you until you look. Treat any new subnet inside a peered VPC as a security review trigger on your own side, since your security posture now depends on decisions made outside your team.
Run these checks on every peering connection:
- Scope each peering route to the specific subnet or CIDR the integration needs, never the whole VPC, even when the broad route is quicker to write.
- Document the service and subnet each peering connection exists for, in a place your team actually checks rather than only in the original ticket.
- Review peering routes on a schedule, and again whenever a partner adds subnets, instead of waiting for something to break.
- Assign a named owner to every peering connection so responsibility persists after the engineer who created it moves on.
Why this kind of gap survives so long
Nobody owned the route after the ticket that created it closed. That's the real pattern behind most stale network configuration: it was correct and reasonable at the moment someone wrote it, and became wrong through a change on a system nobody on your side was watching. The fix isn't reviewing harder once; it's assigning ownership that persists past the original engineer moving to a different project.
If you can't name, right now, who owns each peering connection in your account, that's the gap to close before the next audit or the next incident finds it for you.
How the team actually fixed it
The remediation itself took under an hour: narrow the route table entry to the one subnet the shared API lived in, confirm the calling service still worked, and remove the broader entry. The slower part was the process change that came after: a short internal policy that every new peering connection required a named owner and a route scoped to a specific subnet before it could be approved, checked at the same review gate as any other production network change.
That policy change is the part worth copying even if you've never had an incident like this one. It costs almost nothing to add a scoping requirement to a peering request template, and it removes the exact ambiguity that let this gap sit unnoticed for months.
What Good Looks Like
Good network isolation means every peering route is scoped to the specific subnet an integration needs, documented with its purpose, and reviewed on a schedule rather than only after an incident.
Building The Capability (5-Stage Skill Ladder)
How to Get Started
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
A scheduled exposure scan is the concrete version of the fourth check above; Tenable will flag a service reachable over a wider route than expected without you having to trace it by hand.
If a peering misconfiguration is discovered because something was already probing the exposed subnet, CrowdStrike's endpoint telemetry helps tell you whether that probing was routine scanning or something to respond to.
Frequently Asked Questions
Is VPC peering inherently less safe than a private link or transit gateway?
Not inherently, but peering routes are flat and easy to over-scope by accident, while a transit gateway or private link setup forces you to define specific endpoints. If you're peering with more than two or three VPCs, the extra setup cost of a more explicit connection model usually pays for itself.
How often should peering routes be reviewed?
Quarterly is reasonable for most small teams, tied to the same cadence as your other network security reviews. Add an ad hoc review any time a partner VPC adds new subnets, since that's the specific trigger that turned this example into a real exposure.
Should we ever peer a full CIDR block on purpose?
Only when both sides genuinely need broad connectivity and both sides have agreed on the security implications in writing. Most integrations need exactly one service talking to one other service, which should be reflected in a route that's just as narrow.
About the numbers
This guide doesn't quote a sourced benchmark. Figures in it are estimates or general guidance, so check them against your own numbers.
Related Guides
Where VPC Peering Breaks Down and How to Isolate Blast Radius Instead
Why VPC peering alone doesn't isolate anything, and a more reliable way to contain blast radius between services and environments.
The VPC Peering Mistake That Opens Your Whole Network
How VPC peering misconfigurations quietly expose more of your network than intended, and four concrete checks that catch the mistake before an audit does.
A Practical Checklist for VPC Peering and Network Isolation
The specific network isolation mistakes that quietly undermine a zero-trust architecture, and a checklist for catching them in your VPC peering setup.
VPC Peering Looks Like Isolation Until You Check the Routes
VPC peering can silently become transitive, undoing the isolation you thought you had. Here is how to audit what can actually reach what in your network.
Four Network Isolation Checks Most VPC Peering Setups Skip
Four specific checks for VPC peering and network isolation setups, plus the pitfalls that let a segmentation boundary look correct while quietly failing.
Designing VPC Peering So One Breach Doesn't Spread
Why VPC peering isn't isolation by default, how to draw blast radius before you draw a network diagram, and how to prove a compromised service is contained.