
Estou tentando fazer proxy SNI para uma sub-rede em um roteador enquanto mantenho o IP src.
Antecedentes: Eu tenho um roteador fazendo DNAT para encaminhar portas para muitas portas de aplicativos e ele está conectado a uma sub-rede (na verdade, usando uma VPN) com back-ends diferentes. Para protocolos que NÃO possuem algo como HTTP Host ou TLS SNI que podem ser roteados para diferentes IPs com base na solicitação, simplesmente uso DNAT com filtro de porta TCP e eles estão funcionando bem.
Para TLS, estou usandoSNIProxymultiplexar as conexões de entrada para diferentes servidores, com base em TLS SNI. Funciona muito bem, mas o SINProxy envia os pacotes TLS do próprio roteador, descartando os endereços src. Isso interrompe alguns serviços de back-end que dependem do IP src.
Portanto, estou me perguntando se é possível que o netfilter filtre o tráfego usando TLS SNI (opcionalmente com módulos externos) e roteie-os usando DNAT (em vez de apenas descartar). Se isso não for possível, existem alternativas?
A propósito, não quero implantar HTTP completo (ou qualquer servidor L5) no meu roteador porque:
- Tenho que descriptografar o tráfego e procurá-lo no back-end. Esta é uma sobrecarga enorme.
- Não quero implantar certificados TLS em roteadores devido à complexidade do gerenciamento.
Muito obrigado por qualquer resposta útil antecipadamente.
Responder1
Em teoria, usando -j NFQUEUE
o espaço do usuário para alterar o primeiro pacote e fazer NAT, você poderia imaginar fazer algo assim. Na prática você não pode porque precisa ter recebido uma mensagem ClientHello completa com extensão SNI para adivinhar o novo endereço de destino, e como o primeiro pacote TCP estará vazio, ou com UDP, o DTLS exigirá algumas rodadas de qualquer maneira, é então tarde demais para NAT, um fluxo agora gerenciado pelo conntrack.
Você precisa de um proxy. Mas o proxy pode se tornar transparente ou você pode usar o protocolo PROXY com aplicativos de back-end que o suportam (embora eles tenham que suportar o uso conjunto do protocolo PROXY mais TLS).
Por exemplo, haproxy
rodar no gateway pode fazer uma das duas coisas: é o projeto que propôs oProtocolo PROXY, e também pode usar Linuxproxyalvo para proxy transparente (transparente tanto com origem quanto com destino).
Aqui está um link que encontrei para uma essência do github que oferece as duas opções:Aproveite o HAProxy para rotear solicitações de maneira transparente para serviços da Web identificados pelo nome do host. Aqui estão algumas linhas sobre configuração de proxy transparente, para ser usada junto com o kernel do Linuxproxydocumentação (também na mesma essência):
A configuração do servidor HAProxy seria semelhante à seguinte. Funciona tanto para os modos TCP quanto HTTP.
server app1-tls 192.0.2.10:3001 source * usesrc client weight 0
Responder2
Assim, estou me perguntando se é possível que o netfilter filtre o tráfego usando TLS SNI (opcionalmente com módulos externos)
Isso não é possível. O NAT deve ser feito começando pelo primeiro pacote da conexão, ou seja, o TCP SYN que inicia o handshake TCP. Mas o SNI está apenas no ClientHello do handshake TLS, que é enviado somente após a conclusão do handshake TCP. Ou seja: as informações necessárias para o NAT ainda não estão disponíveis no momento em que são necessárias.
Se isso não for possível, existem alternativas?
haproxy pode encerrar a conexão TCP e encaminhar os dados com base no SNI no ClientHello - sem encerrar o TLS no proxy. Ele pode então encaminhar o IP de origem original do cliente dentro da conexão TCP usando o protocolo PROXY (basicamente um cabeçalho no início da conexão encaminhada). Se o servidor upstream não entender o protocolo PROXY, pode-se usar software comommproxypara SNAT a conexão do haproxy para que mostre o IP de origem original.