Prioritizing Windows Network Connections
Windows automatically prioritizes network connections that have multiple routes available based on the the interface speed, for example if you are connected to the same network through WiFi and hard-wire. It may, at times, be necessary to prioritize network traffic out a different interface, for example if you are testing a specific network connection. This can be done by adjusting the IPv4 Interface Metric on the adapters.
Viewing Interface Metrics
The following command will output the network interfaces on the local computer sorted by the interface metric. Windows will prioritize network traffic over lower metrics.
> Get-NetIPInterface | Sort-Object InterfaceMetric
ifIndex InterfaceAlias AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp ConnectionState PolicyStore
------- -------------- ------------- ------------ --------------- ---- --------------- -----------
58 vEthernet (Ethernet 3) IPv4 1500 15 Disabled Connected ActiveStore
46 vEthernet (vEthernet (LAN)) IPv4 1500 15 Disabled Connected ActiveStore
40 vEthernet (Default Switch) IPv4 1500 15 Disabled Connected ActiveStore
21 vEthernet (LAN) IPv4 1500 25 Enabled Connected ActiveStore
1 Loopback Pseudo-Interface 1 IPv6 4294967295 75 Disabled Connected ActiveStore
1 Loopback Pseudo-Interface 1 IPv4 4294967295 75 Disabled Connected ActiveStore
52 Ethernet 3 IPv4 1500 99 Enabled Connected ActiveStore
Get-NetIPInterface | Sort-Object InterfaceMetric
Viewing Routes for a Specific Address
If you’d like to look at a route for a specific destination, you can search based on the network prefix:
> Get-NetRoute -DestinationPrefix 192.168.2.0/24
ifIndex DestinationPrefix NextHop RouteMetric ifMetric PolicyStore
------- ----------------- ------- ----------- -------- -----------
52 192.168.2.0/24 0.0.0.0 256 99 ActiveStore
If you want to query for addresses on the internet, you’ll most likely need to look at the default route:
> Get-NetRoute -DestinationPrefix 0.0.0.0/0
ifIndex DestinationPrefix NextHop RouteMetric ifMetric PolicyStore
------- ----------------- ------- ----------- -------- -----------
52 0.0.0.0/0 192.168.2.1 0 25 ActiveStore
21 0.0.0.0/0 192.168.86.254 0 25 ActiveStore
As you can see 0.0.0.0/0 has 2 possible routes with the same metric, so you can’t guarantee which one traffic will take.
Changing Interface Metrics
To change the metrics for a specific interface, you can navigate to the Advanced IPv4 settings in the network control panel, or just change it with PowerShell
> Set-NetIPInterface -ifIndex 52 -InterfaceMetric 99
The command won’t return anything, but running the Get-NetIPInterface
command again will show that the interface has a metric of 99 which is higher than anything Windows will automatically assign to an interface.
A PowerShell Function
As a parting note, I decided to write a simple function in PowerShell to help gather all the pertinent information that I often times need to get quickly. The below function returns the following information about each network interface:
- Interface Alias - What you can expect to see in Control Panel as the name of each interface
- Interface Index - The index that you'd use for other PowerShell networking commands
- Interface Description - The description that you'll see in Control Panel
- Address - The CIDR representation of the IP address and subnet mask
- Metric - I don't think I have to explain this again
- Speed - The physical link speed
function Get-NetInterfaceInformation {
[CmdletBinding()]
param (
[ValidateSet("IPv4","IPv6")]
[String]$AddressFamily
)
Get-NetIPInterface @PSBoundParameters | Sort-Object InterfaceMetric | ForEach-Object {
if($_.ifIndex -eq 1) { return; }
$adapter = $_ | Get-NetAdapter
$address = $_ | Get-NetIPAddress
[PSCustomObject]@{
InterfaceAlias=$_.InterfaceAlias;
InterfaceIndex=$_.ifIndex;
InterfaceDescription=$adapter.InterfaceDescription;
Address="$($address.IPAddress)/$($address.PrefixLength)"
Metric=$_.InterfaceMetric;
Speed=$adapter.LinkSpeed;
}
}
}