Solution #1: Add a prefix policy to prefer IPv4 addresses over IPv6
Prefix policy table is similar a routing table, it determines which IP addresses are preferred when making a connection. Note that higher precedence in prefix policies is represented by a lager "precedence" value, exactly opposite to routing table "cost" value.
Default Windows prefix policy table:
C:\>netsh interface ipv6 show prefixpolicies
Querying active state...
Precedence Label Prefix
---------- ----- --------------------------------
50 0 ::1/128
40 1 ::/0
30 2 2002::/16
20 3 ::/96
10 4 ::ffff:0:0/96
5 5 2001::/32
Note that IPv6 addresses (::/0) are preferred over IPv4 addresses (::/96, ::ffff:0:0/96).
We can create a policy that will make Hurricane Electric IPv6 tunnel less favourable than any IPv4 address:
netsh interface ipv6 add prefixpolicy 2001:470::/32 3 6
2001:470::/32 is Hurricane Electric‘s prefix, 3 is a Precedence (very low) and 6 is a Label.
I could have used a more generic prefix, but I wanted to make sure than if and when I get a direct IPv6 connectivity from an ISP, it will take precedence over IPv4.
If you adapt this solution, you need to substitute an appropriate IPv6 prefix instead of my Hurricane Electric one.
Solution #2: Tweak registry to make Windows always prefer IPv4 over IPv6
This solution is more generic, but more invasive and less standards-compliant. In the end, Windows will still modify the prefix policy table for you.
- Open RegEdit, navigate to
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters
- Create
DisabledComponents
DWORD registry value, set its value to 20 (Hexadecimal). SeeMicrosoft KB 929852 for more info about this registry key, especially ifDisabledComponents
already exists on your system. - Reboot.