V roce 2011 jsem si na tomto blogu poznamenal a sám sobě opakovaně vysvětlil, jak funguje koncept vícero IP adres na jedné síťovce ve Windows od Vist, resp. Serveru 2008. Jsme u Serveru 2016 a vše funguje pořád stejně. A pořád se najdou situace, kdy se zaseknu a musím si tenhle článek starý 6 let najít, přečíst a znovu pochopit :) Naposledy dneska. Každopádně pokrok nezastavíš a tak jsem si řekl, že netsh je překonané a že by to chtělo způsob, který nebude vyžadovat odebrání IP adresy, která byla původně přidaná přes GUI. A jo, ono to už jde!
Připomeňme si nejdříve starý způsob:
Přidání dodatečné (sekundární) IP adresy:
netsh int ipv4 add address <nazev_sitove_karty> <IP_adresa/subnet> skipassource=true
Výpis (kontrola) dodatečných IP adres:
netsh int ipv4 show ipaddresses level=verbose
A proč vlastně dělá vícero IP adres neplechu? Ze tří důvodů:
- každá IP adresa se skipassource=false (tj. default) se registruje do DNS
- stroj použije pro odchozí komunikaci tu IP adresu, která má bitově "nejvíce společného" s DGW adresou
- při komunikaci s něčím ve stejném subnetu se použije ta lokální IP adresa, která má bitově "nejvíc společného" s cílem.
A teď hurá na PowerShell. Dlužno podotknout, že níže popisované je funkční až od PowerShellu 3.0, ale to by snad už neměl být problém. Našel jsem geniální článek Use PowerShell to Change IP Behavior with SkipAsSource.
Jak si vypsat adresy, které mohou být použity pro odchozí komunikaci?
Get-NetIPAddress | where SkipAsSource -eq $False
Jak si vypsat adresy, které nesmí být použity pro odchozí komunikaci?
Get-NetIPAddress | where SkipAsSource -eq $True
Dříve bylo pro změnu nutné IP adresu komplet odebrat a pak přidat přes netsh. Nyní je to jednodušší.
Jak změnit příznak u jedné adresy?
Get-NetIPAddress -IPAddress '192.168.137.12' | Set-NetIPAddress -SkipAsSource $True
A jak změnit všechny IP adresy (krom požadované primární) na nějaké síťovce na dodatečné IP adresy, které nesmí být použity pro odchozí komunikaci? Dříve noční můra, s PowerShellem sranda:
$primaryIP = “192.168.130.2”
$netInterface = “Ethernet”
Get-NetIPAddress -InterfaceAlias $netInterface | Where-Object {$_.AddressFamily -eq “IPv4” -and $_.IPAddress -ne $primaryIP} | Set-NetIPAddress -SkipAsSource $True
To je paráda.