Tech Life

Ilustrační obrázek

Cachování překladů doménových jmen na IP adresy

03. 11. 2009 16:45    kategorie: Tech Life    autor: VMe    komentářů: 1

Pokud v Javě při TCP/IP komunikaci někde zadáváte síťového hosta pomocí doménového jména místo IP adresy, dříve nebo později dojde k pokusu o překlad jména hosta na jeho adresu. Vlastní implementaci jmenné služby, která provádí skutečný překlad, je možné vyměnit, i když typicky to bude DNS. Nezávisle na použité jmenné službě ale Java výsledky překladů adres cachuje v paměti.
 

Pokud v Javě při TCP/IP komunikaci někde zadáváte síťového hosta pomocí doménového jména místo IP adresy, dříve nebo později dojde k pokusu o překlad jména hosta na jeho adresu. Vlastní implementaci jmenné služby, která provádí skutečný překlad, je možné vyměnit, i když typicky to bude DNS. Nezávisle na použité jmenné službě ale Java výsledky překladů adres cachuje v paměti.

Změny v konfiguraci DNS (například úprava /etc/hosts) se proto nemusí z pohledu běžícího JVM vůbec projevit.

Jak toto cachování funguje (v implementaci Javy od SUNu) a jak tento mechanismus ovlivnit, ukážeme ve zbytku článku.

IP adresa je v Javě reprezentována třídou InetAddress a tato třída také obsahuje metody pro překlad DNS jmen na adresy (a opačně).

Vlastní překlad provádí statická metoda InetAddress.getByName(), která se typicky nakonec zavolá, ať už jsme doménové jméno zadali do jakékoliv aplikace, která komunikuje přes TCP/IP. Metoda provedení překladu deleguje na nainstalovanou implementaci jmenné služby (tedy typicky DNS). Před tím ale kontroluje, jestli výsledek překladu pro dané jméno hosta už nemá v cache.

Přímo ve třídě InetAddress jsou totiž statická pole addressCache a negativeCache, obsahující cache pro úspěšné i neúspěšné překlady. Tyto cache není možné rozumně invalidovat (kromě restartu JVM), je ale možné nastavit dobu platnosti záznamu v cache (TTL).

Výchozí hodnoty TTL jsou v JRE6:

  • úspěšné překlady: nekonečno, pokud je nainstalován SecurityManager, jinak 30 sekund
  • neúspěšné překlady: 10 sekund

V JRE5:

  • úspěšné překlady: nekonečno
  • neúspěšné překlady: 10 sekund

Je na místě poznamenat, že časově neomezená životnost pozitivních překladů v cache slouží, spíše než pro zvýšení výkonu, k ochraně před DNS spoofingem.

Hodnoty TTL pro oba typy cache je možné změnit pomocí dvou Java Security vlastností:

  • networkaddress.cache.ttl - TTL v sekundách pro pozitivní cache (-1 znamená nekonečno)
  • networkaddress.cache.negative.ttl - TTL v sekundách pro negativní cache (-1 znamená nekonečno)

Jde o Security vlastnosti, jejichž hodnoty jsou navíc relevantní v okamžiku inicializace třídy InetAddress, takže nevhodnějším místem k jejich nastavení bude soubor java.security, který se nachází v podadresáři lib/security instalace JRE.

Tento článek neberte jako implulz k hromadnému přenastavení TTL pro cache překladů DNS jmen, ale hlavně jako informaci, že k nějakému cachování dochází a že je nutné s ním počítat.

Sdílet odkaz:
tisk

Diskuze k článku

Anonym, 16.11.2009 22:07

:D

Přidat příspěvek

 

Kontakt pro média


Máte zájem o další informace, odborný článek či přednášku na konferenci? Kontaktujte nás prosím na pr@etnetera.cz.

RSS - Tech life


RSS kanál Tech Life Blogu

Offlineblog

Offlineblog

Ljama


Komix z prostředí imaginární firmy.

ljama

Ještě jste ho nečetli? Tak tudy ...

 
Doporučujeme: Nabídka práce, volná pracovní místa - pracovní portál SPRÁVNÝKROK.CZ