Como configurar o modo transparente do sslh em um ambiente de encaixe?

1

Eu quero configurar sslh na porta 443 para encaminhar para https e openvpn, que residem em dois contêineres docker. Desde que eu quero fornecer ACLs baseados em IP em https a longo prazo, eu quero sslh para fornecer o IP do cliente verdadeiro para o servidor da Web (também conhecido como o modo "transparente" do sslh).

Pelo que entendi, a documentação e esta resposta , o sslh irá falsificar solicitações externas na rede interna e precisa retornar a resposta dos servidores para traduzir a porta para comunicação com o cliente.

Meu problema é a configuração do iptables. Existem duas possibilidades de executar o sslh: no host ou em um contêiner dentro da rede do docker.

Consegui que a configuração "padrão" descrita na documentação funcionasse, ou seja, o sslh no host poderia ser encaminhado de maneira transparente para um serviço no host.

No entanto, não consigo obter o SSL transparente no host ou em um contêiner para trabalhar com os servidores em contêiner. Mais especificamente, minhas regras de iptables para marcar o tráfego que deveria ser roteado para sslh nunca correspondem a um pacote.

Por exemplo para um servidor https eu gostaria de:

iptables -t mangle -A OUTPUT -p tcp --sport 443 --source 172.25.0.2 --jump SSLH

Usando este quadro , tentei discernir como a rede ethernet virtual os dispositivos do contêiner, a ponte docker, o docker NAT e o iptables funcionam juntos, mas não consigo envolvê-lo com isso.

Para melhor discutir isso, vamos supor o seguinte:

  • host (eth0): 1.1.1.1
  • docker-bridge (br0): 172.25.0.0/16
    • servidor da Web (veth1): 172.25.0.2:443 (exposto no host como 8443, se necessário)
    • openvpn (veth2): 172.25.0.3:1194 (encaminhado para o host, se necessário)
    • sslh no contêiner (mutuamente exclusivo com o host sslh): 172.25.0.4:443 (encaminhado para o host)
  • sslh no host (mutuamente exclusivo com o recipiente sslh): porta 443
  • cliente: 8.8.8.8

Aqui está o meu modelo de falha deve acontecer quando um navegador se conecta ao host: 443 e sslh está no host no modo transparente

  • sslh se conecta a 172.25.0.2:8443 posando como o cliente original 8.8.8.8
  • o servidor web responde pelo handshake TCP para 8.8.8.8 via veth1
  • o pacote vai para o br0
  • o roteiro decide enviá-lo via ent0
  • cadeia de saída mangle do iptables marca-o como tráfego para sslh (isto é o que não funciona para mim)
  • a marca indica para encaminhar o pacote para o dispositivo lo local em vez
  • sslh pega, traduz a porta e envia de volta para o cliente

Meu problema na lista acima é que não conheço os critérios de filtro para o tráfego de saída dos servidores da web: Devo usar a porta interna da janela de encaixe 443 ou a porta mapeada 8443? O docker IP 172.25.0.2 ou outro? Tudo se resume a: será que a regra de saída do mangle será executada antes ou depois do NAT do docker?

Eu achei que poderia colocar sslh na rede do docker para evitar pensar sobre o NAT, mas ainda não consigo fazer com que as regras do iptables correspondam.

Eu não sei como proceder.

    
por Nobody 28.05.2018 / 15:20

0 respostas