Was ist die beste Vorgehensweise für Docker + UFW unter Ubuntu?


75

Ich habe gerade Docker ausprobiert. Es ist großartig, scheint aber mit ufw nicht gut zu funktionieren. Standardmäßig manipuliert Docker die iptables ein wenig. Das Ergebnis ist kein Fehler, aber nicht das, was ich erwartet hatte. Weitere Informationen finden Sie unter Die Gefahren von UFW + Docker

Mein Ziel ist es, ein System wie dieses einzurichten

    Host (running ufw) -> docker container 1 - nginx (as a reverse proxy)
                       -> docker container 2 - node web 1
                       -> docker container 3 - node web 2
                       -> .......

Ich möchte den eingehenden Datenverkehr (z. B. den Zugriff einschränken) über ufw verwalten, daher möchte ich nicht, dass Docker meine iptables berührt. Hier ist mein Test

Umgebung:

  • ein neu installiertes Ubuntu 14.04 (Kernel: 3.13.0-53)
  • Docker 1.6.2
  • Die UWW-Weiterleitung ist aktiviert. ( UFW-Weiterleitung aktivieren )
  • --iptables=false wurde dem Docker-Daemon hinzugefügt.

Erster Versuch

docker run --name ghost -v /home/xxxx/ghost_content:/var/lib/ghost -d ghost
docker run --name nginx -p 80:80 -v /home/xxxx/nginx_site_enable:/etc/nginx/conf.d:ro --link ghost:ghost -d nginx

Kein Glück. Der erste Befehl ist in Ordnung, aber der zweite Befehl gibt einen Fehler aus

Error response from daemon: Cannot start container

Zweiter Versuch

Dann fand ich Folgendes : Container können nicht mit --iptables = false # 12701 verknüpft werden

Nach dem Ausführen des folgenden Befehls sieht alles in Ordnung aus.

sudo iptables -N DOCKER

Ich habe jedoch festgestellt, dass ich keine ausgehenden Verbindungen innerhalb von Containern herstellen kann. Zum Beispiel:

xxxxg@ubuntu:~$ sudo docker exec -t -i nginx /bin/bash
root@b0d33f22d3f4:/# ping 74.125.21.147
PING 74.125.21.147 (74.125.21.147): 56 data bytes
^C--- 74.125.21.147 ping statistics ---
35 packets transmitted, 0 packets received, 100% packet loss
root@b0d33f22d3f4:/# 

Wenn ich --iptables=falsevom Docker-Daemon entferne , ist die Internetverbindung von Containern wieder normal, aber das UFW funktioniert nicht "richtig" (naja ... meiner Definition nach).

Was ist die beste Vorgehensweise für Docker + UFW? Kann mir jemand helfen?

Vielen Dank.

Bart.


iptables -N DOCKERStartet eine neue Kette mit diesem Namen ... Vielleicht können Sie die iptables aktiviert lassen (ich meine, ohne sie zu entfernen, --iptables=falseund dann können Sie einen "Post-Befehl" für den Kettenstart ausführen. Ich habe keine Antwort darauf, was die beste Vorgehensweise ist o_O
OscarAkaElvis

Antworten:


76

Ich hatte ein solches Problem wie vor Monaten und habe mich kürzlich entschlossen, das Problem zusammen mit der Lösung in meinem Blog zu beschreiben. Hier ist die Verknüpfung.

Die Verwendung --iptables=falsehilft Ihnen bei dem von Ihnen beschriebenen Fall nicht viel. Hier reicht es einfach nicht. Standardmäßig kann keiner Ihrer Container eine ausgehende Verbindung herstellen.

Es gibt einen kleinen Schritt, den Sie auf Ihrem Weg zu Containern hinter UFW hier weglassen. Sie können Dateien mit Inhalten wie folgt verwenden --iptables=falseoder erstellen/etc/docker/daemon.json

{
  "iptables": false
}

Das Ergebnis ist das gleiche, aber für die letztere Option müssen Sie den gesamten Docker-Dienst neu starten service docker restartoder sogar einen Neustart durchführen, wenn Docker die Möglichkeit hatte, iptables-Regeln hinzuzufügen, bevor Sie diese Funktion deaktiviert haben.

Wenn es fertig ist, machen Sie einfach zwei weitere Dinge:

$ sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
$ ufw reload

Daher richten Sie in UFW die Standardweiterleitungsrichtlinie für die Annahme und Verwendung ein:

$ iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Auf diese Weise erreichen Sie das unübersichtliche Verhalten von Docker in Ihren iptables-Regeln und gleichzeitig wird Docker mit dem erforderlichen Routing ausgestattet, damit Container ausgehende Verbindungen problemlos ausführen können. Die UFW-Regeln werden jedoch ab diesem Zeitpunkt weiterhin eingeschränkt.

Ich hoffe, dies löst das Problem für Sie und alle, die hier auf der Suche nach einer Antwort sind.

Ich habe das Problem und die Lösung unter https://www.mkubaczyk.com/2017/09/05/force-docker-not-bypass-ufw-rules-ubuntu-16-04/ ausführlicher beschrieben.


1
Ich habe einige Informationen zum Einrichten der iptables-Regel in der tatsächlichen Docker-Netzwerkkonfiguration hinzugefügt. Dies könnte für Sie von Interesse sein.
Funky-Future

1
Sie sind der echte MVP

Das funktioniert gut! Die nat iptables-Regel scheint jedoch beim Neustart gelöscht zu werden. Wie kann ich es durchhalten?
Thomas Ebert

3
Um die iptables-Regel beizubehalten, installieren Sie das Linux-Paket iptables-persistent gemäß Ihrer Server-Distribution. In meinem Fall (Debian) ist sudo apt install iptables-persistent und die Paketinstallation fügt die NAT-Regel einer persistenten Datei hinzu, die beim Booten ausgeführt wird.
Afboteros

1
Danke, @afboteros, hätte das wissen müssen ... Es gibt einen Grund, warum ich doch eine unkomplizierte Firewall benutze ;-)
Thomas Ebert

104

Problem

Dieses Problem gibt es schon lange.

Das Deaktivieren von iptables in Docker führt zu anderen Problemen.

Rollback ändert sich zuerst

Wenn Sie Ihren Server gemäß der aktuellen Lösung im Internet geändert haben, setzen Sie diese Änderungen zuerst zurück, einschließlich:

  • Aktivieren Sie die iptables-Funktion von Docker. Entfernen Sie alle Änderungen wie --iptables=false, einschließlich der Konfigurationsdatei /etc/docker/daemon.json.
  • Die Standard-FORWARD-Regel von UFW wird DROPanstelle von auf die Standardregel zurückgesetzt ACCEPT.
  • Entfernen Sie die Regeln für das Docker-Netzwerk in der UFW-Konfigurationsdatei /etc/ufw/after.rules.
  • Wenn Sie Docker-Konfigurationsdateien geändert haben, starten Sie Docker zuerst neu. Wir werden die UFW-Konfiguration später ändern und können sie dann neu starten.

Lösen von UFW- und Docker-Problemen

Diese Lösung muss nur eine UFW-Konfigurationsdatei ändern. Alle Docker-Konfigurationen und -Optionen bleiben die Standardeinstellungen. Muss die Docker-Iptables-Funktion nicht deaktivieren.

Ändern Sie die UFW-Konfigurationsdatei /etc/ufw/after.rulesund fügen Sie am Ende der Datei die folgenden Regeln hinzu:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN
COMMIT
# END UFW AND DOCKER

Verwenden Sie den Befehl sudo systemctl restart ufw, um UFW nach dem Ändern der Datei neu zu starten. Jetzt kann das öffentliche Netzwerk nicht auf veröffentlichte Docker-Ports zugreifen, der Container und das private Netzwerk können sich regelmäßig besuchen, und die Container können auch von innen auf das externe Netzwerk zugreifen.

Wenn Sie öffentlichen Netzwerken beispielsweise den Zugriff auf die vom Docker-Container bereitgestellten Dienste ermöglichen möchten, lautet der Service-Port eines Containers 80. Führen Sie den folgenden Befehl aus, damit die öffentlichen Netzwerke auf diesen Dienst zugreifen können:

ufw route allow proto tcp from any to any port 80

Mit diesem Befehl kann das öffentliche Netzwerk auf alle veröffentlichten Ports zugreifen, deren Container-Port 80 ist.

Hinweis: Wenn wir einen Port mithilfe der Option veröffentlichen -p 8080:80, sollten wir den Container-Port 80und nicht den Host-Port verwenden 8080.

Wenn es mehrere Container mit einem Service-Port von 80 gibt, wir jedoch nur möchten, dass das externe Netzwerk auf einen bestimmten Container zugreift. Wenn die private Adresse des Containers beispielsweise 172.17.0.2 lautet, verwenden Sie den folgenden Befehl:

ufw route allow proto tcp from any to 172.17.0.2 port 80

Wenn das Netzwerkprotokoll UDP ist, z. B. ein DNS-Dienst, können Sie den folgenden Befehl verwenden, um dem externen Netzwerk den Zugriff auf alle veröffentlichten DNS-Dienste zu ermöglichen:

ufw route allow proto udp from any to any port 53

Wenn auch nur für einen bestimmten Container, z. B. die IP-Adresse 172.17.0.2:

ufw route allow proto udp from any to 172.17.0.2 port 53

Wie es funktioniert?

Die folgenden Regeln ermöglichen es den privaten Netzwerken, sich gegenseitig zu besuchen. In der Regel sind private Netzwerke vertrauenswürdiger als öffentliche Netzwerke.

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

Mit den folgenden Regeln kann UFW verwalten, ob die öffentlichen Netzwerke die vom Docker-Container bereitgestellten Dienste besuchen dürfen. Damit können wir alle Firewall-Regeln an einem Ort verwalten.

-A DOCKER-USER -j ufw-user-forward

Die folgenden Regeln blockieren Verbindungsanforderungen, die von allen öffentlichen Netzwerken initiiert wurden, ermöglichen jedoch internen Netzwerken den Zugriff auf externe Netzwerke. Beim TCP-Protokoll wird verhindert, dass aktiv eine TCP-Verbindung aus öffentlichen Netzwerken hergestellt wird. Beim UDP-Protokoll werden alle Zugriffe auf Ports, die kleiner als 32767 sind, blockiert. Warum ist dieser Hafen? Da das UDP-Protokoll zustandslos ist, ist es nicht möglich, das Handshake-Signal, das die Verbindungsanforderung initiiert, wie TCP zu blockieren. Für GNU / Linux finden wir den lokalen Portbereich in der Datei/proc/sys/net/ipv4/ip_local_port_range . Der Standardbereich ist32768 60999. Wenn Sie von einem laufenden Container aus auf einen UDP-Protokolldienst zugreifen, wird der lokale Port zufällig aus dem Portbereich ausgewählt, und der Server gibt die Daten an diesen zufälligen Port zurück. Daher können wir davon ausgehen, dass der Überwachungsport des UDP-Protokolls in allen Containern kleiner als 32768 ist. Aus diesem Grund möchten wir nicht, dass öffentliche Netzwerke auf die UDP-Ports zugreifen, die kleiner als 32768 sind.

-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

Mehr

https://github.com/chaifeng/ufw-docker

sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
chmod +x /usr/local/bin/ufw-docker

Verwendung

ufw-docker help
ufw-docker install
ufw-docker status
ufw-docker allow webapp
ufw-docker allow webapp 80
ufw-docker allow webapp 53/udp
ufw-docker list webapp
ufw-docker delete allow webapp 80/tcp
ufw-docker delete allow webapp

Update: 2018-09-10

Der Grund für die Wahl ufw-user-forward, nichtufw-user-input

mit ufw-user-input

Profi:

Einfach zu bedienen und zu verstehen, unterstützt ältere Versionen von Ubuntu.

8080Verwenden Sie beispielsweise den folgenden Befehl , damit die Öffentlichkeit einen veröffentlichten Port besuchen kann, dessen Container-Port ist :

ufw allow 8080

Con:

Es werden nicht nur Ports von Containern verfügbar gemacht, sondern auch Ports des Hosts.

Zum Beispiel, wenn ein Dienst auf dem Host ausgeführt wird und der Port ist 8080. Mit dem Befehl ufw allow 8080kann das öffentliche Netzwerk den Dienst und alle veröffentlichten Ports besuchen, deren Container-Port ist 8080. Wir möchten jedoch nur den auf dem Host ausgeführten Dienst oder nur den in Containern ausgeführten Dienst verfügbar machen, nicht die beiden.

Um dieses Problem zu vermeiden, müssen wir möglicherweise für alle Container einen Befehl ähnlich dem folgenden verwenden:

ufw allow proto tcp from any to 172.16.0.3 port 8080

mit ufw-user-forward

Profi:

Es können keine Dienste verfügbar gemacht werden, die gleichzeitig mit demselben Befehl auf Hosts und Containern ausgeführt werden.

Wenn Sie beispielsweise den Port 8080von Containern veröffentlichen möchten , verwenden Sie den folgenden Befehl:

ufw route allow 8080

Das öffentliche Netzwerk kann auf alle veröffentlichten Ports zugreifen, deren Container-Ports sind 8080.

Auf den Port 8080des Hosts kann das öffentliche Netzwerk jedoch immer noch nicht zugreifen. Wenn Sie dies möchten, führen Sie den folgenden Befehl aus, damit die Öffentlichkeit separat auf den Port auf dem Host zugreifen kann:

ufw allow 8080

Con:

Unterstützt ältere Versionen von Ubuntu nicht und der Befehl ist etwas komplizierter. Sie können jedoch mein Skript https://github.com/chaifeng/ufw-docker verwenden .

Fazit

Wenn wir eine ältere Version von Ubuntu verwenden, können wir ufw-user-inputchain verwenden. Vermeiden Sie jedoch die Offenlegung von Diensten, die nicht verfügbar gemacht werden sollten.

Wenn wir eine neuere Version von Ubuntu verwenden, bei der es sich um einen ufw routeUnterbefehl handelt, verwenden wir besser die ufw-user-forwardKette und den ufw routeBefehl, um die Firewallregeln für Container zu verwalten.


Update: 6. Oktober 2018

Das Skript ufw-docker unterstützt jetzt Docker Swarm. Weitere Informationen finden Sie im neuesten Code unter https://github.com/chaifeng/ufw-docker

Für den Docker Swarm-Modus installieren

Wir können dieses Skript nur auf Manager-Knoten verwenden, um Firewall-Regeln im Swarm-Modus zu verwalten.

  • Ändern aller after.rulesDateien auf allen Knoten, einschließlich Managern und Mitarbeitern
  • Bereitstellen dieses Skripts auf Manager-Knoten

Dieses Skript wird im Docker Swarm-Modus ausgeführt und fügt einen globalen Dienst hinzu ufw-docker-agent. Aus diesem Projekt wird auch automatisch das Bild chaifeng / ufw-docker-agent erstellt .


2
Perfekt! Dachte , ich hatte zu ersetzen 172.16.0.0mit172.17.0.0
OverCoder

2
@Feng Deine Lösung sieht interessant aus. Es gibt einen anderen etwas einfacher Vorschlag hier . Ich hatte noch keine Zeit, die Unterschiede zu analysieren, aber vielleicht können Sie das kommentieren? Noch etwas: Ich denke, Sie könnten "interner Port" in "Host-Port" umbenennen. Ich war verwirrt, was "interner Port" bedeutet. Im Docker-Handbuch ist es immer entweder Host- oder Container-Port, was ich klarer finde.
Michael Härtl

1
@ MichaelHärtl Ich habe den Grund am Ende meiner Antwort hinzugefügt. Bitte lassen Sie mich wissen, wenn eine unklare Beschreibung vorliegt. Vielen Dank!
Feng

1
Ich habe ein Problem in Ihrem Github-Repo eingereicht, das dort leichter zu lösen ist: github.com/chaifeng/ufw-docker/issues/11
Laurent

1
Ich verstehe nicht, warum dies nicht als die beste Antwort gekennzeichnet ist ... Ich habe einen ganzen Tag mit der ersten Lösung verloren, bis ich diese gefunden habe.
Thomas

13

Ich habe zwei Stunden damit verbracht, die obigen Vorschläge und andere Beiträge auszuprobieren. Die einzige Lösung, die funktionierte, war von Tsunas Post in diesem Github-Thread :

/etc/ufw/after.rulesFügen Sie am Ende Folgendes hinzu (ersetzen Sie eth0 durch Ihre nach außen gerichtete Schnittstelle):

# Put Docker behind UFW
*filter
:DOCKER-USER - [0:0]
:ufw-user-input - [0:0]

-A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -m conntrack --ctstate INVALID -j DROP
-A DOCKER-USER -i eth0 -j ufw-user-input
-A DOCKER-USER -i eth0 -j DROP
COMMIT

Und machen Sie alles rückgängig:

  • Entfernen Sie "iptables": "false" aus /etc/docker/daemon.json
  • Zurück zu DEFAULT_FORWARD_POLICY = "DROP" in / etc / default / ufw
  • Entfernen Sie alle Docker-bezogenen Änderungen an /etc/ufw/before.rules
  • Stellen Sie sicher, dass nach einem Neustart alles in Ordnung ist. Ich glaube immer noch, dass das Out-of-the-Box-Verhalten von Docker gefährlich ist und dass viele weitere Personen weiterhin unbeabsichtigt interne Dienste der Außenwelt aussetzen werden, da Docker Löcher in ansonsten sichere iptables-Konfigurationen stanzt.

10

Hier nicht zu sagen, dass Lösungen falsch sind, aber sie sehen ein bisschen "furchterregend" und fehleranfällig für jemanden aus, der nach einer schnellen Ein-Schritt-Anleitung sucht . Ich bin auch kürzlich mit diesem Problem gekommen, habe alle ähnlichen Antworten online gelesen und zum Zeitpunkt des Schreibens nichts schnelles und klares gefunden. Überraschenderweise ist meine alternative Lösung leicht zu verstehen und zu verwalten und funktioniert: Implementieren Sie einfach Ihre Firewall außerhalb Ihres Host-Computers .

Die Behandlung der Firewall als erstklassiger Bürger scheint viele Vorteile zu haben.


1
Du hast mich gerade gerettet!
disfated

1

Ich mag den für die iptables erforderlichen Betriebsaufwand nicht: false flag im Docker-Daemon. Nach allem, was ich sehe, und bitte korrigieren Sie mich, wenn ich falsch liege, sind alle Lösungen viel zu komplizierte Hacks.

Fügen Sie dies einfach in /etc/ufw/after.rules vor dem * Filterabschnitt ein:

*mangle
# Allow a whitelisted ip to access postgres port
-I PREROUTING 1 -s <whitelisted_ip> -p tcp --dport 5432 -j ACCEPT
# Allow everyone to access port 8080
-I PREROUTING 2 -p tcp --dport 8080 -j ACCEPT
# Drop everything else
-I PREROUTING 3 -p tcp -j DROP
COMMIT

Es besteht keine Notwendigkeit, sich mit Docker-Netzwerken oder unnötigen Hacks herumzuschlagen.


0

Sie sind sich nicht ganz sicher, was Sie fragen, aber nach allem, was ich sammeln kann, möchten Sie besser kontrollieren, wer auf Ihre Apps zugreifen kann, die in Docker ausgeführt werden? Ich habe hier eine ähnliche Frage beantwortet, um den Datenverkehr über einen Front-End-Proxy anstatt mit IP-Tabellen zu steuern. Blockieren Sie den externen Zugriff auf Docker-Container

Hoffe das hilft

Dylan

Bearbeiten

Mit dem obigen Ansatz können Sie dann UFW verwenden, um nur eingehende Verbindungen zu Port 80 (dh dem Proxy) zuzulassen. Dies reduziert die Port-Exposition auf ein Minimum und bietet den zusätzlichen Bonus, dass Sie den Datenverkehr über eine Proxy-Konfiguration und DNS steuern können


0

Für das, was es wert ist, hier ein Nachtrag zu @ mkubaczyks Antwort für den Fall, dass mehr Brückennetzwerke am gesamten Setup beteiligt sind. Diese können von Docker-Compose-Projekten bereitgestellt werden. So können die richtigen Regeln generiert werden, sofern diese Projekte von gesteuert werden systemd.

/etc/systemd/system/compose-project@.service

[Unit]
Description=Docker-Compose project: %I
After=docker.service
BindsTo=docker.service
AssertPathIsDirectory=/<projects_path>/%I
AssertFileNotEmpty=/<projects_path>/%I/docker-compose.yml

[Service]
Type=simple
Restart=always
WorkingDirectory=/<projects_path>/%I
ExecStartPre=/usr/bin/docker-compose up --no-start --remove-orphans
ExecStartPre=+/usr/local/bin/update-iptables-for-docker-bridges
ExecStart=/usr/bin/docker-compose up
ExecStop=/usr/bin/docker-compose stop --timeout 30
TimeoutStopSec=30
User=<…>
StandardOutput=null

[Install]
WantedBy=multi-user.target

/usr/local/bin/update-iptables-for-docker-bridges

#!/bin/sh

for network in $(docker network ls --filter 'driver=bridge' --quiet); do
  iface=$(docker network inspect --format '{{index .Options "com.docker.network.bridge.name"}}' ${network})
  [ -z $iface ] && iface="br-${network}"
  subnet=$(docker network inspect --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}' ${network})
  rule="! --out-interface ${iface} --source ${subnet} --jump MASQUERADE"
  iptables --table nat --check POSTROUTING ${rule} || iptables --table nat --append POSTROUTING ${rule}
done

Offensichtlich wird dies nicht so gut skaliert.

Es ist auch bemerkenswert, dass das gesamte Grundkonzept die Quelle jeder Verbindung für die in einem Container ausgeführten Anwendungen verschleiert.


0

Ich habe gerade ein kleines Skript erstellt, das das Problem mit der ufw-Firewall und den Docker-Iptables löst. Sie können einen Blick auf Repo nehmen hier . Es basiert stark auf den UFW- Regeln von Chaifeng / Ufw-Docker , automatisiert jedoch den manuellen Prozess. Sie müssen lediglich den Container mit einem speziellen Etikett ausführen UFW_MANAGED=TRUE. Bitte teilen Sie mir Ihre Rückmeldungen mit. Natürlich ist Code Mist, aber hoffentlich funktioniert es.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.