Traefik GOST Proxy: sicherer HTTPS- und SOCKS5-Proxy

Wenn du einen traefik gost proxy einrichten möchtest, bekommst du mit Traefik v3 und GOST eine ziemlich praktische Kombination aus HTTPS-Proxy, SOCKS5-Proxy, automatischen Let’s-Encrypt-Zertifikaten und Benutzer-Authentifizierung. Traefik kümmert sich dabei um TLS, Zertifikate und SNI-Routing. GOST übernimmt den eigentlichen Proxy-Teil. Saubere Arbeitsteilung. 😀

In diesem Beitrag zeige ich dir, wie ich so einen sicheren Proxy aufgebaut habe. Die Domains und IP-Adressen sind bewusst anonymisiert. Du kannst das Setup also als Vorlage nehmen, musst aber natürlich deine eigenen Werte einsetzen. Und ja: Bei Proxy-Konfigurationen lohnt sich genaues Lesen. Ein fehlendes http/1.1 an der falschen Stelle kann einem sonst sehr kreativ den Nachmittag sortieren. Ich spreche aus Erfahrung.

🛠 Voraussetzungen

Bevor es losgeht, brauchst du natürlich eine funktionierende Docker-Umgebung.
Wenn du Docker noch nicht installiert hast, findest du hier eine Schritt-für-Schritt-Anleitung, wie du das auf Ubuntu mit einem Script erledigst:

Außerdem brauchst du für dieses Setup:

  • einen Linux-Server mit öffentlicher IPv4 und optional öffentlicher IPv6
  • eine Subdomain, zum Beispiel proxy.example.de
  • Traefik v3 mit funktionierendem Let’s-Encrypt-Resolver
  • Docker Compose
  • ein bisschen Ruhe beim Kopieren der YAML-Dateien

🧠 Traefik GOST Proxy Architektur

Das Setup besteht aus zwei Schichten. Außen nimmt Traefik die verschlüsselte Verbindung auf Port 443 entgegen. Innen leitet Traefik den entschlüsselten TCP-Stream an GOST weiter. GOST prüft dann Benutzername und Passwort und baut die Verbindung zur Zielseite auf.

Für den Client sieht das angenehm simpel aus: Du trägst in deinem Browser, in FoxyProxy, in curl oder in einem anderen Tool einen HTTPS-Proxy ein. Der Proxy selbst ist per Let’s Encrypt abgesichert. Die Zielseite bleibt zusätzlich Ende-zu-Ende per HTTPS verschlüsselt, wenn du eine HTTPS-Seite aufrufst.

Client
  -> TLS zu Traefik auf proxy.example.de:443
  -> HTTP CONNECT mit Basic Auth
  -> Traefik TCP-Router
  -> GOST auf 127.0.0.1:8080
  -> Ziel-Webseite im Internet

Zusätzlich kann GOST auf Port 1080 noch SOCKS5 bereitstellen. Das ist praktisch für Tools, die SOCKS5 sauber unterstützen, zum Beispiel curl, manche Apps oder bestimmte CLI-Workflows.

🌍 DNS vorbereiten

Zuerst braucht deine Subdomain passende DNS-Einträge. In meinem Beispiel sieht das anonymisiert so aus:

proxy.example.de  A     203.0.113.10
proxy.example.de  AAAA  2001:db8::10

Der A-Record zeigt auf deine IPv4-Adresse, der AAAA-Record auf deine IPv6-Adresse. Wenn dein Server keine öffentliche IPv6 hat, lässt du den AAAA-Record weg. Dann hast du eben einen IPv4-Proxy. Auch okay.

🚦 Traefik für den HTTPS-Proxy konfigurieren

Traefik arbeitet hier nicht als normaler HTTP-Reverse-Proxy mit Docker-Labels, sondern als TCP-Router. Das ist wichtig, weil wir einen HTTPS-Proxy mit CONNECT sauber durchreichen möchten.

TLS-Option für ALPN

Ein kleiner, aber wichtiger Punkt ist ALPN. Einige Clients, besonders Firefox, handeln bei HTTPS-Verbindungen gerne HTTP/2 aus. Für klassische Proxy-CONNECT-Verbindungen ist http/1.1 aber die deutlich stressfreiere Wahl. Deshalb lege ich eine eigene TLS-Option an.

tls:
  options:
    proxy-tls:
      alpnProtocols:
        - http/1.1

Diese Datei liegt zum Beispiel unter /home/docker-projekte/traefik/dynamic/proxy-tls.yml. Wenn dein Traefik die dynamische File-Konfiguration bereits eingebunden hat, lädt er diese Änderung automatisch nach.

TCP-Router für GOST

Danach kommt der TCP-Router. Er lauscht auf dem HTTPS-EntryPoint, filtert per SNI auf deine Proxy-Domain und leitet an GOST auf dem Host weiter.

tcp:
  routers:
    gost-secure:
      entryPoints:
        - websecure
      rule: "HostSNI(`proxy.example.de`)"
      tls:
        certResolver: letsencrypt
        options: proxy-tls@file
      service: gost-service

  services:
    gost-service:
      loadBalancer:
        servers:
          - address: "127.0.0.1:8080"

In meinem Setup läuft Traefik ebenfalls im Host-Netzwerk. Dadurch ist 127.0.0.1:8080 hier wirklich der Host und nicht nur der Traefik-Container selbst. Falls dein Traefik in einem normalen Bridge-Netzwerk läuft, musst du diesen Teil entsprechend anpassen.

🐳 GOST in Docker starten

GOST ist der Teil, der die eigentliche Proxy-Arbeit macht. Ich lege dafür ein eigenes Projektverzeichnis an und verwalte die Benutzer in einer einfachen Secret-Datei.

mkdir -p /home/docker-projekte/gost-proxy
cd /home/docker-projekte/gost-proxy

Benutzerdatei anlegen

Die Datei secrets.txt enthält pro Zeile einen Benutzer und ein Passwort. Keine echten Daten in Tutorials packen, bitte. Das Internet vergisst zuverlässig in den falschen Momenten.

patrick sehr-langes-passwort-1
notebook sehr-langes-passwort-2
handy sehr-langes-passwort-3

Danach schränkst du die Rechte ein:

chmod 600 secrets.txt

Aufruf eigener Dienste kontrollieren

Ein Punkt ist bei diesem Setup besonders wichtig: GOST läuft mit network_mode: host. Das ist für Dual Stack praktisch, bedeutet aber auch, dass der Proxy grundsätzlich sehr nah am Host-Netzwerk sitzt. Ohne zusätzliche Kontrolle könnten angemeldete Proxy-Clients also versuchen, interne Ziele wie 127.0.0.1, private Netze oder eigene Dienste auf dem Server aufzurufen.

Genau deshalb nutze ich eine bypass.txt als Sperrliste. Damit legst du bewusst fest, welche Ziele über den Proxy nicht erreichbar sein sollen. Das schützt zum Beispiel lokale Admin-Oberflächen, Docker-Netze, VPN-Bereiche und Homelab-Adressen. Kurz gesagt: Der Proxy soll ins Internet, aber nicht heimlich durch die Kellertür in deine internen Dienste spazieren.

# Sperrt Zugriff auf Localhost, VPNs, Homelab und interne IP-Bereiche
127.0.0.0/8
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
169.254.0.0/16
::1/128
fc00::/7
fe80::/10
localhost
*.local
*.internal
*.lan

Auch diese Datei sollte nicht für jeden lesbar sein:

chmod 600 bypass.txt

Wenn du eigene Dienste auf dem Server absichtlich über den Proxy erreichbar machen möchtest, musst du diese Liste entsprechend anpassen. Das würde ich aber nicht nebenbei machen. Überlege dir vorher genau, welche Ziele erreichbar sein sollen und ob dafür nicht ein eigener interner Zugang, ein VPN oder ein separater Reverse-Proxy-Eintrag sinnvoller ist.

Docker Compose für GOST

Das Compose-File startet einen HTTP-Proxy auf 127.0.0.1:8080 und einen SOCKS5-Proxy auf :1080. Der HTTP-Proxy ist nur lokal erreichbar, weil Traefik ihn davor per TLS veröffentlicht. Zusätzlich wird die bypass.txt eingebunden, damit interne Ziele kontrolliert gesperrt werden. SOCKS5 kannst du optional direkt freigeben, wenn du das wirklich brauchst.

---
name: gost-proxy

services:
  gost:
    image: ginuerzh/gost:2.11.5
    container_name: gost-proxy
    hostname: gost-proxy
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    network_mode: host
    command:
      - "-L"
      - "http://127.0.0.1:8080?secrets=/etc/gost/secrets.txt&bypass=/etc/gost/bypass.txt"
      - "-L"
      - "socks5://:1080?secrets=/etc/gost/secrets.txt&bypass=/etc/gost/bypass.txt"
    volumes:
      - ./secrets.txt:/etc/gost/secrets.txt:ro
      - ./bypass.txt:/etc/gost/bypass.txt:ro

Jetzt startest du den Container:

docker compose up -d
docker compose ps
docker logs -f gost-proxy

Wichtig: Normalerweise vergebe ich Docker-Containern gerne feste IP-Adressen in einem eigenen Bridge-Netzwerk. Bei diesem speziellen Setup ist network_mode: host aber Absicht. GOST soll direkt die Netzwerkstacks des Hosts nutzen, damit IPv4 und IPv6 beim ausgehenden Proxy-Verkehr sauber funktionieren. Eine feste Container-IP wäre hier hübscher fürs Auge, aber technisch der falsche Hebel.

🔥 Firewall nicht vergessen

Port 443 ist in der Regel ohnehin für Traefik offen. Wenn du SOCKS5 direkt über Port 1080 erreichbar machen möchtest, musst du diesen Port zusätzlich freigeben.

sudo ufw allow 1080/tcp comment "GOST SOCKS5 Proxy"

Ob du SOCKS5 öffentlich anbieten möchtest, ist eine eigene Entscheidung. Für Browser reicht häufig der HTTPS-Proxy über Traefik. Weniger offene Ports sind selten eine schlechte Idee.

👥 Benutzer verwalten

Neue Benutzer legst du einfach in der secrets.txt an. Danach startest du GOST einmal neu, damit die Datei neu geladen wird.

nano /home/docker-projekte/gost-proxy/secrets.txt
cd /home/docker-projekte/gost-proxy
docker compose restart

Ich würde pro Gerät oder Einsatzzweck eigene Zugangsdaten verwenden. Wenn ein Passwort später irgendwo landet, wo es nicht hingehört, musst du nicht direkt alles austauschen.

📱 Clients einrichten

Im Browser nutze ich dafür gerne FoxyProxy oder ein ähnliches Add-on. Dort legst du einen neuen Proxy an:

  • Proxy-Typ: HTTPS
  • Server: proxy.example.de
  • Port: 443
  • Benutzername und Passwort aus deiner secrets.txt

Für curl sieht der Test so aus:

curl -x https://patrick:passwort@proxy.example.de:443 https://icanhazip.com

Und für SOCKS5:

curl --socks5-hostname patrick:passwort@proxy.example.de:1080 https://icanhazip.com

Wenn alles passt, bekommst du die öffentliche IP-Adresse deines Proxy-Servers zurück. Bei Dual Stack kann das auch die IPv6-Adresse sein.

✅ Proxy testen und prüfen

Ich habe das Setup auf dem Server gegengeprüft. Anonymisiert sah der Test so aus:

curl -x https://patrick:passwort@proxy.example.de:443 https://icanhazip.com
curl --socks5-hostname patrick:passwort@proxy.example.de:1080 https://icanhazip.com

Die Ausgabe war in beiden Fällen die gleiche Proxy-Adresse:

2001:db8::10
2001:db8::10

Auch ALPN kannst du prüfen. Damit siehst du direkt, ob Traefik wirklich http/1.1 aushandelt.

echo | openssl s_client -connect proxy.example.de:443 -servername proxy.example.de -alpn h2,http/1.1

Der interessante Teil der Ausgabe:

ALPN protocol: http/1.1
Protocol  : TLSv1.3

Damit ist klar: Die äußere Verbindung läuft verschlüsselt über TLS und der Proxy spricht auf der Verbindung HTTP/1.1. Genau das wollen wir.

Zum Schluss prüfe ich noch, ob interne Ziele wirklich geblockt werden. Ein Aufruf auf 127.0.0.1 über den Proxy sollte nicht einfach durchgehen.

curl -sS --max-time 10 -o /dev/null -w "http_code=%{http_code}\n" -x https://patrick:passwort@proxy.example.de:443 http://127.0.0.1:80

In meinem Test kam hier 403 zurück. Genau richtig. Der Proxy funktioniert nach draußen, macht aber nicht nebenbei interne Dienste erreichbar.

🧯 Troubleshooting

Firefox zeigt einen Netzwerkprotokoll-Fehler

Dann prüfe zuerst die ALPN-Konfiguration. Wenn Firefox HTTP/2 mit Traefik aushandelt, kann der klassische Proxy-CONNECT-Workflow unschön scheitern. Die TLS-Option mit alpnProtocols: ["http/1.1"] ist hier der entscheidende Punkt.

Du bekommst 407 Proxy Authentication Required

Dann erreicht dein Client GOST, aber die Anmeldung schlägt fehl. Prüfe Benutzername, Passwort und die secrets.txt. Nach Änderungen an der Datei solltest du GOST neu starten.

cd /home/docker-projekte/gost-proxy
docker compose restart

IPv6 kommt nicht raus

Prüfe zuerst, ob der Host selbst IPv6 ins Internet sprechen kann. Wenn der Host keine funktionierende IPv6-Route hat, kann GOST das nicht wegzaubern. Technik kann viel, aber Routing bleibt Routing.

curl -6 https://icanhazip.com
ip -6 route

Traefik erreicht GOST nicht

Wenn Traefik im Host-Netzwerk läuft, passt 127.0.0.1:8080. Wenn Traefik dagegen in einem Bridge-Netzwerk läuft, ist 127.0.0.1 der Traefik-Container selbst. Dann brauchst du entweder eine andere Zieladresse oder eine andere Netzwerkarchitektur.

🔐 Ein paar Sicherheitsgedanken

So ein Proxy ist praktisch, aber er ist kein Spielzeug. Verwende lange Passwörter, gib nur die Ports frei, die du wirklich brauchst, und beobachte regelmäßig die Logs. Ein öffentlicher Proxy ohne Authentifizierung ist keine Abkürzung, sondern eine Einladung zum Ärger.

Außerdem solltest du verstehen, was dieses Setup kann und was nicht. Die Verbindung von deinem Client zu Traefik ist verschlüsselt. Die Verbindung zur Zielseite ist bei HTTPS ebenfalls verschlüsselt. Trotzdem ersetzt das keinen Anonymitätsdienst und keine saubere Sicherheitsstrategie. Es ist ein eigener Proxy für kontrollierte Einsatzzwecke, nicht der Tarnumhang fürs ganze Internet.

🏁 Fazit

Mit Traefik v3 und GOST bekommst du einen schlanken HTTPS- und SOCKS5-Proxy, der sich sauber in eine bestehende Docker-Umgebung einfügt. Traefik übernimmt Zertifikate und TLS, GOST kümmert sich um Proxy und Benutzer. Besonders angenehm finde ich, dass die Konfiguration überschaubar bleibt und man trotzdem mehrere Benutzer sauber trennen kann.

Der wichtigste Stolperstein ist die ALPN-Geschichte mit http/1.1. Danach sind es vor allem die üblichen Themen: DNS, Firewall, Secrets, Logs. Also nichts Magisches. Nur Serverarbeit mit etwas weniger Kopfschmerz, und das nehme ich jederzeit.

👥 Techniverse Community

Lust auf Austausch rund um Matrix, Selfhosting und andere smarte IT-Lösungen?
In der Techniverse Community triffst du Gleichgesinnte, kannst Fragen stellen oder einfach nerdigen Talk genießen. 🚀

👉 Jetzt der Gruppe auf Matrix beitreten
~ Direkte Raumadresse: #community:techniverse.net

👉 Für lockere Gespräche abseits der Kernthemen komm in den Talkraum
~ Direkte Raumadresse: #talk:techniverse.net

Wir freuen uns, wenn du dabei bist!

Vielen Dank fürs Teilen!