Leiten Sie den gesamten Webverkehr ohne VPN über TLS um

Annahmen:

Server:

  • Ich habe einen Debian Squeeze-Server, der im öffentlichen Internet routierbar ist und eine statische IPv4-Adresse hat.
  • Ich habe uneingeschränkten Zugriff auf die Software auf dem Server zu ändern.
  • Der Server kann beliebige Ports abhören, Firewall-Regeln neu konfigurieren, grundsätzlich gibt es keine Einschränkungen dafür, was der Server tun kann.

Kunde:

  • Ich kann Firefox, Java-Programme,. NET-Programme und einige native ausführbare Dateien, für die kein Administratorzugriff auf meinem lokalen - System erforderlich ist (ein gesperrter Windows-Desktop ohne Administratorrechte).
  • Ich kann Addons in Firefox installieren.
  • Ich kann jeden Port auf der Loopback-Schnittstelle (localhost) abhören. Die oben genannten Programme können also an einen lokalen Port binden und beliebige Netzwerk-E/A ausführen, ohne einen Proxy zu durchlaufen.
  • Alle öffentlichen Internet Zugriff wird über einen restriktiven HTTP-Proxy geleitet, der blockiert viele Websites, und tut sorgfältige stateful Inspektion. Auf Port 80 erlaubt es ausschließlich HTTP (kein TLS/SSL). Auf Port 443 erlaubt es CONNECT - basiertes SSL / TLS Remote-Hosts, die nicht durch Domänennamen / IP-Adresse blockiert sind.
  • Der restriktive HTTP-Proxy führt keine tiefe Paketinspektion von TLS-Verbindungen durch, die über den Proxy zulässig sind, und er führt keine Angriffe auf diese Verbindungen im mittleren Bereich durch.
  • Auf den oben genannten Server habe ich Zugriff zu, ist nicht vom Proxy blockiert.

Ziel:

Ich möchte alle [[38]} HTTP-und HTTPS-Anforderungen, die von Firefox über den obigen Server ausgegeben werden, über SSL/TLS weiterleiten.

Weitere Hinweise zum "Ziel":

  • Selbst wenn die Endpunktsite (z. B. http://superuser.com) kein SSL / TLS für meinen Server verwendet, möchte ich weiterhin SSL/TLS von meinem Client zu meinem Server verwenden, und lassen Sie meinen Server die HTTP-Anforderung-ob verschlüsselt oder nicht-auf meine gewünschte Weise ausführen. Ziel.
  • Es ist mir egal, ob mein Server den SSL-Verkehr "im Klartext" betrachtet. Mit anderen Worten, ich benötige keine vollständige Ende-zu-Ende-SSL-Verschlüsselung von meinem lokalen Client bis zum Remote-Server,wenn auf den Remote-Server zugegriffen wird, z. B. von https://google.com. Mit anderen Worten, ich vertraue dem Server, um meine Daten vertraulich zu behandeln.
  • Ich bin bereit, Software oder Firefox-Addons zu installieren, die keine Administratorrechte erfordern und unter 32-Bit-Windows ausgeführt werden können 7.
  • Open-Source-Software wird proprietär vorgezogen, und Freeware wird Software vorgezogen, die eine Lizenzgebühr erfordert.
  • Vorhandene Software wird vorgezogen, neue Software zu codieren, obwohl ich bereit bin, Code zu schreiben, wenn dies der einzige Weg ist.

Ich suche nach einer lose beschriebenen "Lösung", die beschreibt:

  • Welche Software würde auf dem Client benötigt? Wenn Ihnen ein bestimmtes Softwarepaket bekannt ist, benennen Sie es; andernfalls, beschreiben Sie, was die Client-Software tun müsste .
  • Welche Software würde auf dem Server benötigt? Wenn Ihnen ein bestimmtes Softwarepaket bekannt ist, benennen Sie es; andernfalls beschreiben Sie, was die Serversoftware tun müsste .
  • Wenn Sie oben bestimmte Softwarepakete genannt haben, beschreiben Sie, welche Konfigurationsparameter erforderlich wären, um sie so einzurichten, dass sie mein Ziel erreichen.
  • Wenn Sie aus irgendeinem Grund glauben, dass dies nicht möglich ist, beschreiben Sie warum.

Dinge, die ich ausprobiert habe und die nicht funktionieren

  • Bei der Installation von squid auf meinem Server habe ich versucht, einen eigenen Standard-HTTP-Proxy auf meinem Server einzurichten. Das hat nicht geklappt, denn wenn ich Websites in Firefox über reguläres HTTP anfordere, versucht Firefox auch über reguläres HTTP auf meinen Server zuzugreifen! Dies ist nicht akzeptabel, da der Proxy in meinem lokalen Netzwerk natürlich den regulären HTTP-Verkehr zwischen meinem Client und dem Server.
  • VPNs funktionieren nicht, nicht einmal OpenVPN über TLS, das Port 443 abhört, da ich auf dem lokalen Computer nicht die Berechtigungen habe, einen tun - Netzwerkadapter zu installieren, der Layer-3-Routing durchführen kann, noch kann ich irgendeine Art von Layer - 2-Routing durchführen (zB tap). Kurz gesagt: Ich würde Administratorrechte benötigen, um OpenVPN zu installieren, und selbst wenn ich diese Administratorrechte vorübergehend hätte, wäre das Unternehmen nicht allzu erfreut, wenn es installiert wäre. Ein Java - oder. NET-Programm ist viel weniger bemerkenswert, besonders wenn es nicht in Add/Remove-Programmen installiert ist und keine Kernel-Treiberkomponente wie OpenVPN hat.
Author: Community, 2014-08-10

3 answers

Ich habe es herausgefunden. : D Diese Lösung erfüllt alle meiner Anforderungen und erfüllt alle meiner Ziele perfekt. Die Leistung ist auch nicht schlecht, wenn man bedenkt, wie hoch die Indirektion ist, die notwendig ist, um dies zu erreichen.

Der allgemeine Ansatz lautet also:

  1. Richten Sie eine lokale Zertifizierungsstelle (CA) ein und generieren Sie einen RSA-"Serverschlüssel" und einen "Clientschlüssel" (ich habe eine 256-Bit-Verschlüsselung verwendet). Dafür habe ich die Version Easy-RSA verwendet 3.0.0-rc2.

  2. Führen Sie einen beliebigen Moor-Standard-HTTP-Proxy auf der "Debian-Box" (dem Server im öffentlichen Internet) aus und stellen Sie sicher, dass er nur auf localhost lauscht (er sollte NICHT dem öffentlichen Internet ausgesetzt sein). Für meine Zwecke habe ichPrivoxy, aber Squid hätte genauso gut funktioniert. Da nur localhost überwacht wird, ist keine Authentifizierung erforderlich (es sei denn, auf Ihrer Box werden Prozesse ausgeführt, denen Sie nicht vertrauen; in diesem Fall, Huch...)

  3. Laden Sie stunnel herunter und installieren Sie es sowohl auf dem Client als auch auf dem Server. Der Prozess dafür wird betriebssystemspezifisch sein; In meinem Fall habe ich mich entschieden, Stunnel aus der Quelle zu kompilieren (Paranoia...) für Windows, was ein ziemlich involvierter Prozess war, werde ich hier nicht detailliert beschreiben. Auf der Serverseite war es im Paketmanager verfügbar :)

  4. Stunnels Konfiguration war anfangs ziemlich entmutigend, aber es ist einfacher als es scheint! Grundsätzlich auf der server, Sie benötigen so etwas wie den folgenden "Server' s Stunnel.conf". Auf dem Client benötigen Sie so etwas wie den folgenden "Client' s Stunnel.conf".

  5. Starte Privoxy; starte Stunnel auf dem Server und zeige es auf die Konfigurationsdatei; starte Stunnel auf dem Client und zeige es auf die Konfigurationsdatei. Es gibt wirklich nichts Besonderes an Privoxys Konfiguration; Der Standardwert war in Ordnung für mich.

  6. In Firefox, Ihrem Browser der Wahl auf der Clientseite, legen Sie HTTP und HTTPS fest proxy scheint derselbe zu sein wie der Port, den der Stunnel Ihres Clients abhört - wahrscheinlich so etwas wie localhost: 8080.

Ich sollte wahrscheinlich beachten, dass, wenn der Proxy Ihres lokalen Netzwerks eine Art Authentifizierung erfordert, Sie entweder Stunnel dazu bringen müssen, sich für Sie zu authentifizieren, oder Sie verwenden einen anderen lokalen abfangenden Proxy und verketten Sie sie zusammen - so etwas wie Firefox - > stunnel - > lokaler authentifizierender Proxy - > LAN-Proxy / Gateway - > Internet - > der stunnel -> privoxy.

Das ist eine Menge Kopieren, aber es funktioniert!

;This is the *client's* stunnel.conf.
[https]
accept = localhost:9020
connect = your.lan.proxy:80
client = yes
protocol = connect
;protocolHost should be the same as the "accept" for the server
protocolHost = 1.2.3.4:443
;Same CAfile, different cert and key pair
CAfile = ca.crt
cert = client.crt
key = client.key
;VERY IMPORTANT!!! Make sure it's really your server and not a MITM attempt by your local network by making sure that the certificate authority "ca.crt" really signed the server's cert
verify = 2
;More performance tweaks...
sessionCachetimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600

.

;This is the *server's* stunnel.conf.
[https]
;1.2.3.4 is a publicly-routable, static IP address that can be connected to by your box that's under the firewall
accept = 1.2.3.4:443
;localhost:8118 is an example of where your local forwarding HTTP(S) proxy might reside.
connect = localhost:8118
CAfile = ca.crt
cert = server.crt
key = server.key
;VERY IMPORTANT!!! Without this, anyone in the world can use your public stunnel port as an open proxy!
verify = 2
;Set some timeouts higher for performance reasons
sessionCacheTimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600

Sobald alles konfiguriert ist, sieht das Endergebnis ungefähr so aus:

  1. Ihr Webbrowser stellt eine Verbindung zu localhost:9020 (stunnel) her und behandelt ihn wie einen Proxy, der HTTP-und/oder HTTPS-Verbindungen akzeptieren kann.
  2. Sobald stunnel eine Verbindung von Ihrem Browser erhält, erreicht er über den Proxy/Gateway Ihrer Firewall eine TLS-Sitzung mit Ihrer Fernbedienung Server. Zu diesem Zeitpunkt überprüft Ihr Client das PKI-Zertifikat Ihres Servers und umgekehrt.
  3. Sobald die TLS-Sitzung mit Ihrem Remote-Server eingerichtet ist, leitet stunnel die von Ihrem Browser kommenden Daten, z. B. eine HTTP-Anforderung oder eine SSL-Tunnelanforderung, über den lokalen Proxy und direkt an Ihren Server weiter. Dieser Kanal ist verschlüsselt, sodass Ihr lokales Netzwerk nicht erkennen kann, was die Daten enthalten, sondern nur durch eine Verkehrsanalyse erraten kann.
  4. Sobald die stunnel Instanz das Ausführen von auf Ihrem Server beginnt mit dem Empfangen von Daten und öffnet eine Verbindung zu zB localhost:8118, wo Ihr HTTP (S) Proxy-Server, in meinem Fall Privoxy, abhört.
  5. Privoxy verhält sich dann wie ein normaler Weiterleitungs-HTTP-Proxy-Server und leitet Ihre Anfragen über den ISP des Servers an das öffentliche Internet weiter.

Die Anzahl der beteiligten Sockets und Puffer macht diese Methode zu einem sehr hohen Overhead, insbesondere wenn Sie eine SSL-Verbindung über den Proxy verschachteln, aber es hat den Vorteil, dass Ihr lokales Netzwerk keine Möglichkeit hat zu wissen, welche Websites Sie über SSL besuchen. Ich meine, es weiß, dass Sie Ihren Server besuchen, aber abgesehen davon weiß es nicht, ob Sie Google Mail oder SuperUser oder was auch immer besuchen. Und Ihr lokales Gateway hat keine Möglichkeit, Sie zu filtern oder zu blockieren.

 5
Author: allquixotic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-08-12 23:42:01

Ich habe dieses Setup auf meinem lokalen Computer ausprobiert und kann versichern, dass der "restriktive Proxy" ein CONNECT DEBIAN_IP:443 HTTP/1.1, aber es wird kein Zertifikat angezeigt, daher bin ich mir nicht sicher, ob dies funktionieren würde.

Nehmen wir an: Ihr Debian hat Apache oder Squid, um und einen SSH-Server zu erstellen. Auf Ihrem Client-PC benötigen Sie putty, ein Programm, das keine Administratorrechte zum Ausführen benötigt, keine Installation benötigt und von einem USB-Stick aus ausgeführt werden kann.

Zuerst Ihre Debian:

Lassen Sie Ihren SSH auf Port 443 hören, fügen Sie einfach einen Port 443 auf /etc/ssh/sshd_config hinzu (oder ersetzen Sie ihn durch Ihren aktuellen Port) und erlauben Sie auch die TCP-Weiterleitung (fügen Sie AllowTcpForwarding yes zu dieser Datei hinzu)

Konfigurieren Sie Ihren Squid oder Apache für das Proxying. Da dies über einen SSH-Tunnel verwendet wird, müsste es nur die Loopback-Schnittstelle abhören. Falls Sie einen Apache verwenden:

Listen 127.0.0.1:8080
ProxyRequests On
<Proxy *>
  Order deny,allow
</Proxy>

Server fertig, konfigurieren wir Ihren Client-PC:

Konfigurieren Sie auf Putty die öffentliche IP Ihres Debian als Host und 443 port. Stellen Sie sicher, dass SSH " noch ausgewählt ist. Wechseln Sie zu den Connection -> Proxy - Einstellungen, wählen Sie HTTP und füllen Sie Ihre "restriktiven Proxy" - Einstellungen aus. Ändern Sie die Connection - Einstellungen und stabilisieren Sie ein Keepalive von 30-60. Wechseln Sie zu Connection -> SSH -> Tunnels. Auf source port stabil 8080, und auf Destination, localhost:8080. Lassen Sie Local ausgewählt und drücken Sie Add. Sie sollten im Raum oben etwas wie L8080 locahost:8080 sehen. Wechseln Sie zurück zu den Session Einstellungen, notieren Sie sich einen Namen in der ersten Zeile von Saved sessions und speichern Sie all diese mühsamen einstellungen zum Wiederherstellen der Verbindung an den folgenden Tagen.

Jetzt können Sie versuchen, die Verbindung zu Ihrem Debian herzustellen. Wenn Sie die Benutzeraufforderung sehen, sind wir nur einen Schritt davon entfernt, damit fertig zu werden. Wenn nicht... wir müssen nach einem anderen Weg suchen.

Setzen Sie nun in Firefox localhost auf Port 8080 als Proxy.

 2
Author: NuTTyX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-08-12 20:03:46

Sie sind auf halbem Weg mit der Einrichtung eines Proxys auf Ihrem Server. Die andere Hälfte ist SSL auf dem Server und ein lokaler Proxy auf dem Client, der Putty verwendet, um eine Verbindung zu Ihrem SSL-fähigen HTTP-Proxy herzustellen, und Firefox so einstellen, dass alles auf 127.0.0.1 Proxy.

Ich habe gerade ein schnelles Google für ein Kitt-Setup gemacht und Folgendes gefunden: https://mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/

 1
Author: joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-08-12 17:34:48