home   artikelen   forum   colofon  
Gepubliceerd op 12.10.2001
Auteur: Ronny Ziegler
Vertaald door: Guus Snijders
Languages: en de cn
Help Ons!
 

Tijd server

NIS-Installatie Hoe duur je PC ook was, je raakt het gevoel dat de interne klok niet goed is maar niet kwijt. Na een paar dagen werken kan het een paar seconden er naast zitten...

Nooit meer je klok instellen

Een goed werkende klok is noodzakelijk voor een computer in een netwerk. Hoe kun je weten welke versie van een document de nieuwste is als je meer dan 1 kopie krijgt? Verder gebruiken veel beveiligings logs de timestamp (tijdstempel) bij de controle of pakketten niet onderschept en (mogelijk) veranderd zijn.
Maar meestal is het teveel werk om iedere paar dagen de klok opnieuw in te stellen, alleen maar omdat de fabrikant inferieure hardware heeft gebruikt waarbij de klok te snel of te traag is na een korte tijd.

Een lastig probleem als niet enkele briljante programmeurs er een oplossing voor hadden gevonden. Op het Internet zijn speciaal hiervoor tijdservers te vinden. De serverklokken worden al-dan-niet direct gecorrigeerd door een atoomklok en kunnen via een speciaal protocol andere computers de tijd vertellen.
Dit is gecompliceerder dan het klinkt. Zo moet de informatie van de server binnen een eindige tijd (de betekenis daarvan is bekend sinds Einstein zijn relativiteitstheorie publiceerde) naar de client zijn overgebracht. Om het zelfs nog lastiger te maken, moet je er ook nog aan denken dat het Internet niet is ontworpen om altijd even snel te zijn...

Hoe precies de tijd informatie is, hangt sterk af van de gebruikte tijdserver en kan tot op de microseconde nauwkeurig zijn.
Deze precisie is meestal alleen nodig voor onderzoeks-instituten die erg nauwkeurige timestamps nodig hebben.
Voor de 'standaard' desktop PC volstaat een accuratie van een tiende seconde. Daarom zijn de high-precision tijdservers (zgn Stratum-1-Server) beveiligd met wachtwoorden, zodat niet iedereen deze servers kan overladen met aanvragen.
Tijdservers die hun signaal van een stratum-1-server krijgen in plaats van een atoomklok of GPS-signaal (zgn Stratum-2-Server) zijn meestal publiekelijk beschikbaar (zonder wachtwoord beveiliging) en kunnen gebruikt worden als tijdserver.

Een aantal tijdservers kun je vinden op:

Installatie

De benodigde software kun je vinden op www.ntp.org. Verder is er op moment van schrijven een nieuwe versie van het transmissie protocol beschikbaar. Pakketten als xntp3-x.xx gebruiken het oude protocol, nieuwe versies heten ntp-4.0.*.tar.gz. De nieuwe versie 4 is achterwaards compatibel met de 'oude' versie, je kunt (en zou) de nieuwe versie gebruiken.
Veel distributies komen met een versie 3 ntp en door een recent ontdekte security bug is het omslachtige werk van broncode compileren de moeite waard.

Na downloaden en uitpakken van de broncode naar de /tmp-directory:

  >> tar zxvf ntp-4.0.*.tar.gz -C /tmp/
  
start je het configure-script:
  >> cd /tmp/ntp-4.0.99k23/
  >> ./configure
  
Als dit script klaar is met zijn systeemcontrole, compileer je de broncode met
  >> make
  
en kopieer je (niet per se nodig) naar de voorgedefieerde directories met
  >> make install
  
Het configuratie bestand - /etc/ntp.conf - zou in ieder geval de volgende regels moeten bevatten:

/etc/ntp.conf
  server timeserver1.uni-sonstwo.de
  driftfile /etc/ntp.drift
  


Het valt aan te raden om meer dan een tijdserver op te geven zodat de software voor zichzelf kan beslissen welke het meest accuraat is. Welke server gebruikt moet worden is een wetenschap op zich. Het beste kun je er een pakken die dicht bij je staat. Een selectie van vrij-toegankelijke Duitse tijdservers is bijvoorbeeld:

  server ntp0.fau.de
  server ntps1-0.uni-erlangen.de
  server ntps1-1.uni-erlangen.de
  server ntps1-1.rz.Uni-Osnabrueck.de
  
Dit configuratiebestand stelt het programma in zodat het onmiddelijk kan worden gebruikt. Start (als root) het programma ntpd-subdirectory met de volgende opties:
  >> cd ntpd
  >> ./ntpd -d -l/var/log/ntp.log
  
Je zou een uitvoer als de volgende moeten krijgen:

Messages
  create_sockets(123)
  interface  OK
  interface  OK
  bind() fd 3, family 2, port 123, addr 0.0.0.0, flags=1
  bind() fd 6, family 2, port 123, addr 127.0.0.1, flags=0
  bind() fd 7, family 2, port 123, addr 192.168.1.11, flags=1
  bind() fd 8, family 2, port 123, addr 172.16.186.1, flags=1
  init_io: maxactivefd 8
  resolving ntp0.fau.de
  report_event: system event 'event_restart' (0x01) status 'sync_alarm,
       sync_unspec, 1 event, event_unspec' (0xc010)
  auth_agekeys: at 1 keys 1 expired 0
  peer_clear: at 2 assoc ID 0
  newpeer: 192.168.1.11->194.178.31.21 mode 3 vers 4 poll 6 10
         flags 1 1 ttl 0 key 00000000
  


Het logbestand (/var/log/ntp.log) zou iets als dit moeten bevatten:

  ntpd[1733]: logging to file /var/log/ntp.log
  ntpd[1733]: ntpd 4.0.99k23 Sam Apr 14 22:06:04 CEST 2001 (1)
  ntpd[1733]: signal_no_reset: signal 13 had flags 4000000
  ntpd[1733]: precision = 35 usec
  ntpd[1733]: kernel time discipline status 0040
  ntpd[1733]: frequency initialized -26.854 from /etc/ntp.drift
  
Na een korte tijd, zet ntpd de systeemtijd op de exacte waarde. Dit gebeurt in kleine stappen om problemen te voorkomen met gemiste of dubbele seconden.
Als het verschil tussen de precieze tijd en de systeemklok groter is dan 1000 seconden, neemt ntpd aan dat het probleem groter is dan alleen een slechte hardware klok en sluit het zichzelf af zonder de tijd in te stellen. Om ntpd te forceren zelfs de tijd in stellen als het verschil zo groot is, kun je de -g optie gebruiken.

Om de klok automatisch tijdens het opstarten goed te zetten, voeg je de volgende regel toe aan je /sbin/init.d/boot.local (pas wel het pad aan aan jouw systeem):

  /usr/local/ntp-4.0.99k23/ntpd/ntpd -g -l/var/log/ntp.log
  
of bouw een init-script. Met SuSE 7.0 zou er het als volgt uit kunnen zien:

/sbini/init.d/ntpd
  
  . /etc/rc.status
  . /etc/rc.config
  
  base=${0##*/}
  link=${base#*[SK][0-9][0-9]}
  
  test $link = $base && START_FOO=yes
  test "$START_FOO" = yes || exit 0
  
  rc_reset
  case "$1" in
      start)
  	echo -n "Starting service nptd"
  
  	startproc /pfad/zu/ntp-4.0.99k23/ntpd/ntpd -g -l/var/log/ntp.log
  
  	# Onthoudt de status en wees verbose
  	rc_status -v
  	;;
      stop)
  	echo -n "Shutting down service foo"
  	## Stop daemon met killproc(8) en als dit faalt, echo de return
  	## waarde.
  
  	killproc -TERM /pfad/zu/ntp-4.0.99k23/ntpd/ntpd
  
  	# Onthoudt status en wees verbose
  	rc_status -v
  	;;
      restart)
  	## Als de eerste OK verloopt en start de tweede, als de eerste
  	## faalde, geef dan de return waarde.
  	$0 stop &&  $0 start
  
  	# Onthoudt status en wees stil
  	rc_status
  	;;
      *)
  	echo "Usage: $0 {start|stop|restart}"
  	exit 1
  	;;
  esac
  rc_exit
  


NTP in netwerken

In grotere netwerken heeft het geen nut om voor ieder werkstation de tijd te halen van een officiële Stratus-2-Server. De server zou al snel overbelast raken. Het is aan te raden een server in het lokale netwerk op te zetten en die dan te gebruiken (een zgn. Stratus-3)tijdserver.
Iedere computer met ntpd kan door anderen worden gebruikt als tijdserver.

Tijd-netwerk

In grote netwerken kan het nuttig zijn om meer dan 1 tijdserver op te zetten die hun tijd van verschillende stratus-2- (of zelfs Stratus-1-) servers betrekken om zo de betrouwbaarheid te vergroten.

Wil je bijvoorbeeld in je lokale netwerk de computer met het IP 192.168.0.1 als tijdserver gebruiken, dan hoeft /etc/ntpd.conf op de client alleen deze computer als server te bevatten:

/etc/ntpd.conf
  server 192.168.0.1
  driftfile /etc/ntp.drift
  


De officiële Stratus-2-Server wordt zo ontlast terwijl iedere client nog steeds een accurate tijd krijgt.