Windows 2008/7/Vista a vícero IP adres na jedné NIC
Teď jsem si tak ukázkově nabil ústa, že si to musím ihned poznamenat. I když na tohle bych asi jen tak nezapomněl. Už od dob NT4 má člověk zafixováno, že pokud zadá na jednu síťovou kartu vícero IP adres, pro odchozí provoz bude použita ta prvně zadaná, tj. ta, která se zobrazí v nastavení TCP/IP, kde volím mezi statickou a dynamickou (DHCP) adresou. Suverénně jsem tak dnes nakonfiguroval Windows 2008 Web Server R2 a zaboha jsem nemohl přijít na to, proč vše nefunguje tak, jak má. Velké překvapení nastalo po několika hodinách bádání – od dob Vist je vše jinak.
Až do dnešního dne jsem neměl o nové funkcionalitě potuchy a dá se říci, že jsem s ní neměl ani žádné problémy, pokud tedy nepočítám problémy s registrací všech IP adres Active Directory či SBS serveru v interní DNS zóně. Zpětně si teď uvědomuji, že jsem na problém nenarazil dřív, protože shodou okolností byla vždy IP adresa, pod kterou jsem chtěl navazovat komunikaci ze serveru, vždy nejnižší v celé používané množině.
Dnes tomu ale bylo jinak. Primární adresou serveru, bylo 192.168.6.55/24,DGW 192.168.6.1. Následně jsem přiřadil serveru adresu 192.168.6.31/24, na které měla běžet webová aplikace v IIS 7.5. Zaboha jsem nechápal, proč to nefunguje, až si kolega vypsal route print a v té samé době já ověřil adresu pomocí http://whatismyip.com. Zjistili jsme, že coby odchozí adresa je používána .31 a nikoliv .55, jak byl windows administrátor dobrou desítku let zvyklý. Zkoušel jsem různě adresy odebírat a přiřazovat, až jsem pojal podezření, že systém si automaticky zvolí adresu s nejnižší hodnotou. Proto jsem dočasně přidal na server adresu 192.168.6.9/24 a bylo jasno – odchozí adresa se v route print okamžitě změnila na nejnižší .9.
Když jsem věděl, co mám hledat, nebylo to už příliš složité. Dospěl jsem k tomuto článku, který mne navedl na výborný blog článek a potvrdil mi mé podezření a zároveň mne navedl na dvojici MSKB článků. Od Vist/Windows Serveru 2008 už koncept primární IP adresy neexistuje. Všechny IP adresy jsou plnohodnotné a je na systému, kterou použije. Nejčastěji jde o nejnižší adresu (píšu pořád o případě, kdy mám vícero IP adres na jedné síťové kartě).
Tohle je mimochodem i problém s AD a SBS2008/2011, kdy MS podporuje pouze instalace, ve kterých má server přiřazenu pouze jednu IP adresu. Nerad bych se mýlil, ale myslím si, že to samé řešení, ke kterému za chvilku dojdu, by vyřešilo i problémy s registracemi IP adres v DNS a další nechtěné situace v SBS2008/2011.
Princip je takový, že mám jednu IP adresu přiřazenou serveru a tato adresa na něm vždy bude. Je to zároveň adresa, pod kterou vystupuje server do světa, tj. navazuje na ní veškerou odchozí komunikaci. Pak můžu mít přidělenu jednu či více IP adres, které budou sloužit pouze pro příchozí komunikaci, tj. na serveru běží něco, co vyžaduje samostatnou IP adresu – může to být Exchange, IIS, Subversion, Mercurial, prostě cokoliv dalšího.
Když o neexistenci konceptu primární IP adresy vím, můžu s tím počítat již během IP adresace a vyhradit nejnižší IP adresu serveru. Jsou však situace, kdy to možné není a zjevně to vadilo více uživatelům. Microsoft totiž na stížnosti reagoval a vydal dvojici MSKB.
MSKB 975808 pro Vista SP2 a Windows Server 2008 SP2 – existuje post-SP2 hotfix
MSKB 2386184 pro Windows 7 a Windows Server 2008 R2 – existuje pre-SP1 hotfix. Z toho vyplývá, že na systémech se SP1 již není potřeba žádný hotfix instalovat.
Hotfixy, případně SP1 pro W7/W2008R2 zavádí nový parametr Netsh nazvaný SkipAsSource. Tj. dodatečné IP adresy není možné zadat přímo v GUI, jak byl člověk zvyklý, ale přes netsh. Pokud již byly IP adresy přes GUI zadány, musí se nejprve odebrat.
Přidání dodatečné (sekundární) IP adresy:
netsh int ipv4 add address <nazev_sitove_karty> <IP_adresa/subnet> skipassource=true
např.
netsh int ipv4 add address public 192.168.6.31/24 skipassource=true
Výpis (kontrola) dodatečných IP adres:
netsh int ipv4 show ipaddresses level=verbose
Ověřeno, funguje to parádně. V brzké době si ověřím ještě chování SBS2011 s vícero IP adresami (ačkoliv bude SBS BPA držkovat, myslím, že to bude funkční).
Doplnění 14. 1. 2015:
Dnes jsem se s tímto problémem opět potkal. Z výše uvedeného to přesně nevyplývá, ale v odkazovaných článcích to vysvětlené je. Poněkud nešťastně jsem uvedl, že "vyhrává" nejnižší adresa. To není pravda, vždy je to vztaženo k adrese DGW. Tj. je to vždy "nejbližší" adresa. Pokud je DGW .91, tak ze dvou adres .10 a .40 bude použita .40, která má s DGW "společného" víc.