<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Virtual Network on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/tags/virtual-network/</link><description>Recent content in Virtual Network on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 07 Jul 2026 00:00:00 +1000</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/tags/virtual-network/rss.xml" rel="self" type="application/rss+xml"/><item><title>When Your UDR Stops Driving: VNRA, Override, and Routing Ambiguity</title><link>https://blog.brewedinthecloud.com/p/vnra-and-udr-cooperation-override-and-conflict/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-and-udr-cooperation-override-and-conflict/</guid><description>&lt;p&gt;You attach a User Defined Route (UDR) to a subnet, point it at a next hop, and assume the path is now controlled.&lt;/p&gt;
&lt;p&gt;That assumption is comfortable because it makes routing reviewable. It gives architects something concrete to approve, and operators something visible to inspect. But once Azure Virtual Network Routing Appliance (VNRA) is part of the design, that comfort starts to drift away.&lt;/p&gt;
&lt;p&gt;The route may still be there. It may still be effective. It may still be selected. None of that, by itself, proves the packet followed the path you thought you enforced.&lt;/p&gt;
&lt;p&gt;That is the real design shift here. VNRA does not simply add another routing feature. It changes what a UDR is good for. In VNRA-influenced environments, a subnet UDR should not be treated as proof of enforced path compliance. It proves declared routing intent only.&lt;/p&gt;
&lt;p&gt;If the previous post was about route precedence as a decision model, this one is about what happens when route selection still looks fine but path certainty is gone.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common enterprise assumption is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I define the right UDR and attach it to the right subnet, I control where the packet goes next.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds reasonable because it is often good enough in simpler Azure routing scenarios. A route is selected, a next hop is visible, and the design appears deterministic.&lt;/p&gt;
&lt;p&gt;The problem is that engineers often treat a selected route as the same thing as an enforced packet path.&lt;/p&gt;
&lt;p&gt;With VNRA, that is no longer a safe shortcut.&lt;/p&gt;
&lt;p&gt;A UDR still expresses routing intent. Azure still evaluates effective routes. But the presence of VNRA means route declaration and forwarding proof are no longer the same class of evidence. The route table tells you what the control plane intends to do. It does not automatically prove the data plane behaved the same way.&lt;/p&gt;
&lt;p&gt;How would this change something you design, deploy, or operate? It means a route table attached to a subnet is no longer enough to prove that a traffic policy is being enforced. For any path that matters operationally, you need both control-plane evidence and data-plane evidence.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;This post deliberately avoids re-teaching UDRs or repeating precedence rules from the previous entry. The important point here is narrower: VNRA weakens the assumption that explicit next-hop configuration is sufficient proof of actual packet steering.&lt;/p&gt;
&lt;p&gt;There are three useful patterns to think about.&lt;/p&gt;
&lt;h3 id="cooperation"&gt;Cooperation
&lt;/h3&gt;&lt;p&gt;This is the easy case.&lt;/p&gt;
&lt;p&gt;The UDR is selected, the configured next hop aligns with the expected forwarding path, and observed traffic behaviour matches the design. VNRA is present, but it does not introduce visible ambiguity for that flow.&lt;/p&gt;
&lt;p&gt;Architects tend to assume this is the normal state because it is the least surprising. Sometimes it is.&lt;/p&gt;
&lt;h3 id="override"&gt;Override
&lt;/h3&gt;&lt;p&gt;This is the case that matters most.&lt;/p&gt;
&lt;p&gt;The UDR can still appear in the effective route set and still represent the declared next hop, yet that alone does not prove the reviewed path is the one the workload actually used. In VNRA-influenced designs, route selection can remain visible while forwarding certainty does not.&lt;/p&gt;
&lt;p&gt;That is the key distinction advanced teams need to internalise: a route can still be valid, selected, and operationally insufficient as proof.&lt;/p&gt;
&lt;h3 id="conflict"&gt;Conflict
&lt;/h3&gt;&lt;p&gt;This is where the design becomes brittle.&lt;/p&gt;
&lt;p&gt;You now have more than one control model claiming authority:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the subnet UDR expresses explicit next-hop intent&lt;/li&gt;
&lt;li&gt;the VNRA-influenced forwarding path shapes actual packet movement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, your architecture stops being deterministic by inspection. Different engineers can read the same route design and reach different conclusions about what the packet will do. That is not a documentation issue. It is a design issue.&lt;/p&gt;
&lt;h2 id="the-position-to-be-clear-about"&gt;The Position to Be Clear About
&lt;/h2&gt;&lt;p&gt;In a VNRA-influenced environment, a subnet UDR should not be treated as proof of enforced path compliance.&lt;/p&gt;
&lt;p&gt;It proves declared routing intent only.&lt;/p&gt;
&lt;p&gt;That does not make the UDR useless. It still matters. It still participates in route selection. It still expresses a design decision that Azure takes into account. But if your architecture, audit process, or operational runbook assumes the route table alone proves where critical traffic went, your assurance model is weaker than you think.&lt;/p&gt;
&lt;p&gt;That is the opinion this post is arguing for, and it is worth stating plainly because many enterprise networking standards still assume the opposite.&lt;/p&gt;
&lt;h2 id="what-counts-as-proof-now"&gt;What Counts as Proof Now
&lt;/h2&gt;&lt;p&gt;Once VNRA is in play, the minimum proof standard needs to change.&lt;/p&gt;
&lt;p&gt;For any path that matters for segmentation, compliance, resilience, or operational control, minimum acceptable proof should include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;control-plane evidence&lt;/strong&gt;, such as effective route inspection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data-plane evidence&lt;/strong&gt;, such as synthetic path testing, flow observation, or packet capture from representative workloads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the practical line.&lt;/p&gt;
&lt;p&gt;If you have only reviewed the route table, you have reviewed intent.
If you have observed the path from the originating subnet, you have started to prove behaviour.&lt;/p&gt;
&lt;p&gt;That distinction should change both design review and incident response.&lt;/p&gt;
&lt;h2 id="where-udr-intent-starts-to-break-down"&gt;Where UDR Intent Starts to Break Down
&lt;/h2&gt;&lt;h3 id="explicit-next-hop-is-no-longer-exclusive-authority"&gt;Explicit next hop is no longer exclusive authority
&lt;/h3&gt;&lt;p&gt;A route pointing at a virtual appliance still declares a preferred next hop. That has not changed.&lt;/p&gt;
&lt;p&gt;What has changed is the confidence you can place in that declaration as the final word. In VNRA scenarios, an explicit next hop is part of the forwarding story, not necessarily the whole story.&lt;/p&gt;
&lt;p&gt;For platform teams, that means “we set the next hop” is not the same claim as “we proved the path”.&lt;/p&gt;
&lt;h3 id="effective-routes-remain-useful-but-no-longer-decisive"&gt;Effective routes remain useful, but no longer decisive
&lt;/h3&gt;&lt;p&gt;Effective route views still matter. You should absolutely keep using them.&lt;/p&gt;
&lt;p&gt;But they now belong in the category of necessary evidence, not sufficient evidence. An effective route can confirm that Azure selected the UDR as part of the routing decision. It cannot, on its own, prove that the observed packet path still matches the reviewed design intent.&lt;/p&gt;
&lt;p&gt;That is a subtle but important downgrade in what effective route inspection can tell you operationally.&lt;/p&gt;
&lt;h3 id="subnet-level-standardisation-creates-confidence-that-may-not-be-deserved"&gt;Subnet-level standardisation creates confidence that may not be deserved
&lt;/h3&gt;&lt;p&gt;Enterprise landing zones often rely on shared route tables attached at subnet boundaries. This is attractive because it centralises control and keeps intent visible.&lt;/p&gt;
&lt;p&gt;VNRA complicates that model. A shared route table can still standardise declared routing intent across workloads, but it no longer guarantees that the route table fully explains practical forwarding outcomes. In other words, standardised route declaration does not automatically mean standardised packet behaviour.&lt;/p&gt;
&lt;p&gt;That matters most in estates where central networking teams treat route ownership as equivalent to path ownership.&lt;/p&gt;
&lt;h2 id="visualising-the-difference"&gt;Visualising the Difference
&lt;/h2&gt;&lt;p&gt;The classic mental model looks like this:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Workload Subnet] --&gt; B[UDR Selected]
B --&gt; C[Configured Next Hop]
C --&gt; D[Assumed Packet Path]
&lt;/div&gt;
&lt;p&gt;That model is simple, inspectable, and increasingly incomplete.&lt;/p&gt;
&lt;p&gt;A VNRA-aware model looks more like this:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Workload Subnet] --&gt; B[Effective Route Selection]
B --&gt; C[Declared UDR Next Hop]
C --&gt; D[Azure Forwarding Behaviour]
D --&gt; E[Observed Packet Path]
B -. Control-plane evidence .-&gt; C
D -. Data-plane reality .-&gt; E
&lt;/div&gt;
&lt;p&gt;The important change is not that the UDR disappears. It is that the UDR stops being enough.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;h3 id="design-impact"&gt;Design impact
&lt;/h3&gt;&lt;p&gt;Design standards that say “traffic from subnet X must traverse path Y” need a stronger proof model if VNRA is involved.&lt;/p&gt;
&lt;p&gt;A UDR attached to subnet X is no longer sufficient evidence of enforcement. At best, it is evidence that the design intends to steer traffic towards path Y. If that path matters, the design should also define how the forwarding result will be validated.&lt;/p&gt;
&lt;p&gt;That changes architecture review materially. Route declaration alone should not be accepted as path compliance evidence in VNRA-influenced designs.&lt;/p&gt;
&lt;h3 id="operational-impact"&gt;Operational impact
&lt;/h3&gt;&lt;p&gt;Troubleshooting needs to split into two questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What route did Azure select?&lt;/li&gt;
&lt;li&gt;What path did the packet actually take?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you collapse those into one question, you will misdiagnose problems.&lt;/p&gt;
&lt;p&gt;This is the practical workflow shift. Effective routes remain a starting point, but if route selection and observed behaviour disagree, that disagreement is not noise. It is the signal.&lt;/p&gt;
&lt;h3 id="governance-impact"&gt;Governance impact
&lt;/h3&gt;&lt;p&gt;Many organisations still review route tables as if they prove policy enforcement.&lt;/p&gt;
&lt;p&gt;In VNRA scenarios, that review model is incomplete. Route tables prove declared intent, not necessarily behavioural compliance. If audit, architecture, or change control processes are certifying path enforcement based solely on subnet UDRs, they are approving configuration, not proving outcome.&lt;/p&gt;
&lt;p&gt;That is not just a networking detail. It is a control weakness.&lt;/p&gt;
&lt;h3 id="reliability-impact"&gt;Reliability impact
&lt;/h3&gt;&lt;p&gt;Ambiguous path authority is dangerous during incidents.&lt;/p&gt;
&lt;p&gt;When a path fails cleanly, rollback is usually straightforward. When a path is only partially explained by the route configuration, every incident takes longer because engineers are trying to reconcile two truths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the route table says one thing&lt;/li&gt;
&lt;li&gt;the packet behaviour suggests another&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That slows containment, weakens fault isolation, and makes “safe” changes less safe than they look.&lt;/p&gt;
&lt;h2 id="implementation-artefact"&gt;Implementation Artefact
&lt;/h2&gt;&lt;p&gt;This series deliberately avoids deployment walkthroughs, and that matters here.&lt;/p&gt;
&lt;p&gt;A UDR declaration artefact on its own is not especially useful in this post because route configuration is not the disputed part of the argument. The contested issue is whether route declaration proves forwarding behaviour. Showing Bicep or CLI to create a route table would add configuration detail without adding confidence to the thesis, so it is intentionally omitted.&lt;/p&gt;
&lt;p&gt;The more useful operational artefact is a validation mindset: pair route inspection with an observable data-plane check from the workload context you actually care about.&lt;/p&gt;
&lt;p&gt;If you need a shorthand test for design review, use this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If we have only inspected the effective route, we have verified intent.
If we have also observed the path from the originating subnet, we have started to verify enforcement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the artefact that should survive into production operations.&lt;/p&gt;
&lt;h2 id="patterns-that-create-ambiguity"&gt;Patterns That Create Ambiguity
&lt;/h2&gt;&lt;h3 id="we-own-the-route-table-so-we-own-the-path"&gt;“We own the route table, so we own the path”
&lt;/h3&gt;&lt;p&gt;This is a control-plane assumption, not a proven operational truth.&lt;/p&gt;
&lt;p&gt;If VNRA can influence forwarding outcomes beyond what the route table alone proves, route ownership and path ownership are no longer the same thing.&lt;/p&gt;
&lt;h3 id="the-effective-route-is-correct-so-the-issue-must-be-somewhere-else"&gt;“The effective route is correct, so the issue must be somewhere else”
&lt;/h3&gt;&lt;p&gt;That is often where advanced teams lose time.&lt;/p&gt;
&lt;p&gt;The effective route may be correct in the narrow sense that Azure selected the expected route. That still does not settle whether the reviewed path assumption survived contact with the data plane.&lt;/p&gt;
&lt;h3 id="adding-a-udr-makes-the-design-more-deterministic"&gt;“Adding a UDR makes the design more deterministic”
&lt;/h3&gt;&lt;p&gt;Sometimes it does.&lt;/p&gt;
&lt;p&gt;But in VNRA-influenced topologies, adding a UDR can also create a second explanation for path behaviour without eliminating the first. That is not increased determinism. It is layered intent.&lt;/p&gt;
&lt;p&gt;If the environment cannot clearly tell you which layer is authoritative for a given flow, the design is less deterministic than it was before.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="the-platform-may-not-give-you-a-dramatic-failure-signal"&gt;The platform may not give you a dramatic failure signal
&lt;/h3&gt;&lt;p&gt;The awkward scenarios are not always the ones where Azure rejects a route or reports an obvious fault.&lt;/p&gt;
&lt;p&gt;The more dangerous case is where the UDR remains present, valid, and reviewable, while operators assume that means the packet path is proven. The hazard is false certainty, not visible breakage.&lt;/p&gt;
&lt;h3 id="symmetry-should-be-validated-not-assumed"&gt;Symmetry should be validated, not assumed
&lt;/h3&gt;&lt;p&gt;Even if the forward-path evidence looks clean, do not assume the return path is governed by the same logic. Once multiple routing influences exist, symmetry becomes an operational claim that needs proof.&lt;/p&gt;
&lt;p&gt;Detailed return-path analysis is out of scope here, but this is one of the first places ambiguous routing authority tends to surface.&lt;/p&gt;
&lt;h3 id="shared-route-tables-can-hide-confidence-gaps"&gt;Shared route tables can hide confidence gaps
&lt;/h3&gt;&lt;p&gt;A common route table applied to multiple workloads can create the impression that path behaviour is equally understood for all of them.&lt;/p&gt;
&lt;p&gt;That may be true at the level of declared intent. It is not automatically true at the level of observed forwarding.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="1-stop-treating-subnet-udrs-as-path-enforcement-evidence"&gt;1. Stop treating subnet UDRs as path enforcement evidence
&lt;/h3&gt;&lt;p&gt;In VNRA-influenced environments, a UDR is evidence of intent. Treating it as proof of enforcement is the mistake.&lt;/p&gt;
&lt;h3 id="2-define-a-proof-standard-for-critical-paths"&gt;2. Define a proof standard for critical paths
&lt;/h3&gt;&lt;p&gt;If a traffic path matters, decide in advance what evidence counts. A good minimum standard is effective route inspection plus at least one data-plane validation method from a representative source.&lt;/p&gt;
&lt;h3 id="3-separate-route-review-from-path-assurance"&gt;3. Separate route review from path assurance
&lt;/h3&gt;&lt;p&gt;Architecture review can approve declared intent. Operational validation should prove actual behaviour. Those are related, but they are not the same control.&lt;/p&gt;
&lt;h3 id="4-use-disagreement-as-a-trigger-not-an-anomaly"&gt;4. Use disagreement as a trigger, not an anomaly
&lt;/h3&gt;&lt;p&gt;If the route view looks right but the path looks wrong, do not treat that as an edge case to investigate later. Treat it as a primary indicator that your model of forwarding authority is incomplete.&lt;/p&gt;
&lt;h3 id="5-reject-ambiguous-designs-early"&gt;5. Reject ambiguous designs early
&lt;/h3&gt;&lt;p&gt;If a design requires too much explanation to answer “who really controls this packet path?”, it will be worse under incident pressure. Ambiguity is not sophistication.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; UDRs still matter with VNRA, but they are no longer sufficient evidence of deterministic packet steering. If you have only inspected the route table, you have reviewed intent; if you have observed the path, you have started to prove reality.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/diagnose-vm-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview" target="_blank" rel="noopener"
&gt;Azure Network Watcher overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/" target="_blank" rel="noopener"
&gt;Azure Virtual Network documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>