Figured out a partial solution:
The idea is this:
- Since the best way to inject routes into VPN Gateway's internal routing table is by BGP, nothing prevents us from establishing BGP-over-IPsec peerings between the Gateway and our firewall VMs.
- So the firewall VMs will dynamically learn Spoke VNETs' prefixes from Azure Route Server and re-advertise them to the VPN Gateway instances.
- The VPN Gateway will be deployed in a separate VNET, to avoid its
GatewaySubnet
learning direct routes to Spokes.
The main problem of this solution is that it requires Active-Passive firewall setup, to keep traffic symmetry.
Documented more details here:
Update: judging by the "Direct routing to NVA instances for dual-role connectivity and firewall NVAs" section in Virtual WAN documentation, Microsoft themselves didn't find a good active-active solution for this problem. :-)
Azure's software-defined networking platform doesn't guarantee flow-level symmetry, meaning the inbound flow to Azure and outbound flow from Azure can land on different instances of the NVA. This results in asymmetric routing which is dropped by stateful firewall inspection. Therefore, it isn't recommended to use active-active connectivity patterns where an NVA is behaving as a dual-role NVA unless the NVA can support asymmetric forwarding or support session sharing/synchronization.