
goproxy v1.9.1
Eine anpassbare HTTP/HTTPS-Proxy-Bibliothek für Go mit Unterstützung für reguläres Forwarding, CONNECT-Tunneling, MITM-TLS-Interception und programmatische Anfrage-/Antwort-Modifikation.
GoProxy
GoProxy ist eine Bibliothek zur Erstellung eines angepassten HTTP/HTTPS-Proxy-Servers mit Go (auch Golang genannt) und mehreren konfigurierbaren Einstellungen.
Das Ziel dieses Projekts ist es, einen optimierten Proxy-Server anzubieten, der bei einer angemessenen Menge an Datenverkehr nutzbar ist und dennoch anpassbar und programmierbar bleibt.
Der Proxy selbst ist einfach ein net/http-Handler, sodass du mehrere Middlewares (Panic-Recovery, Logging, Komprimierung usw.) darüber hinzufügen kannst. Er lässt sich problemlos in jede andere HTTP-Netzwerkbibliothek integrieren.
Um goproxy zu verwenden, sollte man den Browser (oder einen anderen Client) so einstellen, dass goproxy als HTTP-Proxy verwendet wird.
So machst du das in Chrome und in Firefox.
Wenn du mit dem base-Beispiel beginnen möchtest, ist die URL, die du als Proxy verwenden solltest, localhost:8080, die Standard-URL in unserem Beispiel.
Du musst außerdem das Zertifikat der Proxy-CA vertrauen, um Zertifikatsprobleme bei den Clients zu vermeiden.
Funktionen
- Bestimmte Aktionen nur für
bestimmte Hostsausführen, mit einem einfachen Gleichheitsvergleich oder mit Regex-Auswertung RequestsundResponsesmanipulieren, bevor sie an den Browser gesendet werden- Einen
benutzerdefinierten http.Transportverwenden, um Requests an den Zielserver zu senden - Einen
MITM-Zertifikats-Cacheangeben, um sie später für andere Requests an denselben Host wiederzuverwenden und so CPU zu sparen. Standardmäßig nicht aktiviert, aber du solltest ihn in der Produktion verwenden! - Normalen HTTP-Datenverkehr an einen
benutzerdefinierten Handlerumleiten, wenn das Ziel einrelativer Pfadist (z. B./ping) - Den zu verwendenden Logger wählen, indem du das
Logger-Interface implementierst - Die
Kanonisierungder HTTP-Request-Headerdeaktivieren, indem duPreventCanonicalizationauf true setzt
Proxy-Modi
- Regulärer HTTP-Proxy
- HTTPS über CONNECT
- HTTPS-MITM-Proxy-Server („Man in the Middle"), bei dem der Server TLS-Zertifikate generiert, um Request-/Response-Daten zu analysieren und Aktionen auf ihnen auszuführen
- „Gekaperte" Proxy-Verbindung, bei der der konfigurierte Handler auf die rohen net.Conn-Daten zugreifen kann
Sponsoren
Nutzt dein Unternehmen GoProxy? Hilf uns, das Projekt gewartet und gesund zu halten! Die Unterstützung von GoProxy erlaubt es uns, mehr Zeit für Fehlerbehebungen und neue Funktionen aufzuwenden. Im Gegenzug zeigen wir dein Firmenlogo hier stolz an, wenn du einen Gold-Supporter- oder Enterprise-Plan wählst.
Betreuer
- Elazar Leibovich: Projektgründer, Softwareentwickler
- Erik Pellizzon: Betreuer, Freiberufler (offen für Kooperationen!)
Wenn du GoProxy in dein Projekt integrieren musst oder benutzerdefinierte Funktionen benötigst, die du in deinem Fork pflegen möchtest, kannst du Erik (den derzeitigen Betreuer) per E-Mail kontaktieren und gemeinsam besprechen, wie er dir als bezahlter unabhängiger Berater helfen kann.
Beiträge
Wenn du Probleme hast, Vorschläge hast oder einen Fehler findest, zögere nicht, ein GitHub-Issue zu eröffnen.
Dies ist ein von Freiwilligen verwaltetes Open-Source-Projekt, und wir freuen uns, über alles zu diskutieren, was es verbessern kann.
Erkläre alles genau, einschließlich des Grundes für das Issue und was du ändern möchtest, um das Problem verständlicher zu machen.
Du kannst auch direkt einen Pull Request eröffnen, wenn es sich um eine kleine Codeänderung handelt, aber du musst in der Beschreibung alles erklären.
Wenn du einen Pull Request mit dem Namen refactoring und 5.000 geänderten Zeilen eröffnest, werden wir ihn nicht mergen ... :D
Der Code für dieses Projekt wird unter der BSD-3-Clause-Lizenz veröffentlicht, was ihn auch für kommerzielle Zwecke nutzbar macht.
Reiche deine Fallstudie ein
Du hast GoProxy also in eines deiner persönlichen Projekte oder in ein Projekt des Unternehmens, für das du arbeitest, eingeführt und integriert.
Wir freuen uns über neue kreative Lösungen, die mit dieser Bibliothek erstellt wurden. Zögere also nicht, den oben genannten Betreuer per E-Mail zu kontaktieren und zu erklären, warum du dieses Projekt für deine Bedürfnisse nützlich fandest.
Wenn du eine Geheimhaltungsvereinbarung mit dem Unternehmen unterzeichnet hast, kannst du vorschlagen, dass sie einen Blogbeitrag zu diesem Thema auf ihrer offiziellen Website schreiben. So werden diese Informationen öffentlich, und du kannst uns den Link des Blogbeitrags mitteilen :)
Der Zweck von Fallstudien ist es, mit der Community zu teilen, warum alle Beitragenden zu diesem Projekt mit ihrer Hilfe die Welt verbessern und was Menschen damit bauen.
Linter
Die Codebasis führt bei deinem Pull-Request-Code eine automatische Lint-Prüfung durch. Bevor du ihn eröffnest, solltest du prüfen, ob deine Änderungen diese einhalten, indem du den Linter auf deinem lokalen Rechner ausführst, damit es keine Überraschungen gibt.
So installierst du den Linter:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Dadurch wird eine ausführbare Datei in deinem $GOPATH/bin-Ordner erstellt
($GOPATH ist eine Umgebungsvariable, normalerweise
entspricht ihr Wert ~/go; überprüfe den Wert auf deinem Rechner, wenn du
dir nicht sicher bist).
Stelle sicher, dass der bin-Ordner im Pfad deiner Shell enthalten ist, um den Befehl golangci-lint run direkt verwenden zu können.
Ein Vorgeschmack auf GoProxy
Um einen Vorgeschmack auf goproxy zu bekommen, hier ist ein einfacher HTTP/HTTPS-Proxy, der Daten einfach an das Ziel weiterleitet:
package main
import (
"log"
"net/http"
"github.com/elazarl/goproxy"
)
func main() {
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = true
log.Fatal(http.ListenAndServe(":8080", proxy))
}
Request-Handler
Diese Zeile fügt allen Requests, die über den Proxy gesendet werden, den Header X-GoProxy: yxorPoG-X hinzu, bevor sie an das Ziel gesendet werden:
proxy.OnRequest().DoFunc(
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
r.Header.Set("X-GoProxy","yxorPoG-X")
return r,nil
})