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 Gateway nameservers: 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.