Órák szinkronizálása

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen ReegnZoli (vitalap | szerkesztései) 2009. december 6., 20:02-kor történt szerkesztése után volt.

Írta: Reegn Zoltán

Tartalomjegyzék

1 Időszinkronizációs módszerek összehasonlítása

Ez a wiki lap 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.

1.1 fogalmak:

slewing - az időt nem korrigáljuk gyorsabban 500µs/s-nál, ha 128ms-nál kisebb az eltérés (lassítjuk/gyorsítjuk az órát)

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

1.2 Időszinkronizációs protokollok

1.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.

1.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 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. 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 megszüntetése az NTP javára.

1.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 szerver átlagából számítja, az átlagtól legjobban eltérő válaszokat eldobja, a többiből átlagot számol. 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. 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ő.

1.2.4 SNTP - Simple Network Time Protocol

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.

1.3 Időszinkronizációra használt programok

1.3.1 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. Kézileg, vagy startup scriptből futtatható. Nem állítja folytonosan a host órafrekvenciáját, így az nincs "fegyelmezve".

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 ntpdaemon fut a hoston, nem állítja az időt.

1.3.2 opentpd

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 program ~3kloc (fő cél a gyorsaság), és 50ms pontosságot garantál, ami egy linux rendszer által biztosított max 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.

Két processz:

  • szülő, rootként fut
  • ntp engine, _ntp:_ntp-ként fut, és chroot-ol /var/empty-be

A processzek között egy socket-pár van ü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 nem megfelelő, hard-exit, és soha többet nem beszél a klienssel.

1.3.3 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.

1.3.4 ntpd

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.

1.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.

1.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 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 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:

paraméter hatás
server Specifies that a server is running on the host (own local clock)
fudge Passes additional information to the clock driver
stratum 10 Manually sets the Stratum the server should operate at (1-15)
driftfile Specifies the location of the frequency file
broadcastdelay Sets the propagation delay from the server when broadcasting
keys Store a list of keys needed for any cryptographic links

1.4.1 Restrict

A restrict opcióval korlátozhatjuk a hálózaton levő rendszerek mit csinálhatnak az ntp-vel:

#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 jobosultsá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 alábbi restrict jogosultság korlátozások vannak

korlátozás hatás
ignore Deny all packets and queries
kod Send Kiss-Of-Death packet on access violation
nomodify Deny ntpq / ntpdc queries that attempt to modify the server
notrap Deny control message trap service
noquery Deny all ntpq / ntpdc queries
noserve Deny all queries - except ntpq / ntpdc
notrust Deny access unless cryptographically authenticated (ver 4.2 onwards)
nopeer Deny all packets that attempt to establish a peer association

1.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

ezután chkconfig-gal beállítjuk, hogy melyik runlevelekben kell futnia az ntpd-nek, majd újraindítjuk az ntpd-t.

[bash]# chkconfig --level 2345 ntpd on
[bash]# /etc/init.d/ntpd restart

A következő paranccsal ellenőrizhetjük, hogy melyik runlevelekben fut a szolgáltatásunk.

[bash]# chkconfig --list ntpd
ntpd 0:off 1:on 2:on 3:on 4:on 5:on 6:off

1.4.3 dhcpd módosí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/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.

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
    option time-offset 3600;        //3600 másodpercet hozzáadunk UTC-hez (CET)
}

ezután indítsuk újra az dhcpdaemont:

[bash]# /etc/init.d/dhcpd restart
Személyes eszközök