Wireproxy: WireGuard-Client, bereitgestellt als HTTP-/SOCKS5-Proxy
(github.com/pufferffish)- Wireproxy ist ein vollständiger WireGuard-Client im Userspace, der sich mit einem WireGuard-Peer verbindet und auf dem lokalen Rechner als SOCKS5-/HTTP-Proxy oder Tunnel bereitgestellt wird
- Gedacht für Fälle, in denen nur der Traffic bestimmter Websites an einen WireGuard-Peer gesendet werden soll, ohne ein neues Netzwerk-Interface einzurichten, oder wenn für Änderungen an der WireGuard-Konfiguration keine Root-Rechte verwendet werden sollen
- Zu den Funktionen gehören statisches TCP-Routing, SOCKS5-/HTTP-Proxys und ein transparenter Proxy auf Basis von TLS SNI; der HTTP-Proxy unterstützt derzeit nur CONNECT
- Die Konfiguration folgt der Bedeutung von
[Interface]und[Peer]auswg-quick; bestehende WireGuard-Konfigurationsdateien können überWGConfigimportiert oder mehrere Peers perAllowedIPsgeroutet werden - Für den Betrieb stellt es über
--info/-ieinen Health-Endpoint bereit; über/metricsund/readyzlassen sich der WireGuard-Status und der Bereitschaftsstatus auf Basis vonCheckAliveprüfen
Was Wireproxy macht
wireproxyist eine Userspace-Anwendung, die sich mit einem WireGuard-Peer verbindet und auf dem lokalen Rechner einen SOCKS5-/HTTP-Proxy oder Tunnel bereitstellt- Sie kann genutzt werden, wenn nur bestimmte Websites über einen WireGuard-Peer erreichbar sein sollen, aber kein neues Netzwerk-Interface angelegt werden soll
- Sie arbeitet vollständig getrennt von Netzwerk-Interfaces und benötigt für die Konfiguration keine Root-Rechte
- Nutzer, die einen ähnlichen Einsatzzweck wie bei Amnezia VPN benötigen, können den Fork wireproxy-awg verwenden
Unterstützte Funktionen und noch fehlende Funktionen
- Unterstützte Funktionen
- Statisches TCP-Routing für Client und Server
- SOCKS5-/HTTP-Proxys
- HTTP unterstützt derzeit nur CONNECT
- Transparenter TLS-Proxy mit Server Name Indication
- Funktionen, die noch auf der TODO-Liste stehen
- UDP-Unterstützung für SOCKS5
- Statisches UDP-Routing
Ausführung und Installation
- Das grundlegende Ausführungsformat ist
./wireproxy [-c path to config] - Wichtige Optionen
-c,--config: Pfad zur Konfigurationsdatei festlegen- Standardpfade sind
/etc/wireproxy/wireproxy.conf,$HOME/.config/wireproxy.conf
- Standardpfade sind
-s,--silent: Silent Mode-d,--daemon: Im Hintergrund ausführen-i,--info: Adresse und Port zum Bereitstellen des Health-Status angeben-v,--version: Version ausgeben-n,--configtest: Nur die Gültigkeit der Konfigurationsdatei prüfen
- Der Build erfolgt nach dem Klonen des Repositorys mit
make - Als Installationsbeispiel wird
go install github.com/windtf/wireproxy/cmd/wireproxy@v1.1.2oder@latestverwendet
Konfigurationsmodell
- Die Einstellungen
[Interface]und[Peer]haben dieselbe Bedeutung wie in einerwg-quick-Konfiguration Addressmuss für IPv4 ein/32- und für IPv6 ein/128-Subnetz verwendenPrivateKeykann auch über eine Umgebungsvariable referenziert werden- Wenn bereits eine WireGuard-Konfiguration vorhanden ist, kann sie mit
WGConfig = <path to the wireguard config>importiert werden
Tunnel- und Proxy-Konfiguration
TCPClientTunnel- Leitet auf dem lokalen Rechner empfangenen TCP-Traffic über WireGuard an ein angegebenes Ziel weiter
- Ein Beispielablauf ist
<LAN-App> → localhost:25565 → WireGuard → play.cubecraft.net:25565
TCPServerTunnel- Leitet im WireGuard-Netzwerk empfangenen TCP-Traffic an ein angegebenes Ziel im lokalen Netzwerk weiter
- Ein Beispielablauf ist
<WireGuard-Netzwerk-App> → WireGuard → 172.16.31.2:3422 → localhost:25545
STDIOTunnel- Verbindet Standardeingabe und -ausgabe des wireproxy-Prozesses mit einem TCP-Ziel über WireGuard
- Nützlich für den
ProxyCommand-Parameter vonopenssh
Socks5- Erstellt einen SOCKS5-Proxy im lokalen LAN und routet den gesamten Traffic über WireGuard
- Werden Benutzername und Passwort angegeben, wird Proxy-Authentifizierung aktiviert
http- Erstellt einen HTTP-Proxy im lokalen LAN und routet den gesamten Traffic über WireGuard
- Werden Benutzername und Passwort angegeben, wird Authentifizierung aktiviert
- Wenn
CertFileundKeyFileangegeben werden, wird HTTPS aktiviert
SNI- Erstellt einen transparenten TLS-Proxy im lokalen LAN und sendet den Traffic über WireGuard, wobei SNI als Routing-Ziel verwendet wird
Mehrere Peers und Routing
- Es können mehrere WireGuard-Peers verwendet werden
- Bei mehreren Peers muss AllowedIPs angegeben werden, damit wireproxy weiß, an welchen Peer weitergeleitet werden soll
- Das Konfigurationsbeispiel verwendet mehrere
[Peer]mit unterschiedlichenAllowedIPszusammen mit mehrerenTCPServerTunnel - Ein Beispiel für
UDPProxyTunnelist ebenfalls enthalten- Mit
BindAddresswird die lokale Bind-Adresse festgelegt - Mit
Targetwird die Zieladresse festgelegt - Wenn
InactivityTimeout0ist, tritt kein Timeout ein
- Mit
[Resolve]legt die DNS-Auflösungsstrategie festipv4: A-Records bevorzugenipv6: AAAA-Records bevorzugenauto: Standardwert; entsprichtipv4, wenn das WireGuard-Interface nur eine IPv4-Adresse hat, andernfallsipv6
- Mit einer
[Peer]-Konfiguration ohne Endpoint kann erlaubt werden, dass sich ein Peer mit wireproxy verbindet
Health-Endpoint
--info/-inimmt eine Adresse und einen Port wie zum Beispiellocalhost:9080entgegen und stellt einen HTTP-Server mit Health-Status-Metriken bereit- Derzeit sind zwei Endpoints implementiert
/metrics: Gibt Informationen über den WireGuard-Daemon aus und liefert dieselben Informationen wiewg show/readyz: Gibt als JSON den Zeitpunkt zurück, zu dem zuletzt ein Pong von der inCheckAliveangegebenen IP empfangen wurde
- Wenn
CheckAlivegesetzt ist, wird alleCheckAliveIntervalSekunden über WireGuard ein Ping an die angegebene Adresse gesendet- Das Standard-
CheckAliveIntervalbeträgt 5 Sekunden - Wenn innerhalb der letzten
CheckAliveIntervalSekunden plus 2 Sekunden Toleranz kein Pong empfangen wurde, wird 503 zurückgegeben - Wenn die Bedingung erfüllt ist, wird 200 zurückgegeben
- Das Standard-
- Wenn
CheckAlivenicht gesetzt ist, gibt/readyzein leeres JSON-Objekt und 200 zurück - Welcher Peer ICMP-Ping-Pakete routet, hängt von der AllowedIPs-Konfiguration des jeweiligen Peers ab
1 Kommentare
Hacker-News-Kommentare
Kleines Tool, aber großartig. Ich nutze es mit den Multi-Account-Containern von Firefox, um nur bestimmte Tabs über einen Heimrouter zu proxyen, der WireGuard unterstützt, aber keinen Proxy auf Anwendungsebene oder SSH hat
Ich dachte, dafür bräuchte man eine separate Erweiterung wie https://addons.mozilla.org/en-GB/firefox/addon/container-pro..., aber das war nicht so, und anscheinend ist selbst so ein Irrtum inzwischen ein Grund für Downvotes
Für das, was ich mit WireGuard machen wollte, passte https://github.com/dariost/soks besser. Es macht fast dasselbe, verwendet aber eine vorhandene WireGuard-Schnittstelle wieder.
Die Nutzung habe ich hier ausführlich beschrieben: https://www.nicoco.fr/blog/2023/09/10/wireguard/
Statt die Routing-Tabelle als Steuerungsmittel zu verwenden, entscheidet es anscheinend darüber, ob ein SOCKS5-Proxy verwendet wird oder nicht
Früher habe ich etwas Ähnliches mit einem Docker-Container auf einem Raspberry Pi gemacht, aber eine User-Space-Lösung scheint die deutlich bessere Wahl zu sein, weil sie auf jedem Betriebssystem laufen kann und garantiert nicht versehentlich die Routing-Tabelle des Hosts kaputtmacht
Es gibt auch onetun: https://github.com/aramperes/onetun
Ich frage mich, ob es auch eine vollständig im User Space laufende Server-Implementierung gibt. Um ohne tun/tap-Gerät auszukommen, bräuchte man wohl so etwas wie einen IP-Stack im User Space, aber ich bin nicht sicher
Es ersetzt in Go den Dialer, der Sockets verbindet, sodass man Sockets im Grunde mit WireGuard umhüllen kann. Da es im User Space läuft, braucht es kein tun/tap. Das hat @dpeckett alles als Open Source veröffentlicht.
Auf derselben Grundlage wurde auch ein User-Space-WireGuard-Gateway mit DNS-Auflösung gebaut: https://github.com/noisysockets/gateway
https://news.ycombinator.com/user?id=dpeckett
Soweit ich es verstanden habe, verwendet es den TCP/IP-Stack von Google im User Space
Das wäre gut als Ersatz für den SSH-Tunnel, den ich bisher genutzt habe, wenn ich eine andere IP brauchte.
Ein verwandtes Tool ist pproxy, das unter vielen anderen Funktionen verschiedene Tunnel-Protokolle „umwandeln“ kann und auch Routing-Funktionen hat. Ich habe es verwendet, um SSH-SOCKS5 in einen HTTP-Proxy umzuwandeln: https://github.com/moreati/pproxy
Ich dachte mir: „So etwas müsste man in Go ziemlich leicht bauen können“, und tatsächlich war es in Go geschrieben
Mehrere Multi-Protokoll-Proxy-Clients unterstützen diese Funktion. Repräsentative Open-Source-Beispiele sind sing-box, clash-meta und andere auf clash basierende Clients sowie xray.
Bei Clients mit proprietärem Quellcode gibt es Surge Mac/iOS
Es gibt viele wenig bekannte Möglichkeiten zur Verkehrslenkung, und es gibt auch Android-Implementierungen. Ich habe so etwas einmal verwendet, um auf einem nicht gerooteten Android-Gerät mit einer SIM ohne Hotspot-Unterstützung einen Hotspot bereitzustellen.
Allerdings steckt darin viel Code aus allen möglichen Ecken des Internets, und auch die Entwickler-Community ist aus verschiedenen Gründen ziemlich speziell, daher frage ich mich immer, wie vertrauenswürdig das alles ist
Ich habe mich nicht tief damit beschäftigt, wie es funktioniert, aber das Konzept von Regelgruppen, die entscheiden, welche Domains über das VPN geproxyt werden, gefällt mir
Mich würde die Leistung interessieren. Meiner Erinnerung nach war „vanilla“ SOCKS sehr einfach einzurichten — also einfach SSH mit den passenden Optionen starten und den Anwendungen sagen, sie sollen es verwenden — aber ziemlich langsam.
Dieses Tool scheint für Fälle gedacht zu sein, in denen es keinen normalen SOCKS/SSH-Server gibt, aber ich frage mich, ob es auch dort Vorteile hat
In meinem Fall war SOCKS über SSH leistungsmäßig immer ziemlich gut und unterschied sich von Ansätzen wie dem TUN-Modus von OpenSSH, bei denen man TCP über TCP schichtet
Trotzdem interessiert mich diese Lösung sehr
Ich dachte gerade noch, es wäre schön, ein Tool zu haben, das alle E-Mail-Verbindungen von Thunderbird über einen Tailscale-Exit-Node proxyt, ohne gleich den gesamten Traffic über den Exit-Node zu schicken
tailscale-CLI als SOCKS-Proxy verwenden: https://tailscale.com/kb/1113/aws-lambdaWenn man das in ein Container-Image packt und den SOCKS-Port freigibt, auf dem tailscale lauscht, hat man sofort einen Proxy
Wenn man so etwas speziell für Mullvad VPN braucht, hatte ich gute Erfahrungen mit https://github.com/imiric/mullvad-proxy
Es ist nicht mein Projekt, ich habe es nur für Updates geforkt. Das Gute daran ist, dass das Mullvad-CLI-Tool eingebettet ist, sodass man sehr einfach den Server wechseln kann, und alles vollständig vom Host-Rechner isoliert ist. Außerdem ist es „einfach“ nginx plus ein paar Skripte, daher dürfte auch die SOCKS5-Unterstützung in Ordnung sein
https://mullvad.net/en/blog/wireguard-configuration-tool-has...