# Hetzner-Server

Auf dem Weg weg von Knipp wurde im August 2022 ein Server bei Hetzner gemietet. Der Server vom Modell [AX51](https://www.hetzner.com/dedicated-rootserver/ax51) steht im deutschen Rechenzentrum und wir über den Robot-User <office@ping.de> verwaltet. <span class="anchor" id="bkmrk-"></span><span class="anchor" id="bkmrk--1"></span>

Der Server heißt `laboratory.ping.de` (CNAME `lab.ping.de`) und ist über die IP-Adressen `167.235.0.46` und `2a01:4f8:262:445e::2` zu erreicht. <span class="anchor" id="bkmrk--2"></span><span class="anchor" id="bkmrk--3"></span>

## Technische Daten

<span class="anchor" id="bkmrk--5"></span>

- CPU: Octa-Core AMD Ryzen™ 7 3700X <span class="anchor" id="bkmrk--6"></span>
- RAM: 128 GB DDR4 ECC <span class="anchor" id="bkmrk--7"></span>
- HDD: 2 x 12 TB <span class="anchor" id="bkmrk--8"></span>
- SSD: 512 GB NVME SSD <span class="anchor" id="bkmrk--9"></span>
- Netzwerk: 1 Gbit/s <span class="anchor" id="bkmrk--10"></span>
- Primäre IPv4-Adresse und /64-IPv6-Netz <span class="anchor" id="bkmrk--11"></span><span class="anchor" id="bkmrk--12"></span>

## Software

<span class="anchor" id="bkmrk--14"></span>

Das System läuft aktuell mit einem Proxmox 8.14 Image. Dies ist eine auf Debian 12 (Bookworm) basierte Virtualisierungslösung, die eine Web-Oberfläche bietet. Proxmox kann VMs (auf Basis von KVM) und Container (lxc) verwalten. Die Konfiguration richtet sich an der Doku von Proxmox. Verwendete Bridge-Namen und IP-Netze entsprechend (soweit möglich) den Beispielen der Doku. <span class="anchor" id="bkmrk--15"></span><span class="anchor" id="bkmrk--16"></span>

Das Webinterface von Proxmox kann über [https://laboratory.ping.de:8006/](https://laboratory.ping.de:8006/) erreicht werden. <span class="anchor" id="bkmrk--17"></span><span class="anchor" id="bkmrk--18"></span>

Zum Login können die Nutzer des Systems über `pam` genutzt werden. Diese müssen aber wie folgt für Proxmox aktiviert werden: <span class="anchor" id="bkmrk--19"></span><span class="anchor" id="bkmrk--20"></span>

<span class="anchor" id="bkmrk--22"></span><span class="anchor" id="bkmrk--23"></span><span class="anchor" id="bkmrk--24"></span>

```
pveum user add <login>@pam
pveum acl modify / --roles PVEAdmin --users <login>@pam
```

<span class="anchor" id="bkmrk--26"></span>

## Storage

<span class="anchor" id="bkmrk--28"></span>

Bei der Installation des Systems wurde ein RAID-1 über beide HDDs gebildet und in einer LVM-Volumegroup verwendet. Die NVMe-SSD wurde nicht eingebunden und wird später über LVM als Cache für bestimme LVs genutzt (z.B. Mailqueue). <span class="anchor" id="bkmrk--29"></span><span class="anchor" id="bkmrk--30"></span>

## Netzwerk

<span class="anchor" id="bkmrk--32"></span>

Da aktuell nur eine öffentliche IPv4-Adresse verfügbar ist, wird diese an keine VM gebunden, sonder die benötigten Ports werden an die VMs weitergeleitet. Die VMs (und Container) sind an die interne Bridge `vmbr0` gebunden. Hier wird das interne IPv4-Netz `10.10.10.0/24` verwendet. Für IPv6 wird das Netz `2a01:4f8:262:445e:100::0/72` auf die Bridge geroutet. <span class="anchor" id="bkmrk--33"></span><span class="anchor" id="bkmrk--34"></span>

### haProxy

<span class="anchor" id="bkmrk--36"></span>

Für viele VMs/Container ist das Teilen einer IPv4-Adresse relativ problemlos. Da z.B. der Container für DNS andere Ports verwendet als die Mail-VM können diese einfach aufgeteilt werden. Problematischer wird dies mit Port 80 und 443. Diese Ports werden sowohl von der Mail-VM genutzt als auch von einem Webserver-Container. Aus diesem Grund werden Port 80 und 443 nicht an eine VM weitergeleitet, sondern auf dem Host selbst über haProxy als Reverse-Proxy weitergeleitet. Dabei nutzt haProxy für Port 80 den im HTTP-Request angegeben Host und auf 443 wird SNI zur Unterscheidung genutzt. Dies hat den Vorteil, dass haProxy eine Verbindung auf Port 443 an die Ziel-VM weiterleitet, ohne die Verschlüsselung aufzutrennen. Somit bleiben auch sämtliche Daten bis in die VM verschlüsselt und andere VMs können nicht durch Sniffen an der Bridge die Kommunikation einsehen. <span class="anchor" id="bkmrk--37"></span><span class="anchor" id="bkmrk--38"></span>

Konfiguriert wird haProxy auf dem Basissystem über das Config-File `/etc/haproxy/haproxy.cfg`. Neue VMs oder Namen werden dabei als `backend` konfiguriert. Dies geschieht für Port `80` und `443` getrennt. Für eine Test-VM mit der internen IPv4-Adresse `10.10.10.2` sieht dies wie folgt aus: <span class="anchor" id="bkmrk--39"></span><span class="anchor" id="bkmrk--40"></span>

<span class="anchor" id="bkmrk--42"></span><span class="anchor" id="bkmrk--43"></span><span class="anchor" id="bkmrk--44"></span><span class="anchor" id="bkmrk--45"></span><span class="anchor" id="bkmrk--46"></span><span class="anchor" id="bkmrk--47"></span><span class="anchor" id="bkmrk--48"></span><span class="anchor" id="bkmrk--49"></span><span class="anchor" id="bkmrk--50"></span><span class="anchor" id="bkmrk--51"></span><span class="anchor" id="bkmrk--52"></span>

```
backend testvm_https
        mode tcp
        option ssl-hello-chk
        source 0.0.0.0 usesrc clientip
        server testvm:443 10.10.10.2:443 weight 100

backend testvm_http
        mode http
        source 0.0.0.0 usesrc clientip
        server testvm:80 10.10.10.2:80 weight 100
```

<span class="anchor" id="bkmrk--54"></span>

Speziell ist dabei das Keyword `usesrc`, wodurch die `tproxy`-Funktion haProxy aktiviert wird. Dies bedeutet, dass die VMs die ursprüngliche IP des Clients sehen und diese auch entsprechend loggen oder filtern können. <span class="anchor" id="bkmrk--55"></span><span class="anchor" id="bkmrk--56"></span>

Um die Backends zu nutzen, müssen diese in den entsprechenden Frontends für http und https hinzugefügt werden: <span class="anchor" id="bkmrk--57"></span><span class="anchor" id="bkmrk--58"></span>

<span class="anchor" id="bkmrk--60"></span><span class="anchor" id="bkmrk--61"></span><span class="anchor" id="bkmrk--62"></span><span class="anchor" id="bkmrk--63"></span><span class="anchor" id="bkmrk--64"></span><span class="anchor" id="bkmrk--65"></span><span class="anchor" id="bkmrk--66"></span><span class="anchor" id="bkmrk--67"></span><span class="anchor" id="bkmrk--68"></span><span class="anchor" id="bkmrk--69"></span><span class="anchor" id="bkmrk--70"></span><span class="anchor" id="bkmrk--71"></span><span class="anchor" id="bkmrk--72"></span><span class="anchor" id="bkmrk--73"></span><span class="anchor" id="bkmrk--74"></span><span class="anchor" id="bkmrk--75"></span><span class="anchor" id="bkmrk--76"></span>

```
frontend http
        bind 167.235.0.46:80 transparent
        mode http

        ## exact matches
        use_backend testvm_http if { hdr(Host) -i testvm.ping.de } !{ ssl_fc }

frontend https
        option tcplog
        bind 167.235.0.46:443 transparent
        mode tcp
        tcp-request inspect-delay 5s
        tcp-request content accept if { req_ssl_hello_type 1 }

        ## exact matches
        use_backend testvm_https if { req.ssl_sni -i testvm.ping.de }
```

<span class="anchor" id="bkmrk--78"></span>

Über den Teil in den Klammern hinter dem `if` wird der Hostname geprüft. <span class="anchor" id="bkmrk--79"></span><span class="anchor" id="bkmrk--80"></span>

## Aktuelle VMs/Container

<span class="anchor" id="bkmrk--82"></span>

Folgende VMs und Container sind aktuell konfiguriert: <span class="anchor" id="bkmrk--83"></span><span class="anchor" id="bkmrk--84"></span>

### TestVM

<span class="anchor" id="bkmrk--86"></span>

Eine kleine Debian 11 VM mit einem Webserver zum Testen des haProxy. Abgeschaltet wenn nicht benötigt. <span class="anchor" id="bkmrk--87"></span><span class="anchor" id="bkmrk--88"></span>

### e.ns.ping.de

<span class="anchor" id="bkmrk--90"></span>

Container mit konfiguriertem Bind. Dient als Nameserver für `ping.de`, `prima.de`, `ping.ruhr` und `prima.ruhr`, um auch noch dann von Nutzen zu sein, wenn Knipp mal wieder vollständig ausfällt. Die Zonen werden aktuell von den Servern bei Knipp über `AXFR` gezogen sobald diese sich dort ändern. <span class="anchor" id="bkmrk--91"></span><span class="anchor" id="bkmrk--92"></span>

Im Falle eines Ausfalls von Knipp könnte hier angesetzt werden, um z.B. `www.ping.de` auf einen anderen Webserver umzubiegen. <span class="anchor" id="bkmrk--93"></span><span class="anchor" id="bkmrk--94"></span>

### mail.ping.ruhr

<span class="anchor" id="bkmrk--96"></span>

Debian 11 (Bullseye) VM mit Docker und den Mailcow-Docker-Containern für unseren Test mit den `*.ping.ruhr`- und `*.prima.ruhr`-Domains. Das Mailcow hat alle PING- und Prima-Sites konfiguriert (nur halt mit der `.ruhr`-Endung) und kann entsprechend für Tests genutzt werden. <span class="anchor" id="bkmrk--97"></span><span class="anchor" id="bkmrk--98"></span>

### lilly

<span class="anchor" id="bkmrk--100"></span>

Debian 12 (Bookworm) <span class="anchor" id="bkmrk--101"></span><span class="anchor" id="bkmrk--102"></span>

### lucy

<span class="anchor" id="bkmrk--104"></span>

Debian 10 Buster <span class="anchor" id="bkmrk--105"></span><span class="anchor" id="bkmrk--106"></span>

News-Server mit architektur-abhängigem Storage 32bit <span class="anchor" id="bkmrk--107"></span><span class="anchor" id="bkmrk--108"></span>

### hafen

<span class="anchor" id="bkmrk--110"></span>

Debian 12. <span class="anchor" id="bkmrk--111"></span><span class="anchor" id="bkmrk--112"></span>

Docker Container Server: <span class="anchor" id="bkmrk--113"></span><span class="anchor" id="bkmrk--114"></span>

- [portainer](https://hafen.ping.de:9443/), <span class="anchor" id="bkmrk--115"></span>
- [Keycloak](https://auth.ping.de/) (auth), <span class="anchor" id="bkmrk--116"></span>
- [Nextcloud](https://cloud.ping.de/) (cloud), <span class="anchor" id="bkmrk--117"></span>
- [mastodon](https://mastodon.ping.de/), Derzeit mit Patch beim Starten der etwas längere Nachrichten erlaubt: <span class="anchor" id="bkmrk--118"></span><span class="anchor" id="bkmrk--119"></span>
- <span class="anchor" id="bkmrk--120"></span><span class="anchor" id="bkmrk--121"></span>```
    sed -ie 's/MAX_CHARS = 500/MAX_CHARS = 1500/' app/validators/status_length_validator.rb
    ```
    
    <span class="anchor" id="bkmrk--122"></span>
- Matrix (Synapse Port 8448), <span class="anchor" id="bkmrk--123"></span>
- Jabber (ejabberd), <span class="anchor" id="bkmrk--124"></span>
- bookstack <span class="anchor" id="bkmrk--125"></span><span class="anchor" id="bkmrk--126"></span>

### vserver

<span class="anchor" id="bkmrk--128"></span>

VM für Mitglieder VPS <span class="anchor" id="bkmrk--129"></span><span class="anchor" id="bkmrk--130"></span>

### conf

<span class="anchor" id="bkmrk--132"></span>

Big Blue Button BBB Videokonferenz <span class="anchor" id="bkmrk--133"></span><span class="anchor" id="bkmrk--134"></span>

### zooey

<span class="anchor" id="bkmrk--136"></span>

u.a. wiki.ping.de (ehemals techdoc und aktiv wikis)