Redirecionar todo o tráfego da web por meio de TLS sem uma VPN

10

Suposições:

Servidor:

  • Eu tenho um servidor Debian Squeeze, que pode ser roteado na Internet pública, com um endereço IPv4 estático.
  • Eu tenho acesso irrestrito para modificar o software no servidor.
  • O servidor pode escutar portas arbitrárias, reconfigurar regras de firewall, basicamente não há restrições sobre o que o servidor pode fazer.

Cliente:

  • Posso executar o Firefox, programas Java, programas .NET e alguns executáveis nativos que não exigem acesso de administrador no meu sistema local (uma área de trabalho do Windows bloqueada sem direitos de administrador).
  • Eu posso instalar o Addons no Firefox.
  • Eu posso ouvir em qualquer porta na interface de loopback ( localhost ). Assim, os programas acima mencionados podem se ligar a uma porta local e executar E / S de rede arbitrária, sem passar por um proxy.
  • Todo o acesso público à Internet é roteado por meio de um proxy HTTP restritivo que bloqueia muitos sites e faz uma inspeção cuidadosa com informações de estado. Na porta 80, permite exclusivamente HTTP (sem TLS / SSL). Na porta 443, ele permite SSL / TLS com base em CONNECT para hosts remotos que não são bloqueados pelo nome de domínio / endereço IP.
  • O proxy HTTP restritivo não realiza inspeção profunda de pacotes de conexões TLS permitidas por meio do proxy, e não executa ataques Man of the Middle nessas conexões .
  • O servidor mencionado acima ao qual tenho acesso não está bloqueado pelo proxy.

Objetivo:

Eu quero encaminhar todas solicitações HTTP e HTTPS emitidas pelo Firefox, por meio do servidor acima, por SSL / TLS.

Outras notas sobre o "Objetivo":

  • Mesmo que o site do ponto de extremidade (por exemplo, http://superuser.com ) não esteja usando SSL / TLS em meu servidor, ainda quero usar SSL / TLS do meu cliente para o meu servidor e meu servidor executa a solicitação HTTP - criptografada ou não - para o destino desejado.
  • Eu não me importo se meu servidor estiver olhando para o tráfego SSL "in clear". Em outras palavras, eu não preciso de criptografia SSL de ponta a ponta completa do meu cliente local, até o servidor remoto, se o servidor remoto estiver sendo acessado, por exemplo, %código%. Em outras palavras, confio no servidor para manter meus dados confidenciais.
  • Estou disposto a instalar qualquer software ou complementos do Firefox que não exijam direitos de administrador e possam ser executados no Windows 7 de 32 bits.
  • O software de código aberto é preferível ao proprietário, e o freeware é preferível ao software que exige uma taxa de licença.
  • O software existente é preferido por ter que codificar um novo software, embora eu esteja disposto a escrever código, se essa for a única maneira.

Estou procurando uma "solução" vagamente descrita que descreva:

  • Qual software seria necessário no cliente? Se houver um pacote de software específico que você conhece, nomeie-o; caso contrário, descreva o que o software cliente teria que fazer .
  • Qual software seria necessário no servidor? Se houver um pacote de software específico que você conhece, nomeie-o; caso contrário, descreva o que o software para servidor teria que fazer .
  • Se você nomeou pacotes de software específicos acima, descreva quais parâmetros de configuração seriam necessários para configurá-lo para atingir meu objetivo.
  • Se por algum motivo você acreditar que isso não é , descreva por que .

Coisas que tentei que não funcionam

  • Instalando https://google.com no meu servidor, tentei configurar um proxy HTTP padrão no meu servidor. Isso não deu certo, porque quando eu solicito sites no Firefox sobre HTTP regular, o Firefox tenta acessar meu servidor através do HTTP regular também! Isso não é aceitável, porque o proxy na minha rede local pode é claro observar e / ou bloquear o tráfego HTTP regular entre meu cliente e o servidor.
  • VPNs não funcionam , nem mesmo o OpenVPN por TLS escutando na porta 443, porque eu não tenho permissões no computador local para instalar um adaptador de rede squid que pode executar o roteamento da camada 3, nem posso fazer qualquer tipo de roteamento da camada 2 (por exemplo, tun ). Resumindo: eu precisaria dos direitos de administrador para instalar o OpenVPN e, mesmo que eu tivesse esses direitos de administrador temporariamente, a empresa não ficaria satisfeita se eles achassem que ele estava instalado. Um programa Java ou .NET é muito menos perceptível, especialmente quando não está instalado em Adicionar / Remover Programas e não possui nenhum componente de driver de kernel como o OpenVPN.
por Horn OK Please 10.08.2014 / 05:18

3 respostas

5

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:

  1. 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.

  2. 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 , mas Squid 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 ...)

  3. 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:)

  4. 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.

  5. 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.

  6. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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ê.

    
por 13.08.2014 / 01:14
2

Eu tentei essa configuração na minha máquina local, e posso garantir que o "proxy restritivo" obteria um CONNECT DEBIAN_IP:443 HTTP/1.1 , mas não verá nenhum certificado, então não tenho certeza se isso funcionaria.

Vamos supor: seu Debian tem Apache ou Squid para fazer o proxy e um servidor SSH. No seu PC cliente, você precisa de putty , que é um programa que não precisa de privilégios de administrador para executar, não precisa de instalação e pode ser executado a partir de um pendrive.

Primeiro seu Debian:

Faça seu SSH ouvir na porta 443 , apenas adicione (ou substitua sua porta atual) a Port 443 on /etc/ssh/sshd_config e também permita o encaminhamento TCP (adicione AllowTcpForwarding yes nesse arquivo)

Configure seu Squid ou Apache para fazer proxy. Como isso vai ser usado através de um túnel SSH, ele só precisa escutar na interface de loopback. Caso você use um Apache:

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

Servidor pronto, vamos configurar seu PC cliente:

No putty, configure o IP público do seu Debian como Host e 443 as port. Certifique-se de que SSH ainda esteja selecionado. Altere para as configurações de Connection -> Proxy , selecione HTTP e preencha suas configurações de "proxy restritivo". Altere para as configurações de Connection e estabeleça um keepalive de 30 - 60 . Altere para o Connection -> SSH -> Tunnels . No source port stablish 8080 e no Destination , localhost:8080 . Deixe Local selecionado e pressione Add . Você deve ver no espaço acima algo como L8080 locahost:8080 . Volte para as configurações de Session , anote um nome na primeira linha de Saved sessions e salve todas essas configurações tediosas para ajudar a restabelecer a conexão nos dias seguintes.

Agora você pode tentar Open a conexão com seu Debian. Se você ver o prompt do usuário, estamos a apenas um passo de terminar com isso. Se não ... teremos que procurar outro caminho.

Agora, no Firefox, defina localhost na porta 8080 como seu proxy.

    
por 12.08.2014 / 22:03
1

Você está no meio do caminho com a configuração de um proxy no seu servidor. A outra metade é SSL no servidor e um proxy local no cliente que usa putty para se conectar ao seu proxy HTTP habilitado para SSL e define o Firefox como proxy para 127.0.0.1.

Eu apenas fiz um rápido google para uma configuração de putty e achei isso: link

    
por 12.08.2014 / 19:29