Netzwerk
Ubuntu - Statische IP Setzen
Um unter Ubuntu dauerhaft eine feste IP-Addresse zu setzen, musst du die Datei von netplan bearbeiten.
Ubuntu:
Um zu starten musst du folgende Datei bearbeiten.
Ubuntu Server 24.01 LTS:
nano /etc/netplan/50-cloud-init.yaml
Ubuntu Server 22.01 LTS:
nano /etc/netplan/00-installer-config.yaml
Die Datei sollte in etwa diesen Inhalt haben:
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
ens160:
# dhcp4: true
dhcp4: no
addresses:
- 10.0.0.10/24
gateway4: 10.0.0.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
version: 2
ens160 is dabei mein Netzwerk Interface, das ist von System zu System unterschiedlich.
Um dein Interface zu erkennen, kannst du im Terminal ip a eingeben, danach werden dir alle erkannten Netzwerk Interfaces angezeigt.dhcp4: no muss gesetzt sein, da du sonst per DHCP auch nochmal eine Addresse bekommst.addresses: da kannst du entweder eine oder mehere IP Addressen eintragen, vergiss nicht dahinter die passende Subnetmaske zu setzen.gateway4: ist dann in dem falle dein Router/Firewall, halt das Gatewaynameservers: hier kannst du deine DNS Server eintragen die genutzt werden sollen
Je nachdem was für ne Rakete du bist, kannst du das ganze direkt anwenden, mit dem Risiko, das du dich von von deinem System verabschiedest und nicht mehr per SSH rauf kommst oder du testest das ganze erstmal.
Testen:
netplan try -timeout 180
Mach die Rakete oder wenn's funktioniert, dauerhaft anwenden:
netplan apply
Debian - Statische IP Setzen
Statische IP
Um unter Debian dauerhaft eine feste IP-Adresse zu setzen, musst du die Datei /etc/network/interfaces bearbeiten.
Debian:
Öffne die Datei mit nano /etc/network/interfaces und ersetze ihren Inhalt beispielsweise durch Folgendes:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.0.0.10
netmask 255.255.255.0
gateway 10.0.0.1
dns-nameservers 1.1.1.1 8.8.8.8
dns-search example.local
up echo "supersede ntp-servers 10.0.0.1;" >> /etc/dhcp/dhclient.conf
up echo "supersede bootfile-name 'pxelinux.0';" >> /etc/dhcp/dhclient.conf
up echo "supersede next-server 10.0.0.1;" >> /etc/dhcp/dhclient.conf
eth0 ist hier dein Netzwerk‑Interface (Name kann abweichen – prüfe mit ip a).
Testen:
netplan try -timeout 180
Dauerhaft anwenden:
netplan apply
DNS Server
Falls du die DNS‑Server nicht über DHCP verteilen möchtest oder sie sich häufig ändern, kannst du /etc/resolv.conf direkt anpassen (und optional schreibschützen):
nameserver 1.1.1.1
nameserver 8.8.8.8
Schreibschutz aktivieren:
chattr +i /etc/resolv.conf
Schreibschutz entfernen:
chattr -i /etc/resolv.conf
NTP Server abfragen und Netzwerk prüfen
NTP nutzt UDP Port 123. Ein normaler TCP-Portcheck ist daher nicht ausreichend. Wenn bestimmte NTP-Server per IP-Adresse getestet werden sollen, muss eine echte NTP-Anfrage an diese IP gesendet werden.
Keine Zusatzpakete notwendig
Der folgende Test benötigt keine zusätzlichen NTP-Tools wie ntpdig, sntp oder ntpdate. Er verwendet nur python3, falls es auf dem System vorhanden ist.
Auf normalen Debian-Systemen ist python3 häufig vorhanden. Auf sehr minimalen Systemen ist das aber nicht garantiert. Ohne python3 oder ein NTP-Tool ist ein sauberer direkter NTP-Test gegen beliebige IP-Adressen nicht sinnvoll möglich.
1. Einzelne NTP-IP testen
Beispiel-IP anpassen:
python3 - 192.168.10.10 <<'PY'
import datetime
import ipaddress
import socket
import struct
import sys
if len(sys.argv) != 2:
print("FEHLER: Bitte genau eine IP-Adresse angeben.")
sys.exit(2)
host = sys.argv[1].strip()
try:
ipaddress.ip_address(host)
except ValueError:
print(f"FEHLER {host}: Keine gültige IP-Adresse.")
sys.exit(2)
packet = bytearray(48)
packet[0] = 0x23
try:
infos = socket.getaddrinfo(host, 123, type=socket.SOCK_DGRAM)
family, socktype, proto, _, sockaddr = infos[0]
with socket.socket(family, socktype, proto) as sock:
sock.settimeout(3)
sock.sendto(packet, sockaddr)
data, addr = sock.recvfrom(512)
if len(data) < 48:
print(f"FEHLER {host}: Antwort zu kurz, keine gültige NTP-Antwort.")
sys.exit(1)
stratum = data[1]
tx_seconds, tx_fraction = struct.unpack("!II", data[40:48])
unix_time = tx_seconds - 2208988800 + tx_fraction / 2**32
server_time = datetime.datetime.fromtimestamp(unix_time, datetime.timezone.utc)
if stratum == 0:
print(f"WARNUNG {host}: Antwort erhalten, aber Stratum 0. Server lehnt die Anfrage möglicherweise ab.")
else:
print(f"OK {host}: NTP-Antwort erhalten, Stratum {stratum}, Serverzeit {server_time.isoformat()}")
except socket.timeout:
print(f"FEHLER {host}: Timeout. Keine NTP-Antwort über UDP Port 123.")
sys.exit(1)
except OSError as e:
print(f"FEHLER {host}: Netzwerkfehler: {e}")
sys.exit(1)
PY
2. Mehrere NTP-IPs testen
Die IP-Adressen in der ersten Zeile anpassen:
for ip in 192.168.10.10 192.168.10.11 192.168.10.12; do
python3 - "$ip" <<'PY'
import datetime
import ipaddress
import socket
import struct
import sys
host = sys.argv[1].strip()
try:
ipaddress.ip_address(host)
except ValueError:
print(f"FEHLER {host}: Keine gültige IP-Adresse.")
sys.exit(2)
packet = bytearray(48)
packet[0] = 0x23
try:
infos = socket.getaddrinfo(host, 123, type=socket.SOCK_DGRAM)
family, socktype, proto, _, sockaddr = infos[0]
with socket.socket(family, socktype, proto) as sock:
sock.settimeout(3)
sock.sendto(packet, sockaddr)
data, addr = sock.recvfrom(512)
if len(data) < 48:
print(f"FEHLER {host}: Antwort zu kurz, keine gültige NTP-Antwort.")
sys.exit(1)
stratum = data[1]
tx_seconds, tx_fraction = struct.unpack("!II", data[40:48])
unix_time = tx_seconds - 2208988800 + tx_fraction / 2**32
server_time = datetime.datetime.fromtimestamp(unix_time, datetime.timezone.utc)
if stratum == 0:
print(f"WARNUNG {host}: Antwort erhalten, aber Stratum 0. Server lehnt die Anfrage möglicherweise ab.")
else:
print(f"OK {host}: NTP-Antwort erhalten, Stratum {stratum}, Serverzeit {server_time.isoformat()}")
except socket.timeout:
print(f"FEHLER {host}: Timeout. Keine NTP-Antwort über UDP Port 123.")
except OSError as e:
print(f"FEHLER {host}: Netzwerkfehler: {e}")
PY
done
3. Prüfen, ob Python vorhanden ist
python3 --version
Wenn eine Versionsnummer angezeigt wird, kann der Test verwendet werden. Wenn python3: command not found erscheint, ist Python auf diesem System nicht installiert.
Warum nicht curl oder wget?
curl und wget können keine echte NTP-Abfrage machen. NTP läuft über UDP Port 123, nicht über HTTP oder HTTPS.
Mit curl oder wget kann man nur prüfen, ob HTTP/HTTPS funktioniert:
curl -I https://www.debian.org
wget --spider https://www.debian.org
Das sagt aber nichts Sicheres darüber aus, ob NTP über UDP Port 123 erlaubt ist. Denn natürlich kann Netzwerkdiagnose nicht einfach mal logisch sein.
Warum nicht nur Bash mit /dev/udp?
Bash kann zwar Daten an /dev/udp/IP/PORT senden, aber UDP hat keinen Verbindungsaufbau wie TCP. Nur weil ein UDP-Paket gesendet wurde, weiß man noch nicht, ob ein NTP-Server geantwortet hat.
Für einen brauchbaren Test muss eine echte NTP-Anfrage gesendet und die Antwort ausgewertet werden. Genau das macht der Python-Test oben.
Ergebnis bewerten
| Ergebnis | Bedeutung |
|---|---|
OK ... NTP-Antwort erhalten |
Die IP-Adresse antwortet auf NTP über UDP Port 123. |
WARNUNG ... Stratum 0 |
Der Server hat geantwortet, lehnt die Anfrage aber möglicherweise ab oder liefert keine nutzbare Zeit. |
Timeout |
Keine Antwort erhalten. UDP Port 123 wird möglicherweise blockiert oder der Server antwortet nicht. |
Netzwerkfehler |
Es gibt ein lokales Netzwerkproblem, Routingproblem oder ein Problem mit der Adresse. |
Keine gültige IP-Adresse |
Der angegebene Wert ist keine gültige IPv4- oder IPv6-Adresse. |
Kurzfazit
Wenn bestimmte IP-Adressen getestet werden sollen, reicht timedatectl nicht aus. Für einen direkten Test braucht man entweder ein NTP-Tool wie ntpdig oder einen kleinen UDP-NTP-Test wie oben mit python3.
Ohne python3, ntpdig, sntp oder ntpdate ist ein sauberer direkter NTP-Test gegen beliebige IP-Adressen nicht realistisch möglich.