Synchronizace času

12. 10. 2000
Doba čtení: 5 minut

Sdílet

Určitě se vám stalo, že se vám hodiny na serveru více či méně předběhly a vy jste měli problémy. Linux sice již umí přenastavit hodiny při přechodu mezi zimním a letním časem, takže obvykle nejde posuny o celou hodinu, avšak tyto odchylky ztěžují život nejen administrátorům (špatný čas v syslogu, chodím pozdě na oběd :) ale také aplikacím (některé klient/server aplikace nemusejí fungovat nebo mohou fungovat špatně!) Naštěstí tu máme utilitky na synchronizaci času.

Systémové hodiny na Linuxu fungují jednoduše. Po startu počítače si systém přečte čas z hardwarových hodin (které jsou uloženy na PC v BIOSU) a nastaví si tak svůj systémový čas. Od této chvíle se o čas stará časovač procesoru. Samozřejmě že ten není úplně přesný (což není jeho hlavní úkol) a tak se systémový čas vždy trošičku odchýlí od toho hardwarového (a ten se obvykle také odchýlí od toho pravého). Při dalším restartu se sice čas znovu „upraví“ podle hardwarových hodin, jenže to nám moc nepomůže, protože předpokládám, že počítač slouží jako server a tudíž se nerestartuje velmi často.

Naštěstí, jak už je zvykem, v Linuxu se nabízí hned několik řešení. Záleží na vás, který zvolíte. Pokusím se popsat alespoň základní dvě a pokud existuje nějaká jiná a ještě jednodušší (či přesnější) metoda synchronizace času, rád si vše přečtu v diskuzním fóru.

1) rdate

Nejjednodušším způsobem jak synchronizovat čas ať už na serveru či na stanici je příkaz rdate, který vypíše čas na vzdáleném systému (pokud na něm běží služba time na portu 37). Jedná se o banální TCP/UDP protokol (viz. RFC 868), který přenese jediné 32 bitové číslo – počet sekund od 1.1.1900 (tento protokol tedy bude fungovat asi do roku 2036 ;) Jedním z jeho parametrů (a že je jich opravdu mnoho ;) je -s, který provede synchronizaci se systémovým časem. ALE POZOR! Jak klient tak server počítají s GMT (Greenwich Mean Time) časem. Proto po vypsání příkazu rdate ntp.nasa.gov získáte aktuální čas ve své časové zóně a nikoliv čas v zóně serveru! Pokud byste chtěli zjistit opravdový (reálný) čas na vzdáleném serveru, musíte to provést nějak jinak.

Tímto způsobem lze tedy bez velké námahy udržovat poměrně přesný čas (s odchylkou adekvátní rychlosti přenosu). Stačí to vložit do cronu. Synchronizaci každých 15 minut můžete docílit například tímto příkazem:

root# echo "0,15,30,45 * * * * /usr/bin/rdate -s \
ntps1-2.uni-erlangen.de &> /dev/null" >> /etc/crontab

Samozřejmě že místo německého stroje uvedete nějaký jiný s relativně přesným časem (např. o kterém víte, že na něm běží NTP) a hlavně – který je „blízko“ (ne fyzicky ale odezvou).

2) NTP a SNTP

Network Time Protocol (port 123) je o mnoho složitější a také přesnější. Synchronizované servery jsou to postaveny do hierarchické stromové struktury. Každý server je v určité vrstvě (stratum) při čemž v nejvyšší vrstvě číslo jedna (stratum-1) je server, který je připojen na nějaké externí časové zařízení (GPS, rádiové, atomové hodiny ap.) Jeho „potomci“ (např. třetí nebo čtvrté vrstvě) se považují za méně přesné. Protokol NTP stanoví maximální možný počet vrstev na 15.

NTP protokol má čtyři majoritní verze. V současné době je nejpoužívanější verze 3, avšak již je vyvinuta stabilní verze 4 (ta má již zkratku SNTP (Simple NTP) a je trošku zjednodušená – pozor na překlepy: SNTP, SNMP a SMTP jsou tři různé protokoly ;-). Pozor na názvy. Démoni verze 3 nebo nižší mají název xntpd a verze 4 se jmenuje ntpd. Všechny verze jsou zpětně kompatibilní. NTP démon umožňuje vzdálenou administraci (za pomoci ntpdc klienta) a autentizaci šifrováním. Tato autentizace je důležitá zejména proto, aby potencionální útočník nemohl zaslat matoucí informaci a změnit tak systémový čas. Instalace je snadná, instalační balíčky s binárkami se nacházejí jak na Red Hatu tak na Debianu. Ukázková konfigurace může vypadat například takto:

# seznam serveru
server ntp1.fau.de
server ntps1-0.uni-erlangen.de
server rustime01.rus.uni-stuttgart.de

# jeste nejake ty formalitky
driftfile /etc/ntp/drift
broadcastdelay  0.008
authenticate no

Hotovo. Otestování funkčnosti našeho nového démona provedeme utilitkami ntpq nebo ntpdate (což je obdoba příkazu rdate):

[root@cop /root]# ntpq
ntpq> help
Commands available:
addvars        associations   authenticate   cl             clearvars
clocklist      clockvar       cooked         cv             debug
delay          exit           help           host           hostnames
keyid          keytype        lassociations  lopeers        lpassociations
lpeers         mreadlist      mreadvar       mrl            mrv
ntpversion     opeers         passociations  passwd         peers
poll           pstatus        quit           raw            readlist
readvar        rl             rmvars         rv             showvars
timeout        version        writelist      writevar
ntpq> host time
current host set to time.loc
ntpq> rl
status=0664 leap_none, sync_ntp, 6 events, event_peer/strat_chg,
processor="i486", system="Linux2.2.14-5.0", leap=00, stratum=2,
precision=-17, rootdelay=39.269, rootdispersion=23.864, peer=7692,
refid=faui45.informatik.uni-erlangen.de,
reftime=bd855272.e6c2699c  Wed, Oct  4 2000  8:53:38.901, poll=10,
clock=bd8554c6.4b5dedf1  Wed, Oct  4 2000  9:03:34.294, state=4,
phase=0.009, frequency=-320.455, jitter=1.262, stability=0.017
ntpq> quit
[root@cop /root]#

Nezoufejte pokud server píše zprávy typu „Server is not synchronized!“ a v klidu vyčkejte, protože proces synchronizace někdy trvá i několik minut! Situace se nám poněkud komplikuje, pokud chceme službu NTP nabízet. V tomto případě si malinko „zakonfigurujeme“ a z bezpečnostních důvodů určíme, komu bude server odpovídat.

Které řešení je tedy nejvýhodnější? Pokud máte zajistit čas pro celou síť je vhodné, aby se např. brána či firewall synchronizovala přes NTP. Zbytek sítě pak bude bráně „věřit“ a budou se synchronizovat podle ní (existuje spoustu shareware/freeware utilitek i pro Windows). A jaký NTP server zvolit? Předně se zeptejte svého providera, ten by vám měl sdělit adresu nejvhodnějšího stroje (buď bude mít nějaký svůj nebo bude znát nějaký vhodný nadřízený). Pokud se informace od providera nedozvíte, použijte seznamy veřejných NTP serverů, které naleznete na konci tohoto článku.

bitcoin_skoleni

Mám tady ještě malou výzvu pro časové odborníky. Zajímal by mě rozdíl mezi GMT a UTC – tedy zda nějaký existuje a také jestli má GMT resp. UTC vliv na DST. Trošku jsem se při psaní tohoto článku zamotal a abych pravdu řekl, už ani nevím, v jaké časové zóně jsme. Jeden systém mi tvrdí +1, druhý zase +2 (ovšem všichni se shodují na tom, že je právě dvanáct hodin a já jdu tedy na oběd… :). Přeji hezký den.

Odkazy:
www.NTP.org
RFC 868 – Time Protocol
RFC 1059 – Network Time Protocol v1
RFC 1119 – Network Time Protocol v2
RFC 1305 – Network Time Protocol v3
RFC 2030 – Simple Network Time Protocol v4
Seznam veřejných STRATUM-1 NTP serverů
Seznam veřejných STRATUM-2 NTP serverů
NTP FAQ

Autor článku