Skip to content

Commit 16b1ca4

Browse files
committed
theorie: rewrite
1 parent 6b440e8 commit 16b1ca4

3 files changed

Lines changed: 121 additions & 104 deletions

File tree

docs/30_theorie.md

Lines changed: 77 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,82 @@
1-
# Theorie (Namen werden noch überarbeitet)
2-
3-
## Anwendungsbereiche für Teilempfehlungenen
4-
5-
### IPv6 Adresse für jeden Service einzeln
6-
Wenn man jeden Nginx reverse Proxy mit einer separaten Adresse (in unserem Fall IPv6, da wir kein IPv4 Netz besitzen)
7-
versorgt, so kann man direkt auf OSI Layer 3 nachvollziehen auf welchem Service die Request kam. Wenn man für alle
8-
Services nur eine IP-Adresse verwenden würde, so könnte man frühestens auf Layer 5 (TLS/SNI) nachvollziehen auf welcher
9-
Applikation die Request kam. Alternativ auch auf Layer 7, aber dies sollte nicht der Anspruch sein und wäre auch zu viel
10-
Aufwand alle Application Logs nach einer IP-Adresse zu durchsuchen.
11-
12-
### Wofür benötigt man einen IPv4 -> IPv6 Proxy?
13-
#### Use Case 1 - Virtualisierung mit nur einer IPv4 Adresse
14-
Wenn man sich jetzt vorstellt, dass man einen Server hat, welcher zwei virtuelle Maschinen betreibt auf denen jeweils
15-
zwei Webserver laufen, so muss man sich fragen wie man damit umgeht.
16-
17-
1. Entscheiden für einen Webserver
18-
2. Aufsetzen eines zentralen reverse Proxies
19-
3. IPv4 -> IPv6 Proxy
20-
21-
=== "Für einen Webserver entscheiden"
22-
- Keine Option, da man beide Webserver verwenden will
23-
24-
=== "Aufsetzen eines zentralen reverse Proxies"
25-
- Pro:
26-
- Beide VMs können exposed werden
27-
- Zentralisierter Aufruf auf einen reverse Proxy
28-
- Contra:
29-
- langsamere Laufzeit durch mehre Proxys (Die Proxys auf den VMs brauchen man ja dennoch)
30-
- SPOF (Single point of failure) - Wenn der erste reverse Proxy nicht mehr funktioniert, kann auf kein Service mehr zugegriffen werden
31-
- Vermehrter Debugging Aufwand durch mehrere Verbindungsstellen
32-
- Aufwendigere Konfiguration (spezifische Header Einstellungen (Real-IP Forwarded-For))
33-
34-
=== "IPv4 -> IPv6 Proxy"
35-
- Pro:
36-
- Für IPv6 geringere Laufzeit (veraltetes IPv4 Protokoll)
37-
- Reverse Proxies der VMs sind direkt im Internet
38-
- dadurch keine Header Konfiguration nötig
39-
- Falls der zentrale IPv4 Proxy nicht mehr funktioniert, so ist der Service immer noch über IPv6 erreichbar
40-
- Contra:
41-
- Uns keine bekannt, falls euch welche einfallen, bitten wir um einen Pull Request
42-
43-
44-
#### Use Case 2 - IPv6 only Server
45-
Man stelle sich vor, dass man ganz viele Server hat. Um Kosten zu sparen gibt man jedem Server nur ein IPv6 Netz
46-
und keine IPv4 Adresse. So braucht man nur einen zentralen IPv4->IPv6 Proxy um die Erreichbarkeit der Server über IPv4
47-
sicher zu stellen.
48-
1+
# Theoretische Grundlagen
2+
3+
## Wahl des Reverse Proxies
4+
Im Rahmen dieses Guides werden nginx auf dem Host sowie Traefik als Container vorgestellt.
5+
6+
Nginx ist ein leistungsstarker und weit verbreiteter Webserver und Reverse Proxy, der sich
7+
durch hohe Stabilität, Effizienz und Flexibilität in klassischen Serverumgebungen auszeichnet.
8+
9+
Traefik hingegen ist speziell auf containerisierte Umgebungen ausgelegt und integriert sich
10+
nahtlos mit Plattformen wie Docker oder Kubernetes. Es erkennt neue Services automatisch und
11+
konfiguriert Routing-Regeln dynamisch, was es besonders für moderne, dynamische Deployments
12+
attraktiv macht.
13+
14+
## Eine IPv6 Adresse pro Service
15+
16+
!!! note
17+
Die meisten Hosting-Provider weisen jedem Server ein /64-IPv6-Präfix zu,
18+
was einem Adressraum von $2^{64}$ Adressen entspricht – eine Zahl, die in
19+
der Praxis quasi unerschöpflich ist.
20+
21+
Ausnahmen gibt es beispielsweise bei Strato, siehe dieses
22+
[Video](https://www.youtube.com/shorts/oSvU4HXZ_Wc).
23+
24+
Wird jedem nginx Reverse Proxy eine eigene IPv6-Adresse zugewiesen, kann bereits auf OSI-Layer 3
25+
nachvollzogen werden, an welchen Webservice eine Anfrage gerichtet war. Würde hingegen für alle
26+
Dienste nur eine gemeinsame Adresse verwendet, wäre eine eindeutige Zuordnung frühestens auf
27+
Layer 5 (durch Auswertung des TLS SNI Headers) möglich; ohne ein spezielles Analysewerkzeug sogar
28+
erst auf Layer 7, etwa über die Logdaten des Webservers.
29+
30+
Der Webserver nginx bietet mit der Direktive `listen` die Möglichkeit, virtuelle Hosts an spezifische
31+
IPv4- oder IPv6-Adressen zu binden. Diese Technik erlaubt eine frühzeitige Trennung und Zuordnung des
32+
eingehenden Traffics zu den einzelnen Anwendungen. Soll ein Dienst abgeschaltet oder vorübergehend
33+
blockiert werden, kann dessen zugewiesene Adresse zudem sehr einfach über die Firewall – oder sogar
34+
direkt beim Provider – gesperrt werden, ohne dass Änderungen an der Servicekonfiguration selbst
35+
erforderlich sind.
36+
37+
## Sonderfälle
38+
### Virtualisierungsserver
39+
Zwar richtet sich dieser Guide in erster Linie an Administratoren einfacher vServer, doch kann es
40+
schnell vorkommen, dass aufgrund steigender Leistungsanforderungen auf einen dedizierten Server
41+
gewechselt wird.
42+
43+
Nehmen wir an, ein solcher Server verfügt über eine IPv4-Adresse und ein /64-IPv6-Präfix, auf dem
44+
mehrere virtuelle Maschinen betrieben werden sollen. Das Hostsystem, das direkt auf der physischen
45+
Hardware installiert ist, kann in diesem Szenario als Router fungieren. Über NAT und Port Address
46+
Translation (PAT) lassen sich dabei gezielt einzelne Ports an die virtualisierten Systeme weiterleiten.
47+
48+
Dank des zugewiesenen IPv6-Präfixes kann jedoch jeder virtuellen Maschine eine eigene öffentliche
49+
IPv6-Adresse zugeordnet werden, wodurch sie direkt aus dem Internet erreichbar ist – ganz ohne NAT.
50+
51+
In diesem Zusammenhang kann der Einsatz eines IPv4-zu-IPv6-Proxys sinnvoll sein. Ein solcher Proxy
52+
nimmt Anfragen über IPv4 entgegen und leitet sie intern per IPv6 an den Zielserver weiter. Auf diese
53+
Weise bleibt die Erreichbarkeit auch für IPv4-Clients gewährleistet, selbst wenn die eigentliche
54+
Infrastruktur ausschließlich auf IPv6 basiert.
55+
56+
### IPv6-only Server
57+
Angenommen, es steht eine größere Anzahl von Servern zur Verfügung. Um Kosten und Verwaltungsaufwand
58+
zu reduzieren, wird dabei bewusst auf individuelle IPv4-Adressen verzichtet und jedem System ausschließlich
59+
ein IPv6-Netz zugewiesen.
60+
61+
!!! warning
62+
Dieses Setup impliziert, dass die Systeme selbst keine ausgehende IPv4-Verbindung aufbauen können.
63+
Das kann die Administration erschweren – beispielsweise, wenn Repositories von GitHub, Docker Hub oder
64+
anderen ausschließlich über IPv4 erreichbaren Diensten bezogen werden sollen. In solchen Fällen ist
65+
entweder ein IPv6-fähiger Mirror oder ein NAT64-Gateway erforderlich, um den Zugriff zu ermöglichen.
66+
67+
Die wenigsten Anbieter stellen derzeit NAT64 Gateways zur Verfügung, weshalb zum derzeitigen Zeitpunkt
68+
von dieser Systemarchitektur abzuraten ist.
69+
70+
Die Erreichbarkeit dieser Server aus dem IPv4-Internet kann in einem solchen Szenario über einen zentralen
71+
IPv4-zu-IPv6-Proxy sichergestellt werden. Dieser Proxy fungiert als gemeinsame Eingangsstelle für alle
72+
IPv4-Anfragen und leitet sie intern über IPv6 an die jeweiligen Zielsysteme weiter – effizient, kostensparend
73+
und ohne die Notwendigkeit zusätzlicher IPv4-Ressourcen.
4974

5075
### IPv4-to-IPv6 Proxy
51-
Dieser einfache IPv4-to-IPv6 Proxy unterstützt in seiner ersten Version lediglich HTTP Verbindungen auf Port 80 und TLS
52-
Verbindungen auf Port 443. Eine Anpassung dieser Konfiguration um einige anderen Protokolle (SMTPs, IMAPs, POP3s) welche
53-
TLS verwenden zu unterstützten ist denkbar.
54-
55-
Aus Gründen der Vollständigkeit hier einmal die Nginx Konfiguration für den Proxy für Alpine Linux. Die Einrichtung ist
56-
denkbar einfach: nginx installieren, die untenstehende Konfiguration kopieren und den Proxy starten:
76+
Im folgenden wird eine einfache nginx Konfiguration vorgestellt, welche als IPv4-to-IPv6 Proxy eingesetzt
77+
werden kann. In seiner aktuellen Version unterstützt er ausschließlich HTTP- und HTTPs-Verbindungen. Mit
78+
geringfügigen Anpassungen der Konfiguration lässt sich der Proxy jedoch auch für andere TLS-gesicherte
79+
Protokolle wie SMTPs, IMAPs oder POP3s einsetzen.
5780

5881
```nginx
5982
user nginx;
@@ -62,7 +85,6 @@ worker_processes auto;
6285
error_log /var/log/nginx/error.log notice;
6386
pid /var/run/nginx.pid;
6487
65-
6688
events {
6789
worker_connections 1024;
6890
}
@@ -88,7 +110,6 @@ http {
88110
}
89111
90112
stream {
91-
# https://gist.github.com/kekru/c09dbab5e78bf76402966b13fa72b9d2#non-terminating-tls-pass-through
92113
server {
93114
listen 443;
94115
@@ -102,20 +123,3 @@ stream {
102123
}
103124
}
104125
```
105-
106-
### Vergleich der Proxy Möglichkeiten
107-
108-
![Schaubild](../img/schaubild_cloudflare-vs-transparent-proxy.png){: loading=lazy }
109-
110-
Aus unserer Sicht ergibt die Verwendung eines eigenen vorgeschalteten Proxies nur Sinn, wenn mehr als ein Server
111-
administriert wird und die Web-Server über IPv6 Adressen nach außen bereitstellt werden.
112-
113-
Wird lediglich ein System betreut (wie z.B. der oben erwähnte Cloudserver), kann die zugewiesene IPv4 Adresse natürlich
114-
ebenfalls auf den Ports 80 und 443 verwendet werden und dann auf den Reverse Proxy zeigen. Dadurch entfällt die
115-
Abhängigkeit zu anderen Systemen.
116-
117-
Sofern der Cloudserver über keine eigene IPv4 Adresse oder keine eigenen IPv6 Adressen verfügt, sollte ein Proxy
118-
vorgeschaltet werden, um den Nutzern, die keine IPv4/IPv6 Adresse verfügen, den Zugriff zu ermöglichen.
119-
120-
121-
## Vergleich nginx / traefik

docs/index.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Startseite
22

3-
Diese Informationssammlung beschreibt das von mir eingesetzten Verfahren zum
4-
Aufsetzen eines Linux Servers mit Anwendungen in Docker Containern. Hauptsächlich
5-
handelt es sich in meinem Fall um webbasierte Anwendungen. Diese werden mit einem
6-
Reverse Proxy ([Traefik](https://traefik.io/) als Docker Container, oder
7-
[nginx](https://www.nginx.com/) auf dem Host) erreichbar gemacht.
3+
Diese Informationssammlung beschreibt ein mögliches Verfahren zum Aufsetzen eines
4+
Linux Servers mit Anwendungen in Docker Containern. Die meisten hier vorgestellten
5+
Anwendungen sind webbasiert und werden über einen Reverse Proxy ([Traefik](https://traefik.io/)
6+
als Docker Container, oder [nginx](https://www.nginx.com/) auf dem
7+
Host) aus dem Internet erreichbar gemacht.
88

99
## Lokales HTTP Routing
1010
Nachdem die Anfragen den Reverse Proxy auf unserem eigenen Host erreicht haben, werden
@@ -13,7 +13,7 @@ an den Container weitergeleitet, der den Dienst bereitstellt.
1313

1414
## Verzeichnisstruktur
1515
Jeder bereitgestellte Dienst erhält zwei Verzeichnisse:
16-
1. Im Verzeichnis `/home/admin/<service>` liegt die Containerdefinition (`docker-compose.yml`),
16+
1. Im Verzeichnis `/home/admin/<service>` liegt die Container-Definition (`docker-compose.yml`),
1717
2. die Daten des Dienstes werden im Verzeichnis `/srv/<service>` gespeichert.
1818

1919
### Umgebungsvariablen

docs/installation/05_base.md

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,51 @@
11
# Basisinstallation
22

3-
Jeder, der diese Informationssammlung nutzt, sollte in der Lage sein, seinen
4-
Linux Server grundlegend einzurichten und abzusichern. Daher verzichte ich hier
5-
auf Standardanleitungen und stelle lediglich die spezifischen Konzepte vor.
3+
!!! note
4+
Jeder, der diese Informationssammlung nutzt, sollte in der Lage sein, seinen
5+
Linux Server grundlegend einzurichten und abzusichern. Daher verzichte ich hier
6+
auf Standardanleitungen und stelle lediglich die spezifischen Konzepte vor.
67

78
## Admin Gruppe
8-
9-
Ich gehe grundsätzlich davon aus, dass ich auf keinem System der alleinige
10-
Administrator bin, weshalb auf allen Systemen eine Admin-Gruppe existiert,
11-
die Rechte auf das Verzeichnis `/home/admin` hat.
9+
Ich gehe grundsätzlich davon aus, dass ich auf keinem System der alleinige Administrator
10+
bin. Auf all meinen Systemen existiert daher eine eigene Admin-Gruppe, die Zugriff auf das
11+
Verzeichnis `/home/admin` besitzt. Diese Gruppe dient als zentraler Ablageort für
12+
Container-Definitionen, Umgebungsvariablen-Dateien und Skripte.
13+
14+
!!! warning "`admin` vs. `adm`"
15+
In vielen Linux-Distributionen – unter anderem auch in Debian – existiert
16+
standardmäßig die Gruppe `adm`. Sie ist für Aufgaben der Systemüberwachung
17+
vorgesehen und gewährt ihren Mitgliedern erweiterte Leserechte auf zahlreiche
18+
Logdateien im Verzeichnis /var/log.
19+
20+
Für den hier beschriebenen Anwendungsfall ist die Nutzung dieser Gruppe jedoch
21+
ausdrücklich nicht vorgesehen, da sie administrative Berechtigungen über den
22+
eigentlichen Bedarf hinaus gewährt und somit ein potenzielles Sicherheitsrisiko
23+
darstellen kann.
1224

1325
```shell
1426
groupadd -g 1100 admin
15-
mkdir -m 775 /home/admin
27+
mkdir -m 770 /home/admin
1628
chown root:admin /home/admin
1729
```
1830

19-
Die personalisierten Accounts der Systemadministratoren erhalten neben der `sudo`
20-
Gruppenmitgliedschaft auch die Gruppe `admin`:
31+
Die personalisierten Benutzerkonten der Systemadministratoren werden zusätzlich
32+
zur Mitgliedschaft in der Gruppe `sudo` auch der Gruppe `admin` hinzugefügt.
2133

2234
```shell
2335
adduser nicof2000
2436
usermod -aG sudo,admin nicof2000
2537
```
2638

2739
## Docker
28-
29-
Die Installation von Docker ist in der offiziellen [Dokumentation](https://docs.docker.com/engine/install/debian/)
30-
bereits sehr gut beschrieben. Zusätzlich richten wir einen Alias ein,
31-
um uns die wiederholte Eingabe von sudo docker compose zu ersparen.
40+
Die Installation von Docker ist in der offiziellen [Dokumentation](https://docs.docker.com/engine/install/debian/)
41+
bereits sehr gut beschrieben. Zusätzlich richten wir einen Alias ein, um uns die wiederholte
42+
Eingabe von `sudo docker compose` zu ersparen.
3243
```shell
3344
curl -fsSL https://get.docker.com | sudo bash
3445
echo 'alias dc="sudo docker compose "' >> ~/.bashrc
3546
```
3647

48+
<!--
3749
## Proxy und Reverse Proxy
3850
3951
In den folgenden Kapiteln werden die sechs möglichen Kombinationen vorgestellt.
@@ -60,8 +72,8 @@ Maschine notwendig.
6072
6173
Zu einem späteren Zeitpunkt erhielten weitere Administratoren für eigene virtuelle Maschinen Zugriff auf diesen
6274
dedizierten Server. Da ich diesen den Zugriff auf den Reverse Proxy, welcher das Routing zu den virtuellen Maschinen
63-
verwehren wollte, verwendete ich zunächst nur auf IPv6 exposierte Web-Server in Verbindung mit Cloudflare Proxy, um
64-
die IPv4 Erreichbarkeit zu sichern und zusätzlich weitere Schutzmaßnahmen (z. B. Denial of Service Schutz) für diesen
75+
verwehren wollte, verwendete ich zunächst nur auf IPv6 exposierte Web-Server in Verbindung mit Cloudflare Proxy, um
76+
die IPv4 Erreichbarkeit zu sichern und zusätzlich weitere Schutzmaßnahmen (z. B. Denial of Service Schutz) für diesen
6577
dedizierten Server in Anspruch zu nehmen.
6678
6779
Spätestens seit Zensus
@@ -118,29 +130,29 @@ eingehängt ist.
118130
Die "Virtual-Host" Konfigurationsdateien liegen im Verzeichnis `/etc/nginx/sites-available/`
119131
unter der Domain, die Sie erreichbar machen.
120132
121-
TLS Zertifikate beziehe ich mithilfe des Shellskriptes [`acme.sh`](https://github.com/acmesh-official/acme.sh),
122-
welches ich unter dem root-Nutzer laufen lasse. Die resultierenden privaten Schlüssel
123-
und Zertifkate werden im Verzeichnis `/root/.acme.sh/` gespeichert und direkt von
133+
TLS Zertifikate beziehe ich mithilfe des Shellskriptes [`acme.sh`](https://github.com/acmesh-official/acme.sh),
134+
welches ich unter dem root-Nutzer laufen lasse. Die resultierenden privaten Schlüssel
135+
und Zertifkate werden im Verzeichnis `/root/.acme.sh/` gespeichert und direkt von
124136
dort in der nginx Virtual-Host Konfiguration eingebunden.
125137
126138
=== "Traefik"
127139
Da Traefik als Docker Container bereitgestellt wird, gilt die oben genannte Verzeichnisstruktur:
128140
129-
* Containerdefinition: `/home/admin/traefik/docker-compose.yml`
130-
* Env-Vars (hier DNS API Token): `/home/admin/traefik/.traefik.env`
131-
* Daten (z.B. TLS Zertifikate): `/srv/traefik`
141+
* Containerdefinition: `/home/admin/traefik/docker-compose.yml`
142+
* Env-Vars (hier DNS API Token): `/home/admin/traefik/.traefik.env`
143+
* Daten (z.B. TLS Zertifikate): `/srv/traefik`
132144
133-
Traefik verwendet als ACME Client [Lego](https://go-acme.github.io/lego/). Die Konfiguration dieses
145+
Traefik verwendet als ACME Client [Lego](https://go-acme.github.io/lego/). Die Konfiguration dieses
134146
kann der [Traefik Dokumentation](https://doc.traefik.io/traefik/https/acme/) entnommen werden.
135-
Die angeforderten Zertifikate und Privaten Schlüssel werden im `/srv/traefik` Volume des Traefik
147+
Die angeforderten Zertifikate und Privaten Schlüssel werden im `/srv/traefik` Volume des Traefik
136148
Containers gespeichert.
137149
138150
!!! note ""
139151
In komplexeren Server-Infrastrukturen kann es sinnvoll sein, jedem Virtual Host eine
140152
eigene dedizierte IPv6 Adresse zuzuweisen. Dies hat den großen Vorteil, dass man z. B.
141153
die Firewall Logs auf Layer 3 auswerten kann, statt den [TLS SNI Header](
142154
https://en.wikipedia.org/wiki/Server_Name_Indication) zu betrachten, um den beteiligten
143-
Webserver in Erfahrung zu bringen.
155+
Webserver in Erfahrung zu bringen.
144156
Da ich in diesen Netzwerken bisher immer auf nginx gesetzt habe,
145157
habe ich nie geprüft, ob Traefik dieses Feature (jedem HTTP Router
146158
eine eigene IPv6 Adresse zuzuweisen) ebenfalls unterstützt.
@@ -149,3 +161,4 @@ Prinzipiell ist die genutzte [ACME Challenge](https://letsencrypt.org/docs/chall
149161
auch interne Dienste betreibe, die nicht aus dem Internet erreichbar sind, verwende ich prinzipiell die ACME-DNS-01
150162
Challenge. Sowohl [Traefik / Lego](https://doc.traefik.io/traefik/https/acme/#providers) als auch
151163
[`acme.sh`](https://github.com/acmesh-official/acme.sh/wiki/dnsapi) unterstützten eine Vielzahl an DNS API's
164+
-->

0 commit comments

Comments
 (0)