Órák szinkronizálása

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(Fogalmak)
a (NTP - Network Time Protocol)
 
(2 szerkesztő 26 közbeeső változata nincs mutatva)
8. sor: 8. sor:
   
 
'''stepping''' - ugrás a jó érték becslésére (az órát ugratjuk előre/vissza). Ezt a módszert célszerű csak rendszerindításkor használni, mivel kritikus folyamatokat negatívan befolyásolhat, ha visszaugrunk az időben.
 
'''stepping''' - ugrás a jó érték becslésére (az órát ugratjuk előre/vissza). Ezt a módszert célszerű csak rendszerindításkor használni, mivel kritikus folyamatokat negatívan befolyásolhat, ha visszaugrunk az időben.
 
'''stratum''' - ntp-nél használt fogalom. Egy hierarchikus rendszert ír le, melyben több rétegen (stata) helyezkednek el az NTP szerverek, mindegyiknek megvan a saját rétegszáma, melyből következtethetünk az általuk szolgáltatott érték pontosságára is. 0-ás rétegben vannak az atomórák és nagy pontosságú órák, az 1-es réteg az ezekhez közvetlenül kapcsolódó számítógépek. A 0-ás réteg gépei nem csatlakoznak közvetlenül az internetre.
 
   
 
== Időszinkronizációs protokollok ==
 
== Időszinkronizációs protokollok ==
17. sor: 15. sor:
   
 
Az időt egy ASCII stringként adja vissza a protokollt támogató szerver. A 13-as TCP vagy UDP portot használja kommunikációra.
 
Az időt egy ASCII stringként adja vissza a protokollt támogató szerver. A 13-as TCP vagy UDP portot használja kommunikációra.
  +
  +
Hátránya, hogy kis körben használják, pontatlan, nem definiált az ASCII string pontos formátuma, ezért problémás a feldolgozása.
   
 
===TIME Protocol===
 
===TIME Protocol===
 
RFC 868
 
RFC 868
   
A 37-es TCP vagy UDP portot használja kommunikációra. A szerver az időt egy 32 bites bináris alakban küldi, ami 1900 jan. 1. 00:00 UTC óta eltelt másodperceket írja le. Az idő reprezentáció formája ~136 évet fed le másodperces felbontással.
+
A 37-es TCP vagy UDP portot használja kommunikációra. A szerver az időt egy 32 bites bináris alakban küldi, ami az 1900. jan. 1. 00:00 UTC óta eltelt másodpercek számát írja le. Az ilyen formátumú időreprezentáció ~136 évet fed le másodperces felbontással.
Semmilyen nemű hálózati hiba kezelést nem támogat, így a megkapott információ még pontatlanabbá válik.
+
  +
2007-ben megkezdődött a protokoll használatának fokozatos leváltása az NTP-re ott, ahol még alkalmazzák.
   
2007-ben megkezdődött a protokoll használatának fokozatos megszüntetése az NTP javára.
+
Hátrány: támgatása megszűnőben van, az időbélyeg később gondokat okozhat(2036-os probléma), SNTP gyakorlatilag ugyanez, csak pontosabb.
   
 
===NTP - Network Time Protocol===
 
===NTP - Network Time Protocol===
 
RFC 778 RFC 891 RFC 956 RFC 1305
 
RFC 778 RFC 891 RFC 956 RFC 1305
   
A legelterjedtebb Internetes időszinkronizéciós protokoll. Az időt több szerver átlagából számítja, az átlagtól legjobban eltérő válaszokat eldobja, a többiből átlagot számol.
+
A legelterjedtebb Internetes időszinkronizációs protokoll. Az időt több szervertől is megkérdezi, majd átlagolja a kapott időbélyegeket. Az átlagtól legjobban eltérő válaszokat eldobja, majd a többiből ismét átlagot számol. Ezt a második átlagot használja a pontos idő becslésére.
 
A kommunikációt UDP/IP-n keresztül végzi, a 123-as UDP porton.
 
A kommunikációt UDP/IP-n keresztül végzi, a 123-as UDP porton.
Az NTP időbélyeg egy 64 bites szám, ami egy 32 bites másodperc, és 32 bites töredékmásodperc részből áll. Az időbélyeg az 1900 jan. 1 00:00 UTC óta eltelt időt tárolja, elbontása ~200 ps. Ez annyit tesz, hogy az NTP által használt időbélyeg 2036-ban fordul át, a 2038-as Unix Millennium Bug előtt.
+
Az NTP időbélyeg egy 64 bites szám, ami egy 32 bites másodperc, és 32 bites töredék másodperc részből áll. Az időbélyeg az 1900 jan. 1 00:00 UTC óta eltelt időt tárolja, felbontása ~200 ps (2^-32). Ebből következik, hogy az NTP által használt időbélyeg 2036-ban fordul át, a 2038-as Unix Millennium Bug előtt.
NTPv4 Interneten keresztüli frissítésnél 10ms körüli pontosságot biztosít, helyi hálózaton frissítés esetén pedig akár 200 µs pontosság is elérhető.
+
  +
  +
Előnye, hogy nagy infrastruktúra hálózat épül rá, nagy a támogatottsága, széles körben elterjedt, nem tudományos célokra elég pontosságot biztosít
  +
Hátránya, hogy olyan időbélyeggel dolgozik, ami később gondokat okozhat (2036-os probléma)
  +
  +
'''Kapcsolódó fogalom:'''
  +
  +
'''stratum''' - ntp-nél használt fogalom. Egy hierarchikus rendszert ír le, melyben több rétegen (strata) helyezkednek el az NTP szerverek, mindegyiknek megvan a saját rétegszáma, melyből következtethetünk az általuk szolgáltatott érték pontosságára is. 0-ás rétegben vannak az atomórák és nagy pontosságú órák, az 1-es réteg az ezekhez közvetlenül kapcsolódó számítógépek. A 0-ás réteg gépei nem csatlakoznak közvetlenül az internetre.
  +
  +
  +
Az NTPv4 fontosabb újdonságai az NTPv3-hoz képest:
  +
  +
* IPv6 címeket is kezel
  +
* autokey nyilvános kulcsú titkosítást támogat
  +
* Burst mód (iburst és burst)
  +
* pontosabb óraszabályozás
  +
* nanokernel támogatás - nanoszekundumos pontosságot biztosít
   
 
===SNTP - Simple Network Time Protocol===
 
===SNTP - Simple Network Time Protocol===
 
RFC 1361 RFC 1769 RFC 2030 RFC 4330
 
RFC 1361 RFC 1769 RFC 2030 RFC 4330
   
Hasonló az NTP-hez, azonban csak egy NTP szervert kérdez meg az aktuális időről (hasonlóan a daytime vagy time protokollhoz), majd ezt állítja be magának.
+
Hasonló az NTP-hez, azonban csak egyetlen NTP szervert kérdez meg az aktuális időről (hasonlóan a daytime vagy time protokollhoz), majd ezt állítja be magának.
  +
  +
Előnye: egyszerűbb, mint az NTP, beágyazott rendszerekbe ezért ideális (kisebb komplexitás - kisebb számítási igény)
  +
Hátránya: vakon megbízik egy NTP szerver által szolgáltatott értékben, nem viszonyít más szerverekhez.
   
 
=='''Időszinkronizációra használt programok'''==
 
=='''Időszinkronizációra használt programok'''==
 
===ntpdate===
 
===ntpdate===
Adott számú mintát vesz minden szervertől, majd egy adott algoritmussal kiszűri a túl nagy eltérésű szerverek eredményét, majd a maradékből becsléssel kiválasztja a legpontosabbat. A programpontossága függ a szerverek számától, a minták számától, és az azok között eltelt időtől.
+
Az időt több szervertől is megkérdezi, mindekitől többször. Egy adott algoritmussal kiszűri a túl nagy eltérésű szervereket, majd a maradékból egy másik algoritmussal kiválasztja a legpontosabbat. A program pontossága függ a szerverek számától, a minták számától, és a mintavételek között eltelt időtől.
Kézileg, vagy startup scriptből futtatható. Nem állítja folytonosan a host órafrekvenciáját, így az nincs "fegyelmezve".
+
Kézileg, vagy rendszerinduláshoz ütemezve ajánlott futtatni. Mivel nem lehet daemonizálni, ezért az nem szabályozza az órát a beállítás után.
   
 
Amennyiben a host időbeni eltérése a szervertől fél másodpercen belülre esik, akkor az adjtime() függvényhívással a helyes időre "sietteti" vagy "késlelteti" a host óráját.
 
Amennyiben a host időbeni eltérése a szervertől fél másodpercen belülre esik, akkor az adjtime() függvényhívással a helyes időre "sietteti" vagy "késlelteti" a host óráját.
 
Amennyiben az eltérés fél másodpercnél nagyobb lenne, akkor a settimeofday() függvényhívással a helyes időpontra ugraszja a host óráját.
 
Amennyiben az eltérés fél másodpercnél nagyobb lenne, akkor a settimeofday() függvényhívással a helyes időpontra ugraszja a host óráját.
   
Amennyiben ntpdaemon fut a hoston, nem állítja az időt.
+
Amennyiben ntpd (ntp daemon) is fut azon a gépen, amelyiken az ntpdate-et futtatjuk, akkor az ntpdate nem állítja át az órát.
   
===opentpd===
+
===openntpd===
A fejlesztők úgy vélték, hogy mivel az NTPv3 szabvány olyan nagy pontosságot ír le, ami egy linux gépen elérhetetlen, ezért úgy vélték, hogy könnyítenek a kliensprogramon, mellőzve a túlzott pontosságot.
+
A fejlesztők szerint az NTPv3 szabvány olyan nagy pontosságot ír le, ami egy linuxos gépen elérhetetlen. Mellőzve a túlzott pontosságot egy egyszerűbb kliensprogramot készítettek.
A program ~3kloc ( cél a gyorsaság), és 50ms pontosságot garantál, ami egy linux rendszer által biztosított max pontosság.
+
A program ~3kloc (3 kilo line of code - 3000 sor kód), tehát nagyon kompakt. +-50ms-os pontosságot garantál, ami egy linuxos rendszer által biztosított legnagyobb pontosság.
   
A programban privilégium szeparációt valósítottak meg, így root jogosultság csak azon résznek kell, ami root jogot igénylő hívásokat végez.
+
A programban privilégium szeparációt valósítottak meg. Ez azt jelenti, hogy a program több részre van felosztva, és minden rész csak azokkal a jogokkal rendelkezik, amik a feladatának végrehajtásához szükségesek.
   
Két processz:
+
Az openntpd-ben a feladatokat két processz látja el:
* szülő, rootként fut
+
* szülő - rootként fut. Ő végzi a kernelhívásokat, amik az időt állítják.
* ntp engine, _ntp:_ntp-ként fut, és chroot-ol /var/empty-be
+
* ntp engine - _ntp userként ként fut. chroot-ol /var/empty-be. Ezzel lekorlátozódik a fájlrendszerelérése.
   
A processzek között egy socket-pár van
+
A processzek között a kommunikáció egy unix domain socket-páron keresztül történik.
üzenetek:
+
  +
A szülő és az ntp engine között használt üzenetek:
 
* IMSG_ADJTIME - ntp engine megkéri a szülőt, hogy hívja meg az adjtime() függvényt
 
* IMSG_ADJTIME - ntp engine megkéri a szülőt, hogy hívja meg az adjtime() függvényt
 
* IMSG_SETTIME - ntp engine megkéri a szülőt, hogy hívja meg a settime() függvényt
 
* IMSG_SETTIME - ntp engine megkéri a szülőt, hogy hívja meg a settime() függvényt
 
* IMSG_HOST_DNS - ntpengine megkéri a szülőt, hogy oldja fel a megadott hostnevet (/etc/resolv.conf)
 
* IMSG_HOST_DNS - ntpengine megkéri a szülőt, hogy oldja fel a megadott hostnevet (/etc/resolv.conf)
   
A szülő nem bízik a kliensében, ezért nagyon szigorú az üzenetek formátumát illetően, ha az nem megfelelő, hard-exit, és soha többet nem beszél a klienssel.
+
A szülő nem bízik a kliensében, ezért nagyon szigorú az üzenetek formátumát illetően. Ha az üzenet formátuma nem megfelelő, bontja a kapcsolatot a klienssel.
   
 
===rdate===
 
===rdate===
Egy szegényes időszinkronizációs protokoll, lekéri a szervertől az aktuális időt, majd a kapott időt állítja be a host óráján. Nem használ átviteli késleltetésből, vagy pontatlanságból származó újraszámlálást.
+
Egy szegényes időszinkronizációs program. Lekéri a szervertől az aktuális időt, majd a kapott időt állítja be a host óráján.
   
 
===ntpd===
 
===ntpd===
 
Az ntpd egy időszinkronizációs daemon.
 
Az ntpd egy időszinkronizációs daemon.
A többi vizsgált időszinkronizációs módszerhez képest az ntpd már támogatja az NTPv4-et, de kompatibilis maradt az NTPv3-mal is.
+
A többi vizsgált időszinkronizációs módszerrel ellentétben az ntpd már támogatja az NTPv4-et, de kompatibilis maradt az NTPv3-mal is.
   
 
===taiclock===
 
===taiclock===
A taiclock szerverek az időt TAI64NA formátumban küldik a hostoknak. A TAI64 időbélyegek előnyéről [https://unixlinux.tmit.bme.hu/A_runit_működése#A_TAI64N_id.C5.91b.C3.A9lyegekr.C5.91l itt] lehet többet olvasni. A protokoll UDP/IP fölött is működik.
+
A taiclock szerverek az időt TAI64NA formátumban küldik a hostoknak. A TAI64 időbélyegek előnyéről [[A_runit_működése#A TAI64N időbélyegekről | itt]] lehet többet olvasni. A protokoll UDP/IP fölött is működik.
  +
  +
===chrony===
  +
Két programból álló időszinkronizációs csomag. A két program neve '''chronyd''' és '''chronyc'''.
  +
A chronyd egy daemon, amely ntp-szerverekhez szinkronizálja az időt. A következő jellemzőkkel bír:
  +
* az időt slew módszerrel korrigálja, ha ntp szerverhez tud kapcsolódni
  +
* nyilvántartja, hogy milyen mértékű a gép órájának pontatlansága, így két szinkronizálás között is viszonylag pontosan tartja az órát
  +
* újraindítás vagy ki/bekapcsolások között is pontosan tartja az órát, rendszerinduláskor a nyilvántartott pontatlanságból számítja a beállítandó időt
  +
  +
Ezek azt eredményezik, hogy chrony-t használva, egy internetre ritkán csatlakozó gépen tovább marad pontos az idő, mint ha ntpd-t használnánk.
  +
  +
A chronyc egy interfészt szolgáltat a chronyd beállításaihoz. A kettejük közötti kommunikáció kliens-szerver jellegű.
   
=='''Saját NTP szerver konfigurálása'''==
+
=='''Saját NTP-szerver konfigurálása'''==
   
 
Alapvető példa egy /etc/ntp.conf fájlra:
 
Alapvető példa egy /etc/ntp.conf fájlra:
94. sor: 94. sor:
 
</pre>
 
</pre>
   
A legegyszerűbb konfigurációban két szerver van, egy tényleges NTP szerver, és egy önmagunkra mutató cím. Ez azt fogja okozni, hogy egészen addig önmagunkkal fogunk szinkronizálni, amíg a listában megadott NTP szerverek közül legalább egyhez tudunk csatlakozni.
+
A legegyszerűbb konfigurációban egy NTP-szerver van.
  +
A server 127.127.1.0 sor azért kell, mert így tudjuk beállítani az extra opciókat a fudge paranccsal (pl. stratum szintet)
   
 
A drift fájl eltérés-fájl. Idővel az ntpd megtanulja, ohgy mennyi a rendszer tévedése, és ez alapján automatikusan kiigazítja a hibát.
 
A drift fájl eltérés-fájl. Idővel az ntpd megtanulja, ohgy mennyi a rendszer tévedése, és ez alapján automatikusan kiigazítja a hibát.
   
'''További konfigurációs paraméterek:'''
+
'''Fontosabb konfigurációs paraméterek:'''
 
{| border="1" cellpadding="5" cellspacing="0"
 
{| border="1" cellpadding="5" cellspacing="0"
 
|-
 
|-
 
! style="background:lightgrey"| paraméter !! style="background:lightgrey" | hatás
 
! style="background:lightgrey"| paraméter !! style="background:lightgrey" | hatás
 
|-
 
|-
|server || Specifies that a server is running on the host (own local clock)
+
|server || A szinkronizációs szerver beállítása
 
|-
 
|-
|fudge || Passes additional information to the clock driver
+
|fudge || További paraméterek beállításának kapcsolója
 
|-
 
|-
|stratum 10 || Manually sets the Stratum the server should operate at (1-15)
+
|stratum 10 || Ezzel kézileg állíthatjuk be a szerverünk stratum szintjét
 
|-
 
|-
|driftfile || Specifies the location of the frequency file
+
|driftfile || A drift fájl helyét határozhatjuk meg vele
|-
 
|broadcastdelay || Sets the propagation delay from the server when broadcasting
 
|-
 
|keys || Store a list of keys needed for any cryptographic links
 
 
|}
 
|}
  +
  +
Ha egy szerver asszociációnak az "'''iburst'''" (initial burst) opciót adjuk meg, az azt fogja eredményezni, hogy ha a szerverrel megszakad a kapcsolat, akkor mikor újra kapcsolatba tudunk lépni vele, 8db, két-két másodpercenként küldött kérést küld az ntpd a szervernek. Így PPP vagy ISDN internetkapcsolat kiépülésekor percek helyett másodpercek alatt szinkronizál a gépünk.
  +
A "'''dynamic'''" opciót használva olyan szervert is be tudunk állítani referenciának, ami a konfiguráláskor nem elérhető. Ez az opció feltételezi, hogy a szerver valamikor elérhető lesz.
  +
példa:
  +
<pre>
  +
server 0.europe.pool.ntp.org iburst dynamic
  +
</pre>
   
 
==='''Restrict'''===
 
==='''Restrict'''===
A restrict opcióval korlátozhatjuk a hálózaton levő rendszerek mit csinálhatnak az ntp-vel:
+
A restrict opcióval korlátozhatjuk, hogy a hálózaton levő rendszerek mit csinálhatnak az NTP-szerverrel:
   
 
<pre>
 
<pre>
119. sor: 126. sor:
 
restrict 127.0.0.1
 
restrict 127.0.0.1
   
#A beállított időszinkronizációs szervereknek be kell állítani a jobosultságaikat,
+
#A beállított időszinkronizációs szervereknek be kell állítani a jogosultságaikat,
 
#hogy tudjunk róluk szinkronizálni
 
#hogy tudjunk róluk szinkronizálni
 
restrict 0.europe.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
 
restrict 0.europe.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
130. sor: 137. sor:
 
</pre>
 
</pre>
   
Az alábbi restrict jogosultság korlátozások vannak
+
Az fontosabb restrict jogosultság korlátozások
 
{| border="1" cellpadding="5" cellspacing="0"
 
{| border="1" cellpadding="5" cellspacing="0"
 
|-
 
|-
 
! style="background:lightgrey"| korlátozás !! style="background:lightgrey" | hatás
 
! style="background:lightgrey"| korlátozás !! style="background:lightgrey" | hatás
 
|-
 
|-
| ignore || Deny all packets and queries
+
| ignore || az adott hálózatból érkező minden ntp csomagot eldobunk
 
|-
 
|-
| kod || Send Kiss-Of-Death packet on access violation
+
| kod || Ha valaki túl gyakran küld lekérdezéseket, küld egy kérést a lassításra
 
|-
 
|-
| nomodify || Deny ntpq / ntpdc queries that attempt to modify the server
+
| nomodify || Az olyan kérések tiltása, amik módosítanák az NTP-szervert
 
|-
 
|-
 
| notrap || Deny control message trap service
 
| notrap || Deny control message trap service
 
|-
 
|-
| noquery || Deny all ntpq / ntpdc queries
+
| noquery || NTP lekérdezések tiltása az adott hálózatból
 
|-
 
|-
| noserve || Deny all queries - except ntpq / ntpdc
+
| noserve || ntpq / ntpdc kéréseken kívül minden ntp kérést tilt
 
|-
 
|-
| notrust || Deny access unless cryptographically authenticated (ver 4.2 onwards)
+
| notrust || Csak kriptgráfiailag titkosított kapcsolatok fogadása
 
|-
 
|-
 
| nopeer || Deny all packets that attempt to establish a peer association
 
| nopeer || Deny all packets that attempt to establish a peer association
158. sor: 165. sor:
 
</pre>
 
</pre>
   
ezután chkconfig-gal beállítjuk, hogy melyik runlevelekben kell futnia az ntpd-nek, majd újraindítjuk az ntpd-t.
+
az ntpd.conf beállítása után újraindítjuk az ntpd-t.
 
<pre>
 
<pre>
[bash]# chkconfig --level 2345 ntpd on
 
 
[bash]# /etc/init.d/ntpd restart
 
[bash]# /etc/init.d/ntpd restart
 
</pre>
 
</pre>
   
A következő paranccsal ellenőrizhetjük, hogy melyik runlevelekben fut a szolgáltatásunk.
+
A következő paranccsal megbizonyosodhatunk arról, hogy az ntp szerverünk fut:
 
<pre>
 
<pre>
[bash]# chkconfig --list ntpd
+
[bash]# ntpq -p 192.168.1.1
ntpd 0:off 1:on 2:on 3:on 4:on 5:on 6:off
 
 
</pre>
 
</pre>
   
==='''dhcpd módosítása'''===
+
A következőhöz hasonló kimenetet kapunk, ha elérhető az ntp szerver az adott IP-n:
Amennyiben szeretnénk a magánhálózatunk gépeit dhcp-n keresztül informálni az új időszinkronizációs szerverünk elérhetőségéről, akkor azon a gépen, ahol a dhcpdaemont futtatjuk, módosítsuk az /etc/ntpd.conf fájlt a következőképpen:
 
   
bővítsük a subnet-re érvényes bejegyzést, ahol alkalmazni szeretnénk az új NTP szerverünket.
+
<pre>
  +
remote refid st t when poll reach delay offset jitter
  +
==============================================================================
  +
*edge.tillo.ch 192.87.106.2 2 u 14 64 1 66.171 -4.503 2.580
  +
+dns1.rmplc.co.u 193.62.22.98 2 u 13 64 1 74.657 -4.340 1.852
  +
-nx2.xplo-re.net 94.23.99.153 3 u 12 64 1 80.919 -13.224 1.590
  +
+ns1.servbit.ro 80.96.120.252 2 u 11 64 1 87.840 -16.949 1.054
  +
LOCAL(0) .LOCL. 10 l 26 64 1 0.000 0.000 0.001
  +
</pre>
  +
  +
A jelzések a következőket jelentik a címek előtt:
  +
* csillag: ehez szinkronizálunk jelenleg
  +
* +:szinkronizálásra jelölt szerver
  +
* -:nem elég jó minőségű szerver
  +
  +
Amennyiben nem elérhető a szerverünk, a következőhöz hasonló hibát kapunk:
  +
  +
<pre>
  +
192.168.1.1: timed out, nothing received
  +
***Request timed out
  +
</pre>
  +
  +
Egy másik gépről a következő paranccsal ellenőrizhetjük azt, hogy fut-e az ntp-szerver:
  +
  +
<pre>
  +
[bash]# ntpdate 192.168.1.1
  +
</pre>
  +
  +
==='''dhcpd beállítása'''===
  +
Amennyiben szeretnénk a magánhálózatunk gépeit dhcp-n keresztül informálni az új időszinkronizációs szerverünk elérhetőségéről, akkor azon a gépen, ahol a dhcpdaemont futtatjuk, módosítsuk az /etc/dhcpd.conf fájlt a következőképpen:
  +
  +
bővítsük a subnet-re érvényes bejegyzést, ahol alkalmazni szeretnénk az új NTP-szerverünket.
   
 
<pre>
 
<pre>
177. sor: 183. sor:
   
 
...
 
...
option ntp-servers 192.168.1.1; //az ntp szerverünk címe a hálózaton
+
option ntp-servers 192.168.1.1; //az NTP-szerverünk címe a hálózaton
option time-offset 3600; //3600 másodpercet hozzáadunk UTC-hez (CET)
+
...
  +
 
}
 
}
 
</pre>
 
</pre>

A lap jelenlegi, 2013. október 27., 23:01-kori változata

Írta: Reegn Zoltán, 2009. december

Ez a szócikk betekintést nyújt az időszinkronizációs módszerek közötti különbségekbe. Első lépésben áttekintjük a népszerűbb időszinkronizációs protokollokat, majd egyenként megnézünk pár időszinkronizációs csomagot, elemezzük előnyeiket/hátrányaikat.

Tartalomjegyzék

[szerkesztés] 1 Fogalmak

slewing - az időt nem korrigáljuk gyorsabban egy adott sebességnél (max. 0.5ms/s), ha egy bizonyos mértéknél(pl. 128ms-nál) kisebb az eltérés az időszinkronizációs szervertől lekért, és a saját óránk ideje között(lassítjuk/gyorsítjuk az órát)

stepping - ugrás a jó érték becslésére (az órát ugratjuk előre/vissza). Ezt a módszert célszerű csak rendszerindításkor használni, mivel kritikus folyamatokat negatívan befolyásolhat, ha visszaugrunk az időben.

[szerkesztés] 2 Időszinkronizációs protokollok

[szerkesztés] 2.1 DAYTIME Protocol

RFC 867

Az időt egy ASCII stringként adja vissza a protokollt támogató szerver. A 13-as TCP vagy UDP portot használja kommunikációra.

Hátránya, hogy kis körben használják, pontatlan, nem definiált az ASCII string pontos formátuma, ezért problémás a feldolgozása.

[szerkesztés] 2.2 TIME Protocol

RFC 868

A 37-es TCP vagy UDP portot használja kommunikációra. A szerver az időt egy 32 bites bináris alakban küldi, ami az 1900. jan. 1. 00:00 UTC óta eltelt másodpercek számát írja le. Az ilyen formátumú időreprezentáció ~136 évet fed le másodperces felbontással.

2007-ben megkezdődött a protokoll használatának fokozatos leváltása az NTP-re ott, ahol még alkalmazzák.

Hátrány: támgatása megszűnőben van, az időbélyeg később gondokat okozhat(2036-os probléma), SNTP gyakorlatilag ugyanez, csak pontosabb.

[szerkesztés] 2.3 NTP - Network Time Protocol

RFC 778 RFC 891 RFC 956 RFC 1305

A legelterjedtebb Internetes időszinkronizációs protokoll. Az időt több szervertől is megkérdezi, majd átlagolja a kapott időbélyegeket. Az átlagtól legjobban eltérő válaszokat eldobja, majd a többiből ismét átlagot számol. Ezt a második átlagot használja a pontos idő becslésére. A kommunikációt UDP/IP-n keresztül végzi, a 123-as UDP porton. Az NTP időbélyeg egy 64 bites szám, ami egy 32 bites másodperc, és 32 bites töredék másodperc részből áll. Az időbélyeg az 1900 jan. 1 00:00 UTC óta eltelt időt tárolja, felbontása ~200 ps (2^-32). Ebből következik, hogy az NTP által használt időbélyeg 2036-ban fordul át, a 2038-as Unix Millennium Bug előtt.


Előnye, hogy nagy infrastruktúra hálózat épül rá, nagy a támogatottsága, széles körben elterjedt, nem tudományos célokra elég pontosságot biztosít Hátránya, hogy olyan időbélyeggel dolgozik, ami később gondokat okozhat (2036-os probléma)

Kapcsolódó fogalom:

stratum - ntp-nél használt fogalom. Egy hierarchikus rendszert ír le, melyben több rétegen (strata) helyezkednek el az NTP szerverek, mindegyiknek megvan a saját rétegszáma, melyből következtethetünk az általuk szolgáltatott érték pontosságára is. 0-ás rétegben vannak az atomórák és nagy pontosságú órák, az 1-es réteg az ezekhez közvetlenül kapcsolódó számítógépek. A 0-ás réteg gépei nem csatlakoznak közvetlenül az internetre.


Az NTPv4 fontosabb újdonságai az NTPv3-hoz képest:

  • IPv6 címeket is kezel
  • autokey nyilvános kulcsú titkosítást támogat
  • Burst mód (iburst és burst)
  • pontosabb óraszabályozás
  • nanokernel támogatás - nanoszekundumos pontosságot biztosít

[szerkesztés] 2.4 SNTP - Simple Network Time Protocol

RFC 1361 RFC 1769 RFC 2030 RFC 4330

Hasonló az NTP-hez, azonban csak egyetlen NTP szervert kérdez meg az aktuális időről (hasonlóan a daytime vagy time protokollhoz), majd ezt állítja be magának.

Előnye: egyszerűbb, mint az NTP, beágyazott rendszerekbe ezért ideális (kisebb komplexitás - kisebb számítási igény) Hátránya: vakon megbízik egy NTP szerver által szolgáltatott értékben, nem viszonyít más szerverekhez.

[szerkesztés] 3 Időszinkronizációra használt programok

[szerkesztés] 3.1 ntpdate

Az időt több szervertől is megkérdezi, mindekitől többször. Egy adott algoritmussal kiszűri a túl nagy eltérésű szervereket, majd a maradékból egy másik algoritmussal kiválasztja a legpontosabbat. A program pontossága függ a szerverek számától, a minták számától, és a mintavételek között eltelt időtől. Kézileg, vagy rendszerinduláshoz ütemezve ajánlott futtatni. Mivel nem lehet daemonizálni, ezért az nem szabályozza az órát a beállítás után.

Amennyiben a host időbeni eltérése a szervertől fél másodpercen belülre esik, akkor az adjtime() függvényhívással a helyes időre "sietteti" vagy "késlelteti" a host óráját. Amennyiben az eltérés fél másodpercnél nagyobb lenne, akkor a settimeofday() függvényhívással a helyes időpontra ugraszja a host óráját.

Amennyiben ntpd (ntp daemon) is fut azon a gépen, amelyiken az ntpdate-et futtatjuk, akkor az ntpdate nem állítja át az órát.

[szerkesztés] 3.2 openntpd

A fejlesztők szerint az NTPv3 szabvány olyan nagy pontosságot ír le, ami egy linuxos gépen elérhetetlen. Mellőzve a túlzott pontosságot egy egyszerűbb kliensprogramot készítettek. A program ~3kloc (3 kilo line of code - 3000 sor kód), tehát nagyon kompakt. +-50ms-os pontosságot garantál, ami egy linuxos rendszer által biztosított legnagyobb pontosság.

A programban privilégium szeparációt valósítottak meg. Ez azt jelenti, hogy a program több részre van felosztva, és minden rész csak azokkal a jogokkal rendelkezik, amik a feladatának végrehajtásához szükségesek.

Az openntpd-ben a feladatokat két processz látja el:

  • szülő - rootként fut. Ő végzi a kernelhívásokat, amik az időt állítják.
  • ntp engine - _ntp userként ként fut. chroot-ol /var/empty-be. Ezzel lekorlátozódik a fájlrendszerelérése.

A processzek között a kommunikáció egy unix domain socket-páron keresztül történik.

A szülő és az ntp engine között használt üzenetek:

  • IMSG_ADJTIME - ntp engine megkéri a szülőt, hogy hívja meg az adjtime() függvényt
  • IMSG_SETTIME - ntp engine megkéri a szülőt, hogy hívja meg a settime() függvényt
  • IMSG_HOST_DNS - ntpengine megkéri a szülőt, hogy oldja fel a megadott hostnevet (/etc/resolv.conf)

A szülő nem bízik a kliensében, ezért nagyon szigorú az üzenetek formátumát illetően. Ha az üzenet formátuma nem megfelelő, bontja a kapcsolatot a klienssel.

[szerkesztés] 3.3 rdate

Egy szegényes időszinkronizációs program. Lekéri a szervertől az aktuális időt, majd a kapott időt állítja be a host óráján.

[szerkesztés] 3.4 ntpd

Az ntpd egy időszinkronizációs daemon. A többi vizsgált időszinkronizációs módszerrel ellentétben az ntpd már támogatja az NTPv4-et, de kompatibilis maradt az NTPv3-mal is.

[szerkesztés] 3.5 taiclock

A taiclock szerverek az időt TAI64NA formátumban küldik a hostoknak. A TAI64 időbélyegek előnyéről itt lehet többet olvasni. A protokoll UDP/IP fölött is működik.

[szerkesztés] 3.6 chrony

Két programból álló időszinkronizációs csomag. A két program neve chronyd és chronyc. A chronyd egy daemon, amely ntp-szerverekhez szinkronizálja az időt. A következő jellemzőkkel bír:

  • az időt slew módszerrel korrigálja, ha ntp szerverhez tud kapcsolódni
  • nyilvántartja, hogy milyen mértékű a gép órájának pontatlansága, így két szinkronizálás között is viszonylag pontosan tartja az órát
  • újraindítás vagy ki/bekapcsolások között is pontosan tartja az órát, rendszerinduláskor a nyilvántartott pontatlanságból számítja a beállítandó időt

Ezek azt eredményezik, hogy chrony-t használva, egy internetre ritkán csatlakozó gépen tovább marad pontos az idő, mint ha ntpd-t használnánk.

A chronyc egy interfészt szolgáltat a chronyd beállításaihoz. A kettejük közötti kommunikáció kliens-szerver jellegű.

[szerkesztés] 4 Saját NTP-szerver konfigurálása

Alapvető példa egy /etc/ntp.conf fájlra:

# --- GENERAL CONFIGURATION ---
server  0.europe.pool.ntp.org
server  1.europe.pool.ntp.org
server  2.europe.pool.ntp.org
server  3.europe.pool.ntp.org
server  127.127.1.0
fudge   127.127.1.0 stratum 10

# Drift file.
driftfile /etc/ntp/drift

A legegyszerűbb konfigurációban egy NTP-szerver van. A server 127.127.1.0 sor azért kell, mert így tudjuk beállítani az extra opciókat a fudge paranccsal (pl. stratum szintet)

A drift fájl eltérés-fájl. Idővel az ntpd megtanulja, ohgy mennyi a rendszer tévedése, és ez alapján automatikusan kiigazítja a hibát.

Fontosabb konfigurációs paraméterek:

paraméter hatás
server A szinkronizációs szerver beállítása
fudge További paraméterek beállításának kapcsolója
stratum 10 Ezzel kézileg állíthatjuk be a szerverünk stratum szintjét
driftfile A drift fájl helyét határozhatjuk meg vele

Ha egy szerver asszociációnak az "iburst" (initial burst) opciót adjuk meg, az azt fogja eredményezni, hogy ha a szerverrel megszakad a kapcsolat, akkor mikor újra kapcsolatba tudunk lépni vele, 8db, két-két másodpercenként küldött kérést küld az ntpd a szervernek. Így PPP vagy ISDN internetkapcsolat kiépülésekor percek helyett másodpercek alatt szinkronizál a gépünk. A "dynamic" opciót használva olyan szervert is be tudunk állítani referenciának, ami a konfiguráláskor nem elérhető. Ez az opció feltételezi, hogy a szerver valamikor elérhető lesz. példa:

server 0.europe.pool.ntp.org iburst dynamic

[szerkesztés] 4.1 Restrict

A restrict opcióval korlátozhatjuk, hogy a hálózaton levő rendszerek mit csinálhatnak az NTP-szerverrel:

#A localhostnak teljes hozzáférést biztosítunk
restrict 127.0.0.1

#A beállított időszinkronizációs szervereknek be kell állítani a jogosultságaikat,
#hogy tudjunk róluk szinkronizálni
restrict 0.europe.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
restrict 1.europe.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
restrict 2.europe.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
restrict 2.europe.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

#A belső privát hálózatunkon levő hostoknak jogokat adunk queryk küldésére
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

Az fontosabb restrict jogosultság korlátozások

korlátozás hatás
ignore az adott hálózatból érkező minden ntp csomagot eldobunk
kod Ha valaki túl gyakran küld lekérdezéseket, küld egy kérést a lassításra
nomodify Az olyan kérések tiltása, amik módosítanák az NTP-szervert
notrap Deny control message trap service
noquery NTP lekérdezések tiltása az adott hálózatból
noserve ntpq / ntpdc kéréseken kívül minden ntp kérést tilt
notrust Csak kriptgráfiailag titkosított kapcsolatok fogadása
nopeer Deny all packets that attempt to establish a peer association

[szerkesztés] 4.2 A szerver indítása

Első alkalommal indításkor érdemes egyet ntpdate-tel szinkronizálni, hogy legyen egy alapidő, amihez hozzáigazodik majd az ntpd.

[bash]# ntpdate -b pool.ntp.org

az ntpd.conf beállítása után újraindítjuk az ntpd-t.

[bash]# /etc/init.d/ntpd restart

A következő paranccsal megbizonyosodhatunk arról, hogy az ntp szerverünk fut:

[bash]# ntpq -p 192.168.1.1

A következőhöz hasonló kimenetet kapunk, ha elérhető az ntp szerver az adott IP-n:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*edge.tillo.ch   192.87.106.2     2 u   14   64    1   66.171   -4.503   2.580
+dns1.rmplc.co.u 193.62.22.98     2 u   13   64    1   74.657   -4.340   1.852
-nx2.xplo-re.net 94.23.99.153     3 u   12   64    1   80.919  -13.224   1.590
+ns1.servbit.ro  80.96.120.252    2 u   11   64    1   87.840  -16.949   1.054
 LOCAL(0)        .LOCL.          10 l   26   64    1    0.000    0.000   0.001

A jelzések a következőket jelentik a címek előtt:

  • csillag: ehez szinkronizálunk jelenleg
  • +:szinkronizálásra jelölt szerver
  • -:nem elég jó minőségű szerver

Amennyiben nem elérhető a szerverünk, a következőhöz hasonló hibát kapunk:

192.168.1.1: timed out, nothing received
***Request timed out

Egy másik gépről a következő paranccsal ellenőrizhetjük azt, hogy fut-e az ntp-szerver:

[bash]# ntpdate 192.168.1.1

[szerkesztés] 4.3 dhcpd beállítása

Amennyiben szeretnénk a magánhálózatunk gépeit dhcp-n keresztül informálni az új időszinkronizációs szerverünk elérhetőségéről, akkor azon a gépen, ahol a dhcpdaemont futtatjuk, módosítsuk az /etc/dhcpd.conf fájlt a következőképpen:

bővítsük a subnet-re érvényes bejegyzést, ahol alkalmazni szeretnénk az új NTP-szerverünket.

subnet 192.168.1.0 netmask 255.255.255.0 { //így néz ki egy subnet bejegyzés

...
    option ntp-servers 192.168.1.1; //az NTP-szerverünk címe a hálózaton
...

}

ezután indítsuk újra az dhcpdaemont:

[bash]# /etc/init.d/dhcpd restart

[szerkesztés] 5 Kapcsolódó irodalom

NTP configuration

openNTPD

NTP eszközök

DHCP server configuration

Személyes eszközök