<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Azure Firewall on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/tags/azure-firewall/</link><description>Recent content in Azure Firewall on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 25 Oct 2026 00:00:00 +1100</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/tags/azure-firewall/rss.xml" rel="self" type="application/rss+xml"/><item><title>Disable Peering Route Propagation in Azure (Preview)</title><link>https://blog.brewedinthecloud.com/p/azure-peering-route-propagation-preview/</link><pubDate>Sun, 25 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-peering-route-propagation-preview/</guid><description>&lt;p&gt;You&amp;rsquo;ve pointed a summary route at the firewall, but traffic to a peered spoke still goes directly to the destination. Check the prefixes: a more-specific system peering route can beat your user-defined route (UDR).&lt;/p&gt;
&lt;p&gt;For engineers operating hub-and-spoke inspection, &lt;strong&gt;disable peering route propagation (preview)&lt;/strong&gt; offers a way to remove those competing peering routes instead of maintaining an override for every spoke. The useful outcome is less repeated route maintenance while keeping selected traffic on the inspection path.&lt;/p&gt;
&lt;p&gt;There is one eligibility check to make before trying it: &lt;strong&gt;during preview, the firewall or network virtual appliance (NVA) next hop must be in the same VNet as the source workload NIC.&lt;/strong&gt; A workload in the hub can meet that rule with a hub appliance. If your main problem is steering spoke-originated traffic through a firewall located only in the peered hub, this preview doesn&amp;rsquo;t currently solve it. That is a restriction of this preview feature, not a prohibition on ordinary UDR service chaining.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Peering provides connectivity; routes determine which next hop a packet uses. This setting removes system-generated peering routes for supported workloads on the subnets associated with a route table. Your UDRs still have to supply the intended path.&lt;/p&gt;
&lt;p&gt;Consider this illustrative hub-side workload, with the appliance in the same VNet and two peered spokes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Next hop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;System peering route&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Peering to spoke A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System peering route&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.21.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Peering to spoke B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User-defined summary&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.0/15&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hub appliance at &lt;code&gt;10.0.2.4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Before suppression, traffic to &lt;code&gt;10.20.1.10&lt;/code&gt; follows the &lt;code&gt;/16&lt;/code&gt; peering route, not the &lt;code&gt;/15&lt;/code&gt; UDR. Longest prefix match comes first; being user-defined doesn&amp;rsquo;t make a broader route win. After suppression, those peering routes are removed from consideration, allowing the summary UDR to select the appliance, assuming no other winning route exists.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the change: remove the competing automatic routes, not change Azure&amp;rsquo;s route-precedence rules.&lt;/p&gt;
&lt;p&gt;You can already override those system routes with matching-prefix UDRs: at an equal prefix length, a UDR takes precedence over a system peering route. This preview doesn&amp;rsquo;t introduce inspection as a new capability. It exchanges repeated per-peer route configuration for responsibility for every required peering path affected by suppression. &lt;strong&gt;Less route maintenance, more responsibility for route completeness&lt;/strong&gt; is the trade-off.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Peering stays configured. Whether traffic still gets through depends on the replacement routes and the appliance path.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;The control lives on the route table as &lt;code&gt;disablePeeringRoute&lt;/code&gt;. By default, &lt;code&gt;None&lt;/code&gt; keeps system-generated peering routes; set it to &lt;code&gt;All&lt;/code&gt; to suppress generated IPv4 and IPv6 peering routes for supported workloads on associated subnets.&lt;/p&gt;
&lt;p&gt;The scope is easy to misread: it&amp;rsquo;s a route-table setting, not a switch on each peering connection. Every associated subnet inherits it for supported workloads. It doesn&amp;rsquo;t let you suppress just one chosen peer. Use separate tables when subnet routing policies differ.&lt;/p&gt;
&lt;p&gt;Before configuration, register the &lt;code&gt;Microsoft.Network/AllowDisablePeeringRoutes&lt;/code&gt; preview feature in the subscription that contains the route table. The setting is available through the Azure portal, CLI, and PowerShell; REST, ARM, and Bicep deployments need route-table API version &lt;code&gt;2025-07-01&lt;/code&gt; or later.&lt;/p&gt;
&lt;p&gt;For PowerShell, use Az.Network 8.1.0 or later. Sign in, select the subscription that owns the route table, and request preview registration once:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Connect-AzAccount&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzContext&lt;/span&gt; &lt;span class="n"&gt;-SubscriptionId&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;subscription-id&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzProviderFeature&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-FeatureName&lt;/span&gt; &lt;span class="n"&gt;AllowDisablePeeringRoutes&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Registration may take time. Run the following check again later if it isn&amp;rsquo;t ready; there&amp;rsquo;s no need to repeat the registration request. Refresh the network provider only after the feature reports &lt;code&gt;Registered&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$feature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzProviderFeature&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-FeatureName&lt;/span&gt; &lt;span class="n"&gt;AllowDisablePeeringRoutes&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$feature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;RegistrationState&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Registered&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Preview feature state is &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$feature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegistrationState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;. Wait for Registered, then run this block again.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzResourceProvider&lt;/span&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The next example assumes the route table already exists and is associated with the source subnet. Choose a destination prefix that matches only traffic intended for inspection, and use an appliance private IP in the same VNet as the source workload NIC. It adds the UDR and enables peering-route suppression together:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;resource-group&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTableName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;route-table-name&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;inspect-spoke-ranges&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$destinationPrefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;summarized-spoke-prefix&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$appliancePrivateIp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;nva-private-ip&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzRouteTable&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$routeTableName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="nv"&gt;$routeName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Route &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$routeName&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; already exists. Review or update it explicitly before continuing.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Add-AzRouteConfig&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$routeName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-AddressPrefix&lt;/span&gt; &lt;span class="nv"&gt;$destinationPrefix&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-NextHopType&lt;/span&gt; &lt;span class="n"&gt;VirtualAppliance&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-NextHopIpAddress&lt;/span&gt; &lt;span class="nv"&gt;$appliancePrivateIp&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-RouteTable&lt;/span&gt; &lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DisablePeeringRoute&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;All&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzRouteTable&lt;/span&gt; &lt;span class="n"&gt;-RouteTable&lt;/span&gt; &lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updatedRouteTable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzRouteTable&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$routeTableName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updatedRouteTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DisablePeeringRoute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updatedRouteTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Routes&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="nv"&gt;$routeName&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AddressPrefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NextHopType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NextHopIpAddress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is a documented configuration example, not a report of an executed Azure test. It leaves existing routes and subnet associations in place; it doesn&amp;rsquo;t configure the appliance or its onward path. The final output confirms saved configuration, not effective forwarding. Review the existing routes and all associated subnets before applying it; pause other writers to the table while making the change.&lt;/p&gt;
&lt;p&gt;To restore peering-route propagation, retrieve the table again, set &lt;code&gt;DisablePeeringRoute&lt;/code&gt; to &lt;code&gt;&amp;quot;None&amp;quot;&lt;/code&gt;, and save it with &lt;code&gt;Set-AzRouteTable&lt;/code&gt;. That alone isn&amp;rsquo;t a full rollback: the added UDR remains, and existing overrides still affect route selection. Preserve the original configuration and restore the routes your change plan requires.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The best fit is a growing hub-and-spoke network where eligible source subnets need the same inspection path to multiple spokes. Microsoft&amp;rsquo;s overview describes using suppression with a summary UDR to avoid maintaining an override for every peer. The day-to-day benefit is fewer route edits when another spoke joins that same routing policy.&lt;/p&gt;
&lt;h3 id="a-more-manageable-hub-and-spoke-route-table"&gt;A more manageable hub-and-spoke route table
&lt;/h3&gt;&lt;p&gt;Take a shared-service workload in the hub that contacts applications in the two spokes from the earlier example. Both destinations require inspection by the hub appliance. Without suppression, you might maintain &lt;code&gt;/16&lt;/code&gt; UDR overrides to beat the matching system peering routes. With suppression on the source subnet&amp;rsquo;s route table, the &lt;code&gt;/15&lt;/code&gt; summary can express that shared intent.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
subgraph Hub VNet
Source["Hub source subnet"]
Appliance["Firewall or NVA"]
end
Spoke["Destination in peered spoke VNet"]
Source --&gt;|"UDR: spoke prefix"| Appliance
Appliance --&gt;|"Forwarded traffic over peering"| Spoke
&lt;/div&gt;
&lt;p&gt;The appliance must still forward traffic over peering to the destination. Don&amp;rsquo;t apply the source subnet&amp;rsquo;s suppression policy blindly to the appliance subnet: removing the appliance&amp;rsquo;s onward routes or sending it back to itself can break the path you&amp;rsquo;re trying to build.&lt;/p&gt;
&lt;p&gt;For a stateful inspection design, the spoke&amp;rsquo;s response to the hub workload must also traverse the intended appliance path. The spoke may need a matching-prefix UDR for that return destination to override its direct peering route; changing the hub source table doesn&amp;rsquo;t configure this return route. The example shows the outbound route-selection change, not a complete bidirectional deployment.&lt;/p&gt;
&lt;h3 id="when-i-would-keep-explicit-routes"&gt;When I would keep explicit routes
&lt;/h3&gt;&lt;p&gt;Suppose the next spoke needs a different appliance or must bypass this inspection path. Don&amp;rsquo;t widen the summary just to keep the table short. Keep its route explicit and review the remaining effective routes before enabling suppression for that source subnet.&lt;/p&gt;
&lt;p&gt;My recommendation is to use this where the routing intent is genuinely repetitive and the address plan makes summarization safe. If every spoke needs an exception, a smaller table isn&amp;rsquo;t worth making the packet path harder to explain. This feature controls route propagation; it doesn&amp;rsquo;t centralize firewall management or replace destination-specific policy.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The outage pattern is deceptively quiet: peering still shows connected, but an application times out because its old system route is gone and its replacement UDR is missing, wrong, or points to an appliance that cannot forward the flow. A healthy peering status does not validate the new path.&lt;/p&gt;
&lt;h3 id="suppression-covers-more-than-the-summary"&gt;Suppression covers more than the summary
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;All&lt;/code&gt; suppresses generated IPv4 and IPv6 peering routes, not just the destinations covered by your new UDR. Inventory every peer and required destination first. One IPv4 summary won&amp;rsquo;t replace other IPv4 paths or any IPv6 paths you still need.&lt;/p&gt;
&lt;h3 id="route-selection-isnt-end-to-end-inspection"&gt;Route selection isn&amp;rsquo;t end-to-end inspection
&lt;/h3&gt;&lt;p&gt;Other routes can still win. This property doesn&amp;rsquo;t disable BGP route propagation, and it doesn&amp;rsquo;t remove existing UDRs. Check the effective route for each test destination rather than assuming suppression makes the summary authoritative.&lt;/p&gt;
&lt;p&gt;Forwarding, firewall policy, NSGs, peering settings for forwarded traffic, and the return path are separate work. For a custom NVA, verify IP forwarding at the Azure NIC and appliance/OS layers. With a stateful firewall, asymmetric return traffic can break an otherwise plausible outbound design.&lt;/p&gt;
&lt;h3 id="preview-workload-and-tooling-exclusions"&gt;Preview workload and tooling exclusions
&lt;/h3&gt;&lt;p&gt;Azure BareMetal Infrastructure workloads aren&amp;rsquo;t covered: they retain standard longest-prefix-match behavior even when sharing a subnet with supported workloads. Terraform currently requires the AzAPI provider rather than AzureRM. Manage this preview setting on the route table, not through Azure Virtual Network Manager routing rule collections. Behavior and availability may change; check the current documentation before deployment.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Start with a dedicated canary source subnet and route table, not a table shared across production. Capture the original configuration and effective routes, then record a small test matrix: source NIC, destination IP, protocol/port, expected next hop, and expected application result. Include both inspected destinations and destinations outside the summary.&lt;/p&gt;
&lt;p&gt;After applying the change, check three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Route selection:&lt;/strong&gt; generated peering routes are suppressed for the supported source NIC, and the intended UDR selects the appliance for each inspected destination. Required paths outside the summary still have the correct route.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actual traffic:&lt;/strong&gt; bidirectional application tests succeed, and appliance telemetry shows the tested flows being processed. A successful connection alone doesn&amp;rsquo;t prove inspection; effective routes alone don&amp;rsquo;t prove packet delivery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance reduction:&lt;/strong&gt; compare the routes before and after. Retire redundant per-spoke overrides only after validating the replacement path; the PowerShell example deliberately doesn&amp;rsquo;t delete them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If a required flow fails or takes an unexpected path, stop expansion and restore the captured route configuration, including the suppression setting. Agree on who performs that rollback before the change window. Repeat the checks when adding peers, changing address ranges, or introducing route exceptions.&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; Use this preview when many routes express the same inspection policy, not simply when the route table looks busy. Keep explicit routes where exceptions carry important intent. A shorter route table is only an improvement if the resulting packet path remains easy to explain.
&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/configure-disable-peering-route-propagation?tabs=portal" target="_blank" rel="noopener"
&gt;Configure disable peering route propagation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-peering-overview#disable-peering-route-propagation-preview" target="_blank" rel="noopener"
&gt;Azure Virtual Network Peering: disable peering route propagation (preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;User-defined routes overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>