Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:time_protocol_archlinux

Dies ist eine alte Version des Dokuments!


Time Protocol ArchLinux

Das sogenannte Time Protocol ist im RFC868 - deutsch beschrieben und ist eine ältere Möglichkeit, einen Zeitserver zu realisieren, ähnlich wie das NTP (Network Time Protocol) jedoch mit anderer Protokoll-Spezifikation, entwickelt um die einzelnen Uhren jedes an ein Netzwerk angeschlossenen Computers, synchron zu halten. Alle in diesem Netzwerk befindlichen Computer, haben dann eine einheitliche Zeit, wenn diese an der Verteilung der Zeitinformationen eines sogenannten „Zeitservers“, teilnehmen.

Es kann unter Umständen sehr wichtig sein, das alle Computer in einem Netzwerk die selbe Zeit zur Verfügung haben, da sonst z.B. der Austausch von DNS Informationen, bei einer zu hoher Zeitabweichung der einzelnen am DNS beteiligten Computer, nicht durchgeführt werden kann.

Das „Time Protocol“ sieht eine Website-unabhängige, maschinenlesbare Datum- und Zeitübermittlung vor. Der „Zeitserver“ sendet die Zeit, gerechnet in Sekunden seit Mitternacht des 1. Januar 1900, als 32-Bit-Binärzahl.

Um einen „Zeitserver“ im Time Protocol unter ArchLinux zu realisieren, kann der xinetd-Dienst/Daemon verwendet werden. Nachfolgen soll veranschaulicht werden, wie unter Zuhilfenahme des xinetd-Dienstes/Daemon dies realisiert werden kann.

:!: HINWEIS - Nachfolgend soll die Installation eines „Zeitservers“ für eine privates Netzwerk beschrieben werden!

:!: HINWEIS - IPv6 soll NICHT genutzt werden!!!

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Installation

Zur Installation eines „Zeitservers“ wird nachfolgendes Paket benötigt:

  • xinetd - ist im base-Repository von ArchLinux enthalten

installiert werden.

Um eine „Zeitabfrage“ gegen den „Zeitserver“ durchführen zu können, kann das Paket

installiert werden.

Mit nachfolgendem Befehl, wird das Pakete xinetd installiert:

# pacman --noconfirm -S xinetd
resolving dependencies...
looking for conflicting packages...

Package (1)   New Version  Net Change  Download Size

extra/xinetd  2.3.15.4-1     0.23 MiB       0.10 MiB

Total Download Size:   0.10 MiB
Total Installed Size:  0.23 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 xinetd-2.3.15.4-...   101.2 KiB  2.47 MiB/s 00:00 [######################] 100%
(1/1) checking keys in keyring                     [######################] 100%
(1/1) checking package integrity                   [######################] 100%
(1/1) loading package files                        [######################] 100%
(1/1) checking for file conflicts                  [######################] 100%
(1/1) checking available disk space                [######################] 100%
:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
==> root: 19
:: Processing package changes...
(1/1) installing xinetd                            [######################] 100%
Optional dependencies for xinetd
    perl: for xconv.pl script [installed]
:: Running post-transaction hooks...
(1/3) Reloading system manager configuration...
(2/3) Arming ConditionNeedsUpdate...
(3/3) Performing snapper post snapshots for the following configurations...
==> root: 20

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket xinetd installiert wurden.

# pacman -Qil xinetd
Name            : xinetd
Version         : 2.3.15.4-1
Description     : A secure replacement for inetd
Architecture    : x86_64
URL             : https://github.com/openSUSE/xinetd
Licenses        : custom
Groups          : None
Provides        : None
Depends On      : libtirpc
Optional Deps   : perl: for xconv.pl script [installed]
Required By     : None
Optional For    : None
Conflicts With  : None
Replaces        : None
Installed Size  : 230.60 KiB
Packager        : Tobias Powalowski <tpowa@archlinux.org>
Build Date      : Mon 17 Aug 2020 02:48:12 PM CEST
Install Date    : Thu 31 Dec 2020 11:11:34 AM CET
Install Reason  : Explicitly installed
Install Script  : No
Validated By    : Signature

xinetd /etc/
xinetd /etc/xinetd.conf
xinetd /etc/xinetd.d/
xinetd /etc/xinetd.d/chargen
xinetd /etc/xinetd.d/chargen-udp
xinetd /etc/xinetd.d/daytime
xinetd /etc/xinetd.d/daytime-udp
xinetd /etc/xinetd.d/discard
xinetd /etc/xinetd.d/discard-udp
xinetd /etc/xinetd.d/echo
xinetd /etc/xinetd.d/echo-udp
xinetd /etc/xinetd.d/servers
xinetd /etc/xinetd.d/services
xinetd /etc/xinetd.d/time
xinetd /etc/xinetd.d/time-udp
xinetd /usr/
xinetd /usr/bin/
xinetd /usr/bin/itox
xinetd /usr/bin/xconv.pl
xinetd /usr/bin/xinetd
xinetd /usr/lib/
xinetd /usr/lib/systemd/
xinetd /usr/lib/systemd/system/
xinetd /usr/lib/systemd/system/xinetd.service
xinetd /usr/share/
xinetd /usr/share/licenses/
xinetd /usr/share/licenses/xinetd/
xinetd /usr/share/licenses/xinetd/COPYRIGHT
xinetd /usr/share/man/
xinetd /usr/share/man/man5/
xinetd /usr/share/man/man5/xinetd.conf.5.gz
xinetd /usr/share/man/man5/xinetd.log.5.gz
xinetd /usr/share/man/man8/
xinetd /usr/share/man/man8/itox.8.gz
xinetd /usr/share/man/man8/xconv.pl.8.gz
xinetd /usr/share/man/man8/xinetd.8.gz

Mit nachfolgendem Befehl, wird das Pakete rdate installiert:

# pikaur --noconfirm -S rdate
Reading repository package databases...
Reading local package database...
Resolving AUR dependencies...
looking for conflicting AUR packages...
Not showing diff for rdate package (--noconfirm)
:: Skipping review of PKGBUILD for rdate package (--noconfirm)


:: Starting the build:
Running as unit: run-u82.service
Press ^] three times within 1s to disconnect TTY.
==> Making package: rdate 1.5-3 (Thu 31 Dec 2020 11:12:43 AM CET)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Retrieving sources...
  -> Downloading rdate-1.5.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   337  100   337    0     0   1348      0 --:--:-- --:--:-- --:--:--  1348
100 83337  100 83337    0     0   153k      0 --:--:-- --:--:-- --:--:--  153k
==> Validating source files with sha256sums...
    rdate-1.5.tar.gz ... Passed
==> Extracting sources...
  -> Extracting rdate-1.5.tar.gz with bsdtar
==> Starting prepare()...
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for a BSD-compatible install... /usr/bin/install -c
checking for gethostbyaddr... yes
checking for socket... yes
checking for logwtmp... no
checking for logwtmp in -lutil... yes
checking for getaddrinfo... yes
checking for getnameinfo... yes
checking for adjtime... yes
checking for sigaction... yes
checking return type of signal handlers... void
checking how to run the C preprocessor... gcc -E
checking for egrep... grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking time.h usability... yes
checking time.h presence... yes
checking for time.h... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking libutil.h usability... no
checking libutil.h presence... no
checking for libutil.h... no
checking util.h usability... no
checking util.h presence... no
checking for util.h... no
checking utmp.h usability... yes
checking utmp.h presence... yes
checking for utmp.h... yes
checking for unistd.h... (cached) yes
checking for uint32_t... yes
checking for uint16_t... yes
checking for uint8_t... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/config.h
config.status: executing depfiles commands
Now type 'make' and then 'make install'.
==> Starting build()...
Making all in src
make[1]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
make  all-am
make[2]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -Wunused -Wall -pipe -MT rdate.o -MD -MP -MF ".deps/rdate.Tpo" -c -o rdate.o rdate.c; \
then mv -f ".deps/rdate.Tpo" ".deps/rdate.Po"; else rm -f ".deps/rdate.Tpo"; exit 1; fi
rdate.c: In function ‘rdate’:
rdate.c:271:34: warning: pointer targets in passing argument 3 of ‘rdate_tcp’ differ in signedness [-Wpointer-sign]
  271 |     result = rdate_tcp( fd, res, time_buf, sizeof(time_buf) );
      |                                  ^~~~~~~~
      |                                  |
      |                                  unsigned char *
rdate.c:141:50: note: expected ‘char *’ but argument is of type ‘unsigned char *’
  141 | rdate_tcp( int fd, struct addrinfo* ainfo, char* buf, int buf_size )
      |                                            ~~~~~~^~~
rdate.c:273:34: warning: pointer targets in passing argument 3 of ‘rdate_udp’ differ in signedness [-Wpointer-sign]
  273 |     result = rdate_udp( fd, res, time_buf, sizeof(time_buf) );
      |                                  ^~~~~~~~
      |                                  |
      |                                  unsigned char *
rdate.c:181:50: note: expected ‘char *’ but argument is of type ‘unsigned char *’
  181 | rdate_udp( int fd, struct addrinfo* ainfo, char* buf, int buf_size )
      |                                            ~~~~~~^~~
gcc  -g -O2 -Wunused -Wall -pipe   -o rdate  rdate.o  -lutil 
make[2]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
make[1]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
make[1]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5'
make[1]: Nothing to be done for 'all-am'.
make[1]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5'
==> Entering fakeroot environment...
==> Starting package()...
Making install in src
make[1]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
make[2]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
test -z "/usr/bin" || mkdir -p -- . "/var/cache/private/pikaur/build/rdate/pkg/rdate/usr/bin"
  /usr/bin/install -c 'rdate' '/var/cache/private/pikaur/build/rdate/pkg/rdate/usr/bin/rdate'
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
make[1]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5/src'
make[1]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5'
make[2]: Entering directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5'
make[2]: Nothing to be done for 'install-exec-am'.
test -z "/usr/share/man/man1" || mkdir -p -- . "/var/cache/private/pikaur/build/rdate/pkg/rdate/usr/share/man/man1"
 /usr/bin/install -c -m 644 './rdate.1' '/var/cache/private/pikaur/build/rdate/pkg/rdate/usr/share/man/man1/rdate.1'
make[2]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5'
make[1]: Leaving directory '/var/cache/private/pikaur/build/rdate/src/rdate-1.5'
==> Tidying install...
  -> Removing libtool files...
  -> Purging unwanted files...
  -> Removing static library files...
  -> Stripping unneeded symbols from binaries and libraries...
  -> Compressing man and info pages...
==> Checking for packaging issues...
==> Creating package "rdate"...
  -> Generating .PKGINFO file...
  -> Generating .BUILDINFO file...
  -> Generating .MTREE file...
  -> Compressing package...
==> Leaving fakeroot environment.
==> Finished making: rdate 1.5-3 (Thu 31 Dec 2020 11:12:48 AM CET)
Finished with result: success
Main processes terminated with: code=exited/status=0
Service runtime: 4.921s

loading packages...
resolving dependencies...
looking for conflicting packages...

Package (1)  New Version  Net Change

rdate        1.5-3          0.01 MiB

Total Installed Size:  0.01 MiB

:: Proceed with installation? [Y/n] 
(1/1) checking keys in keyring                     [######################] 100%
(1/1) checking package integrity                   [######################] 100%
(1/1) loading package files                        [######################] 100%
Y0/1) checking for file conflicts                  [----------------------]   0%
(1/1) checking for file conflicts                  [######################] 100%
(1/1) checking available disk space                [######################] 100%
:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
==> root: 21
:: Processing package changes...
(1/1) installing rdate                             [######################] 100%
:: Running post-transaction hooks...
(1/2) Arming ConditionNeedsUpdate...
(2/2) Performing snapper post snapshots for the following configurations...
==> root: 22

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket rdate installiert wurden.

# pikaur -Qil rdate
Name            : rdate
Version         : 1.5-3
Description     : Retrieves the date and time from other machines
Architecture    : x86_64
URL             : http://www.aelius.com/njh/rdate
Licenses        : GPL
Groups          : None
Provides        : None
Depends On      : glibc
Optional Deps   : None
Required By     : None
Optional For    : None
Conflicts With  : None
Replaces        : None
Installed Size  : 14.88 KiB
Packager        : Unknown Packager
Build Date      : Thu 31 Dec 2020 11:12:43 AM CET
Install Date    : Thu 31 Dec 2020 11:12:48 AM CET
Install Reason  : Explicitly installed
Install Script  : No
Validated By    : None

rdate /usr/
rdate /usr/bin/
rdate /usr/bin/rdate
rdate /usr/share/
rdate /usr/share/man/
rdate /usr/share/man/man1/
rdate /usr/share/man/man1/rdate.1.gz

Konfiguration

Um einen „Zeitserver“, welcher als Dienst/Deamon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Daemon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl eingerichtet werden kann:

# systemctl enable xinetd.service

Eine Überprüfung, ob beim Neustart des Server der xinetd-Dienst/Deamon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep -E ^xinetd

bzw.

# systemctl is-enabled xinetd.service
enabled

Der Dienst/Deamon xinetd.service sollte aktuelle nicht gestartet sein, was mit nachfolgendem Befehl überprüft werden kann:

# systemctl status xinetd

:!: HINWEIS - Ein Start des Dienstes/Deamons xinetd.service, sollte erst nach nachfolgender Konfiguration erfolgen!

/etc/xinetd.d

Mit nachfolgendem Befehl, kann in das Konfigurationsverzeichnis

  • /etc/xinetd.d

gewechselt werden:

# cd /etc/xinetd.d

Innerhalb des Verzeichnisses, dessen Inhalt mit nachfolgendem Befehl aufgelistet werden kann und eine Ausgabe in etwa wie nachfolgende erzeugen sollte,

# ls -l /etc/xinetd.d

sind die beiden Konfigurationsdateien

  • /etc/xinetd.d/time
  • /etc/xinetd.d/time-udp

von Bedeutung!

Änderungen und persönliche Anpassungen sind mit einem voranstehenden Kommentar, welche wie nachfolgend dargestellt aussieht

# Tachtler

gekennzeichnet.

/etc/xinetd.d/time

Nachfolgend dargestellte Änderungen sollten an der Konfigurationsdatei durchgeführt werden (komplette Konfigurationsdatei):

 

/etc/xinetd.d/time-udp

Nachfolgend dargestellte Änderungen sollten an der Konfigurationsdatei durchgeführt werden (komplette Konfigurationsdatei):

 

iptables Regel

:!: WICHTIG - Nur relevant beim Einsatz von iptables als Firewall!

Damit der „Zeitserver“ auch erreichbar ist und nicht die Weitergab der Zeitinformationen via Time Protocol vom Paketfilter iptables blockiert wird, muss nachfolgende Regel zum iptables-Regelwerk hinzugefügt werden.

Um die aktuellen iptables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     2420  321K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4        1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5       28   896 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 2246 packets, 823K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Nachfolgende Befehle, fügen folgende iptables-Regeln dem iptables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

  • -A INPUT -p tcp --dport 37 -j ACCEPT
  • -A INPUT -p udp --dport 37 -j ACCEPT

und hier die Befehle:

# iptables -I INPUT 4 -p tcp --dport 37 -j ACCEPT
# iptables -I INPUT 4 -p udp --dport 37 -j ACCEPT

Ein erneute Abfrage des iptables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     2571  334K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4        1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:37
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:37
7       31   992 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 6 packets, 800 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Die neuen Zeilen sind an Position 5 und Postition 6 zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:37
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:37
...

Um diese iptables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im iptables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:



Zeitserver starten

Um einen „Zeitserver“ zu starten muss der xinetd-Dienst/Deamon mit nachfolgendem Befehl gestartete werden:

# systemctl start xinetd.service

Ob der „Zeitserver“, sprich der xinetd-Dienst/Deamon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt, erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwf | grep xinetd

bzw. nachfolgendem Befehl überprüft werden:

# systemctl status xinetd.service

Auf welchen Ports der chronyd-Dienst/Deamon auch tatsächlich als Hintergrundprozess lauscht, kann mit nachfolgendem Befehl überprüft werden:

# ss -taubn | grep xinetd

Eine weitere Überprüfung, ob auch die entsprechenden Services des xinetd-Dienstes/Daemon gestartete werden, kann mit nachfolgendem Befehl herausgefunden werden:

# systemctl status xinetd.service

Zeitserver überprüfen

Unter Zuhilfenahme des Befehls rdate, kann überprüft werden, ob der „Zeitserver“ zur Auslieferung der Zeit im Stande ist.

Nachfolgende Befehle, können auf dem Server auf dem der „Zeitserver“ läuft, oder auf einem sich im Netzwerk befindlichen Server durchgeführt werden:

Befehl zu Abfrage gegen den Zeitserver via TCP:

# rdate 192.168.0.11

Befehl zu Abfrage gegen den Zeitserver via UDP:

# rdate -u 192.168.0.11
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/time_protocol_archlinux.1609409616.txt.gz · Zuletzt geändert: 2020/12/31 11:13 von klaus