Redirecionar o tráfego de saída na porta 80 para o httpd local com iptables / ebtables

3

O que eu quero

Eu tenho que implementar uma configuração muito específica com o squid, dansguardian e nginx. Estou sendo muito específico aqui de propósito, já que perguntas semelhantes muitas vezes pedem mais informações para dar respostas precisas. Além disso, eu não costumo fazer coisas de rede e minha solução atual é o resultado de pegar peças de quebra-cabeça de outras perguntas e respostas do Stack Exchange, então, por favor, desculpe / corrija quaisquer erros / mal-entendidos que eu tenha feito até agora.

Essencialmente, eu quero bloquear qualquer tentativa de acessar a internet através das portas 80 e 443, a menos que essas portas sejam acessadas através do proxy na porta 3128. A razão para isso é que o proxy e o Dansguardian podem filtrar / bloquear páginas indesejadas . Decidimos usar um proxy não transparente para podermos usar o bloqueio SSL não invase. Esta parte já está funcionando.

No entanto, se o cliente tentar acessar a Web diretamente, em vez de desistir da tentativa, a Caixa Mágica deve redirecionar o cliente para um guia passo-a-passo sobre como configurar o proxy.

Nós temos o wpad configurado para eliminar a necessidade de configurar os dispositivos do cliente manualmente. No entanto OSX e Linux e, mais importante, iOS e Android não têm suporte wpad habilitado por padrão (ou não suportam isso diretamente). Nossa primeira ideia foi deixar as instruções do cliente sobre como configurar seus dispositivos em papel. No entanto, meu chefe quer que eu defina a variante de redirecionamento, já que seria melhor para o cliente ver instantaneamente por que a internet não funciona imediatamente.

Aqui está uma ajuda visual para a configuração desejada. Não ilustrado é o fato de que enp1s0 e enp2s0 são parte da ponte br0 .

Odiagramaderedemostratodososdispositivosfísicosrelevantes.Vermelhomarcadosãoosdispositivosquenãopodemostocarouconfigurar.Marcadoverdesãonossosdispositivos.

Odiagrama"Inside the Magic Box" mostra as decisões de roteamento desejadas

A situação atual

Nossas regras originais de ebtables / iptables, onde deixaríamos guias de configuração passo-a-passo no papel, pareciam com isso

ebtables -A FORWARD -p ipv4 -i lo -o enp1s0 --ip-proto tcp --ip-destination-port 80 -j ACCEPT
ebtables -A FORWARD -p ipv4 -o enp1s0 --ip-proto tcp --ip-destination-port 80 -j DROP
ebtables -A FORWARD -p ipv4 -i lo -o enp1s0 --ip-proto tcp --ip-destination-port 443 -j ACCEPT
ebtables -A FORWARD -p ipv4 -o enp1s0 --ip-proto tcp --ip-destination-port 443 -j DROP

Para permitir o redirecionamento do cliente para um guia passo-a-passo no navegador quando a Internet é acessada sem proxy, alteramos as regras para o seguinte

ebtables -t broute -A BROUTING -i lo -j ACCEPT
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-destination-port 80 --ip-destination ! 192.168.2.75 -j redirect --redirect-target DROP
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.2.75:80

Com essas regras, sempre que tento acessar a Internet diretamente com um navegador, vejo esses pacotes aparecendo na cadeia PREROUTING do iptable. Enquanto isso, o nginx httpd ainda está acessível e a internet por meio do proxy também está funcionando.

A parte que não está funcionando é o redirecionamento para o nginx httpd. O navegador apenas me diz que o servidor não pode ser acessado e o log de acesso ao nginx também não mostra nenhuma atividade.

Eu tentei as seguintes coisas também, mas nenhuma resolveu o problema
* Configurando as regras SNAT e MASQUERADE na cadeia POSTROUTING
* Definindo net.ipv4.ip_forward para 1
* Definindo net.ipv4.conf.all.route_localnet para 1

Neste ponto, estou começando a pensar que cometi um erro tão minuto que minha ignorância sobre os detalhes mais finos de ebtables / iptables não me permite vê-lo, ou que o que eu quero fazer simplesmente não é possível com iptables / ebtables.

    
por Mike 20.10.2016 / 08:16

1 resposta

2

Tudo o que você precisa fazer é apontar todo o tráfego na porta 80 para o endereço IP e a porta específicos. Certo? Em caso afirmativo:

iptables -A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.75:3128

Onde --to-destination é o ip do seu servidor squid.

    
por 20.10.2016 / 08:37