IPv6 Client Service
I got a Windows Server 2012 which provides DHCPv4 and DHCPv6.
The NIC on the Server got 2 IPv6 addresses. I found out that the second IPv6 comes from
the "IPv6 Client Service" which (only the service - not the IPv6) I do need for another Service, but I don't need the given IPv6 address - in fact the v6 IP generates some errors.
I know theres a netsh command which deletes this address, but unfortunately the service creates another one after a while. Is there a way to disable the generation of another IPv6 from the "IPv6 Client Service" without disabling the whole service?
/edit:
Beschreibung. . . . . . . . . . . : Gigabit-Netzwerkverbindung Intel(R) 82574L<br/>
Physische Adresse . . . . . . . . : ??-??-??-??-??-??<br/>
DHCP aktiviert. . . . . . . . . . : Nein<br/>
Autokonfiguration aktiviert . . . : Ja<br/>
IPv6-Adresse. . . . . . . . . . . : 2a02:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx(Bevorzugt)<br/>
IPv6-Adresse. . . . . . . . . . . : 2a02:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx(Bevorzugt)<br/>
Lease erhalten. . . . . . . . . . : Montag, 10. November 2014 17:17:42<br/>
My output shows that I got 2 IPv6 addresses. One comes from the DHCP Server, which the server gave it by itself, and the other one is the satic address.
Why does the server use an IPv6 address from it's own pool even I disabled the m flag and the router discovery?
/edit 2:
I just found a solution. While The Server 2008 R2 does not show this characteristics with IPv6 the Server2012 R2 does. This is definitely not desired.
While you can delete the second IPv6 (random IPv6 from the IPv6 pool) with a netshell command
Netsh int ipv6 delete address NIC ADDRESS
the server itself asks for another IPv6 after a while. Even if all the needed flags are 0.
The solution for this bug is to use 2 cmdlets to active the flags and deactivate them directly after it. They're even more powerful than the netshell commands - even if they do the same on the surface.
Here are the commands:
$a = "INTERFACENAME"
Set-NetIPInterface "$a" -AddressFamily ipv6 -RouterDiscovery Enabled
Set-NetIPInterface "$a" -AddressFamily ipv6 -ManagedAddress Enabled
Set-NetIPInterface "$a" -AddressFamily ipv6 -RouterDiscovery Disabled
Set-NetIPInterface "$a" -AddressFamily ipv6 -ManagedAddress Disabled
Now you need to save this as a powershell script and add this in the task scheduler. You only need to perform it after a reboot.
Open the task scheduler, create a new task, set the trigger to "reboot" and the action to this :
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
-command "C:\Scripts\PATH_TO_THE_SCRIPT.ps1"
The first one is the path to the powershell and the second is the path to the script. Now you only need to specify to run the script on reboot with admin privileges. I recommand to use the system user to run this script.
Now it's time for a reboot. Perform it and open a shell, type in ipconfig /all
have a look to your static IPv6 and the not existing IPv6 from the DHCPv6 pool.
/edit 3 (last edit and the solution):
After that the Server still sends DHCPv6 requests to the multicast address ff02::1:2.
Use Wireshark to display it.
This behavior occurs in Windows 8, Windows 8.1, Windows 7 and Windows Server 2012.
In Windows 8, Windows 8.1 and Server 2012 you can disable the DHCPv6 request by simply perfom this nice little CMDLet (it does need admin rights):
Set-NetIPInterface INTERFACENAME -AddressFamily IPv6 -DHCP Disabled
Solution 1:
Turn off the autonomous flag and turn on the manual flag on your router. Set the static address on the nic to use prefix 128 and you will be gold.
You can diagnose stateless address assignment using get-netipaddress in powershell which will display where the system got the address from.
NOTE: If autonomous flag is on, windows server (even setup as dhcp) will clear its manual address and use the stateless.
EDIT: I forgot to add this will setup Stateful IPv6, if that is not your goal then ignore this answer.
EDIT: Also see: IPv6 address preference and privacy extensions on Windows 7 and Ubuntu 12.04