Reindirizza TUTTO il traffico web tramite TLS senza una VPN


10

ipotesi:

Server:

  • Ho un server Debian Squeeze, instradabile su Internet pubblico, con un indirizzo IPv4 statico.
  • Ho accesso illimitato per modificare il software sul server.
  • Il server può ascoltare su porte arbitrarie, riconfigurare le regole del firewall, in pratica non ci sono restrizioni su ciò che il server può essere fatto per fare.

Cliente:

  • Posso eseguire Firefox, programmi Java, programmi .NET e alcuni eseguibili nativi che non richiedono l'accesso dell'amministratore sul mio sistema locale (un desktop Windows bloccato senza diritti di amministratore).
  • Posso installare componenti aggiuntivi in ​​Firefox.
  • Posso ascoltare su qualsiasi porta dell'interfaccia loopback ( localhost). Pertanto, i suddetti programmi possono collegarsi a una porta locale ed eseguire I / O di rete arbitrari, senza passare attraverso un proxy.
  • Tutto l' accesso a Internet pubblico viene instradato attraverso un proxy HTTP restrittivo che blocca molti siti e esegue un'attenta ispezione con stato. Sulla porta 80, consente esclusivamente HTTP (no TLS / SSL). Sulla porta 443, consente CONNECTSSL / TLS basato su host remoti che non sono bloccati dal nome dominio / indirizzo IP.
  • Il proxy HTTP restrittivo non esegue l'ispezione approfondita dei pacchetti delle connessioni TLS consentite tramite il proxy e non esegue attacchi Man in the Middle su tali connessioni.
  • Il server sopra menzionato a cui ho accesso non è bloccato dal proxy.

Obbiettivo:

Voglio indirizzare tutte le richieste HTTP e HTTPS emesse da Firefox, attraverso il server sopra, su SSL / TLS.

Altre note sull'obiettivo:

  • Anche se il sito dell'endpoint (ad esempio http://superuser.com) non utilizza SSL / TLS sul mio server, desidero comunque utilizzare SSL / TLS dal mio client al mio server e fare in modo che il mio server esegua la richiesta HTTP, sia crittografata che no, - alla mia destinazione desiderata.
  • Non mi interessa se il mio server sta esaminando il traffico SSL "in chiaro". In altre parole, non ho bisogno della crittografia SSL end-to-end completa dal mio client locale, fino al server remoto, se si accede al server remoto ad es https://google.com. In altre parole, mi fido del server per mantenere riservati i miei dati.
  • Sono disposto a installare qualsiasi software o componente aggiuntivo di Firefox che non richiede diritti di amministratore e può essere eseguito su Windows 7 a 32 bit.
  • Il software open source è preferito rispetto al proprietario e il freeware è preferito rispetto al software che richiede un canone.
  • Il software esistente è preferito rispetto alla necessità di codificare un nuovo software, anche se sono disposto a scrivere codice se questo è l'unico modo.

Sto cercando una "soluzione" vagamente descritta che descriva:

  • Quale software sarebbe richiesto sul client? Se esiste un pacchetto software specifico di cui sei a conoscenza, chiamalo; in caso contrario, descrivere cosa dovrebbe fare il software client .
  • Quale software sarebbe richiesto sul server? Se esiste un pacchetto software specifico di cui sei a conoscenza, chiamalo; in caso contrario, descrivere cosa dovrebbe fare il software server .
  • Se hai indicato i pacchetti software specifici sopra, descrivi quali parametri di configurazione sarebbero necessari per impostarlo per raggiungere il mio obiettivo.
  • Se per qualche motivo ritieni che ciò non sia possibile , descrivi il perché .

Cose che ho provato che non funzionano

  • Installando squidsul mio server, ho provato a configurare un mio proxy HTTP standard sul mio server. Questo non ha funzionato, perché quando richiedo siti Web in Firefox tramite HTTP normale, Firefox tenta di accedere anche al mio server tramite HTTP normale! Questo non è accettabile, perché il proxy sulla mia rete locale può ovviamente osservare e / o bloccare il traffico HTTP regolare tra il mio client e il server.
  • Le VPN non funzionano , nemmeno OpenVPN su TLS in ascolto sulla porta 443, perché non ho i permessi sul computer locale per installare una tunscheda di rete in grado di eseguire il routing di livello 3, né posso fare alcun tipo di routing di livello 2 (ad es tap.). In breve: avrei bisogno dei diritti di amministratore per installare OpenVPN, e anche se avessi temporaneamente quei diritti di amministratore, la società non sarebbe affatto contenta se scoprissero che era installato. Un programma Java o .NET è molto meno evidente, soprattutto quando non è installato in Installazione applicazioni e non ha componenti del driver del kernel come OpenVPN.

Provi i calzini? puoi definirlo sulla porta 443 nel tuo server.
Ashian,

Puoi usare la soluzione descritta in questo articolo: HTTP VPN di Poor man ? Si noti che il suo collegamento a HTTPTunnel non è corretto.
harrymc,

1
delegate.org potrebbe essere di aiuto.
Arjan,

@Ashian No, SOCKS non funzionerà, a meno che non sia racchiuso in TLS. SOCKS non è un protocollo basato su HTTP, quindi quando colpisce il proxy interno, verrà bloccato. E se io fossi in grado di eseguirlo tramite TLS, avrei probabilmente usare un protocollo diverso. Il mio primo problema è configurare il tunnel TLS in modo che Firefox possa utilizzarlo. Non ho ancora visto una spiegazione su come farlo.
allquixotic,

@harrymc: il titolo della domanda dice attraverso TLS . Il tunnel HTTP instrada i pacchetti IP su HTTP , che non è crittografato e non utilizza TLS. L'articolo stesso afferma che la connessione non è crittografata. Non è possibile che il mio proxy lo faccia passare. Inoltre, non ho socatprivilegi di amministratore o sulla casella client di Windows.
allquixotic,

Risposte:


5

L'avevo capito. : D Questa soluzione soddisfa tutti i miei requisiti e soddisfa perfettamente tutti i miei obiettivi. Le prestazioni non sono neanche male, considerando il livello di riferimento indiretto necessario per raggiungere questo obiettivo.

L'approccio generale è quindi:

  1. Configurare un'autorità di certificazione locale (CA) e generare una "chiave server" RSA e una "chiave client" (ho usato la crittografia a 256 bit). Per questo, ho usato Easy-RSA versione 3.0.0-rc2.

  2. Esegui qualsiasi proxy HTTP standard di bog su "Debian Box" (il server su Internet pubblico), assicurandoti di ascoltarlo solo su localhost (NON deve essere esposto a Internet pubblico). Per i miei scopi ho usato Privoxy, ma Squidavrebbe funzionato altrettanto bene. Poiché è in ascolto solo su localhost, l'autenticazione non è necessaria (a meno che non ci siano processi in esecuzione sulla tua casella di cui non ti fidi; in tal caso, yikes ...)

  3. Scarica stunnel e installalo sia sul client che sul server. Il processo per farlo sarà specifico del sistema operativo; nel mio caso, ho scelto di compilare lo stunnel dal sorgente (paranoia ...) per Windows, che era un processo piuttosto complicato che non descriverò qui. Sul lato server, era disponibile nel gestore pacchetti :)

  4. La configurazione di Stunnel all'inizio era piuttosto scoraggiante, ma è più semplice di quanto sembri! Fondamentalmente, sul server, hai bisogno di qualcosa come "server's stunnel.conf" qui sotto. Sul client, è necessario qualcosa di simile al seguente "client's stunnel.conf".

  5. Avvia Privoxy; avvia stunnel sul server, puntandolo al file di configurazione; avvia lo stunnel sul client, puntandolo al file di configurazione. Non c'è davvero niente di così speciale nella configurazione di Privoxy; il valore predefinito andava bene per me.

  6. In Firefox, il tuo browser preferito sul lato client, imposta il proxy HTTP e HTTPS in modo che corrisponda alla porta su cui è in ascolto lo stunnel del tuo client, probabilmente qualcosa come localhost: 8080.

Dovrei probabilmente notare che se il proxy della tua rete locale richiede un qualche tipo di autenticazione, dovrai fare uno stunnel per autenticarti, oppure usare un altro proxy di intercettazione locale e metterli insieme - qualcosa come Firefox -> stunnel -> local proxy di autenticazione -> proxy / gateway LAN -> internet -> stunnel del tuo server -> privoxy.

Sono molte le copie, ma funziona!

;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

Una volta che tutto è configurato, il risultato finale finisce per assomigliare a questo:

  1. Il browser Web si connette a localhost:9020(stunnel) e lo tratta come un proxy in grado di accettare connessioni HTTP e / o HTTPS.
  2. Una volta che stunnel ottiene una connessione dal tuo browser, raggiunge, attraverso il proxy / gateway del firewall, per stabilire una sessione TLS con il tuo server remoto. A questo punto, il client verifica il certificato PKI del server e viceversa.
  3. Una volta stabilita la sessione TLS con il server remoto, lo stunnel passa lungo i dati provenienti dal browser, ad esempio una richiesta HTTP o una richiesta tunnel SSL, attraverso il proxy locale e direttamente al server. Questo canale è crittografato, quindi la tua rete locale non può dire cosa contengono i dati, possono solo indovinare facendo l'analisi del traffico.
  4. Una volta che l' stunnelistanza in esecuzione sul tuo server inizia a ricevere dati, apre una connessione ad esempio localhost:8118, che sarebbe dove il tuo server proxy HTTP (S), nel mio caso Privoxy, è in ascolto.
  5. Privoxy si comporta quindi come un normale server proxy HTTP di inoltro e inoltra le richieste su Internet pubblico tramite l'ISP del server.

La quantità di socket e buffer coinvolti rende questo metodo un overhead molto elevato, specialmente se stai annidando una connessione SSL attraverso il proxy, ma ha il vantaggio che la tua rete locale non ha modo di sapere quali siti stai visitando su SSL. Voglio dire, sa che stai visitando il tuo server, ma a parte questo, non sa se stai visitando Gmail o SuperUser o altro. E il tuo gateway locale non ha modo di filtrarti o bloccarti.


2

Ho provato questa configurazione sul mio computer locale e posso assicurare che il "proxy restrittivo" otterrà un CONNECT DEBIAN_IP:443 HTTP/1.1, ma non vedrà alcun certificato, quindi non sono sicuro che funzioni.

Supponiamo: il tuo Debian ha Apacheo Squidfa il proxy e un server SSH. Sul PC client, è necessario putty, che è un programma che non ha bisogno dei privilegi di amministratore per essere eseguito, non è necessario per l'installazione e potrebbe essere eseguito da un pendrive.

Prima il tuo Debian:

Rendi la tua SSH in ascolto sulla porta 443, aggiungi (o sostituisci la tua porta corrente) a Port 443on /etc/ssh/sshd_confige consenti anche l'inoltro TCP (aggiungi AllowTcpForwarding yessu quel file)

Configura Squid o Apache per eseguire il proxy. Dato che questo verrà utilizzato attraverso un tunnel SSH, dovrebbe solo ascoltare sull'interfaccia di loopback. Nel caso in cui usi un Apache:

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

Server fatto, configuriamo il tuo PC client:

Su putty, configura l'IP pubblico di Debian come Hoste 443come porta. Assicurarsi che SSHsia ancora selezionato. Modifica le Connection -> Proxyimpostazioni, seleziona HTTPe compila le impostazioni del "proxy restrittivo". Modifica le Connectionimpostazioni e stabilisci un keepalive di 30- 60. Passare a Connection -> SSH -> Tunnels. Su source portstablish 8080, e Destination, localhost:8080. Lasciare Localselezionato e premere Add. Dovresti vedere nello spazio sopra qualcosa del genere L8080 locahost:8080. Torna alle Sessionimpostazioni, annota un nome nella prima riga di Saved sessionse salva tutte queste noiose impostazioni per ripristinare la connessione nei giorni seguenti.

Ora puoi provare a Openconnetterti al tuo Debian. Se vedi il prompt dell'utente, siamo solo a un passo dal finire con questo. Altrimenti ... dovremo cercare un altro modo.

Ora, su Firefox, imposta localhostsu porta 8080come proxy.


Sfortunatamente, questo non funzionerà, perché il protocollo SSH non è basato su SSL / TLS. Quando il proxy restrittivo sul mio lato client annusa la connessione che passa attraverso la porta 443, capisce immediatamente che non è un socket TLS e lo rilascia. Certo, avrei potuto avvolgo in TLS, ma che non è quello che la tua risposta descrive.
allquixotic,

Ho fatto un test con un proxy HTTP (BURP) e ho funzionato, quindi ne valeva la pena. Avvolgere SSH su TLS e mantenerlo funzionante potrebbe diventare complicato, però ...
NuTTyX

SSH su TLS è inutile indiretta. Se hai già il socket TLS attivo, non hai davvero bisogno di SSH. Vedi la mia risposta qui sotto. (Nota: non sapevo di questa risposta fino a poco tempo fa, quindi non è come se avessi attirato la tua risposta e poi pubblicato la soluzione. L'ho scoperto letteralmente circa 25 minuti fa.)
allquixotic

Sono contento che tu l'abbia risolto
NuTTyX il

1

Sei a metà strada con l'impostazione di un proxy sul tuo server. L'altra metà è SSL sul server e un proxy locale sul client che utilizza putty per connettersi al proxy HTTP abilitato per SSL e imposta Firefox su proxy su 127.0.0.1.

Ho appena fatto un rapido google per una configurazione di stucco e ho trovato questo: https://mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/


Per essere onesti, ha approfondito molti dettagli con il suo post. Grazie per il voto, comunque.
joe

@krowe Da nessuna parte nella mia risposta si dice "Apache" o "PuTTY".
allquixotic,

No, non mi disturba il fatto che tu abbia votato a favore di questa risposta! Ho appena interpretato il tuo commento dicendo che stavo in qualche modo cancellando la sua risposta o strappandola, quando in realtà non ho ottenuto molto da questa risposta mentre cercavo una soluzione. In retrospettiva, il blog collegato sembra essere un'alternativa accettabile alla risposta che ho pubblicato, anche se non sono sicuro di come differirebbe in termini di prestazioni, funzionalità, ecc. (Potrebbe essere migliore o potrebbe essere peggio).
allquixotic,

+1 Mi piace questo perché gestisco comunque un server web.
Krowe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.