# 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**:

```bash
netplan try -timeout 180
```

Mach die Rakete oder wenn's funktioniert, **dauerhaft** anwenden:

```bash
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:

```bash
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:**

```bash
netplan try -timeout 180
```

**Dauerhaft anwenden:**

```bash
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):

```bash
nameserver 1.1.1.1
nameserver 8.8.8.8
```

**Schreibschutz aktivieren:**

```bash
chattr +i /etc/resolv.conf
```

**Schreibschutz entfernen:**

```bash
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

<table id="bkmrk-ergebnis-bedeutung-a"><thead><tr><th>Ergebnis</th><th>Bedeutung</th></tr></thead><tbody><tr><td>`OK ... NTP-Antwort erhalten`</td><td>Die IP-Adresse antwortet auf NTP über UDP Port 123.</td></tr><tr><td>`WARNUNG ... Stratum 0`</td><td>Der Server hat geantwortet, lehnt die Anfrage aber möglicherweise ab oder liefert keine nutzbare Zeit.</td></tr><tr><td>`Timeout`</td><td>Keine Antwort erhalten. UDP Port 123 wird möglicherweise blockiert oder der Server antwortet nicht.</td></tr><tr><td>`Netzwerkfehler`</td><td>Es gibt ein lokales Netzwerkproblem, Routingproblem oder ein Problem mit der Adresse.</td></tr><tr><td>`Keine gültige IP-Adresse`</td><td>Der angegebene Wert ist keine gültige IPv4- oder IPv6-Adresse.</td></tr></tbody></table>

---

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