Eu percebi isso. : D Esta solução satisfaz todos os meus requisitos e satisfaz todos os meus objetivos, perfeitamente. O desempenho também não é tão ruim, considerando o nível de indireção que é necessário para alcançar isso.
A abordagem geral é assim:
-
Configure uma Autoridade de Certificação (CA) local e gere uma "chave de servidor" e "chave de cliente" RSA (usei criptografia de 256 bits). Para isso, eu usei Easy-RSA versão 3.0.0-rc2.
-
Execute qualquer proxy HTTP padrão no "Debian Box" (o servidor na Internet pública), certificando-se de que ele escute apenas localhost (ele NÃO deve ser exposto a a Internet pública). Para os meus propósitos, usei
Privoxy
, masSquid
teria funcionado tão bem. Como é só ouvir no localhost, a autenticação não é necessária (a menos que existam processos em execução em sua caixa nos quais você não confia; nesse caso, yikes ...) -
Faça o download do stunnel e instale-o no cliente e no servidor. O processo para fazer isso será específico do sistema operacional; no meu caso, eu escolhi compilar o stunnel a partir da fonte (paranoia ...) para o Windows, o que foi um processo bastante complicado que não vou detalhar aqui. No lado do servidor, estava disponível no gerenciador de pacotes:)
-
A configuração do Stunnel foi bastante assustadora no começo, mas é mais simples do que parece! Basicamente, no servidor, você precisa de algo como o "stunnel.conf" do servidor abaixo. No cliente, você precisa de algo como o "stunnel.conf" do cliente abaixo.
-
Inicie o Privoxy; iniciar stunnel no servidor, apontando para o arquivo de configuração; iniciar stunnel no cliente, apontando para o arquivo de configuração. Não há realmente nada de especial sobre a configuração do Privoxy; o padrão foi bom para mim.
-
No Firefox, o seu navegador de escolha no lado do cliente, defina o proxy HTTP e HTTPS como o porto em que o stunnel do seu cliente está escutando - provavelmente algo como localhost: 8080.
Eu provavelmente deveria notar que se o proxy da sua rede local exigir algum tipo de autenticação, você terá que obter stunnel para autenticar para você, ou então usar outro proxy de interceptação local e encadeá-los juntos - - algo como o Firefox - > stunnel - > proxy de autenticação local - > Proxy / gateway de LAN - > internet - > stunnel do seu servidor - > privoxy.
Isso é muita cópia, mas funciona!
;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
Quando tudo estiver configurado, o resultado final ficará parecido com isto:
- Seu navegador da web se conecta a
localhost:9020
(stunnel) e o trata como um proxy que pode aceitar conexões HTTP e / ou HTTPS. - Quando o stunnel obtiver uma conexão do seu navegador, ele entrará em contato com o proxy / gateway do firewall para estabelecer uma sessão TLS com o servidor remoto. Neste momento, o seu cliente verifica o certificado PKI do seu servidor e vice-versa.
- Quando a sessão TLS é estabelecida com o seu servidor remoto, o stunnel passa os dados provenientes do seu navegador, por ex. um pedido HTTP ou um pedido de túnel SSL, através do proxy local e diretamente para o seu servidor. Este canal é criptografado, então sua rede local não pode dizer o que os dados contêm, eles só podem adivinhar fazendo análises de tráfego.
- Quando a instância
stunnel
em execução no seu servidor começar a receber dados, ela abrirá uma conexão com, por exemplo,localhost:8118
, que seria onde seu servidor proxy HTTP (S), no meu caso Privoxy, está escutando. - O Privoxy atua como um servidor proxy HTTP de encaminhamento normal e encaminha suas solicitações para a Internet pública por meio do ISP do servidor.
A quantidade de soquetes e buffers envolvidos torna esse método muito alto, especialmente se você estiver aninhando uma conexão SSL através do proxy, mas ele tem a vantagem de que sua rede local não tem como sabendo quais sites você está visitando em SSL. Quero dizer, você sabe que está visitando seu servidor, mas, além disso, não sabe se está visitando o Gmail ou o SuperUser ou o que quer que seja. E o seu gateway local não tem como filtrar ou bloquear você.