Aqui está minha configuração de rede:
Minha configuração de rede http://daveden.files.wordpress.com/2013/05/network-configuration.png
O servidor proxy está executando Ubuntu com Squid na porta 3128 e DansGuardian na porta 8080.
Gostaria de forçar todos os clientes a usar o servidor proxy - especificamente, a porta 8080 - para qualquer acesso HTTP/HTTPS.
No entanto, não quero redirecionar de forma transparente porque isso não funciona para HTTPS. Não me importo de configurar cada cliente e não me importo que cada cliente saiba que está usando um servidor proxy. Só não quero que os clientes possam navegar na web sem as configurações de proxy.
Como eu faço isso? Posso simplesmente descartar pacotes se o cliente não estiver configurado para usar o servidor proxy na porta 8080?
Tentei usar o iptables para descartar pacotes que tinham um dport diferente de 8080, mas acho que rejeitou muito e não consegui mais acessar nada.
EDITAR
Reescrevi esta pergunta para que não seja específica do iptables, mas não sou contra o uso do iptables. Quero apenas atrair uma gama mais ampla de soluções possíveis.
EDITAR 2
Acho que posso ter dado a impressão errada a alguns. Só para deixar claro, não estou nem um pouco interessado emfiltragemTráfego HTTPS (ou seja, desmontar pacotes no proxy e inspecionar o conteúdo). Estou mais interessado embloqueandosites com DansGuardian, seja por HTTP ou HTTPS (observando o destino dos pacotes).
EDITAR 3
Com base na sugestão de Alexandru-Florin Vintil abaixo, eis o que estou fazendo atualmente:
# Redirect HTTP traffic to port 8080 (DansGuardian)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
# Check TCP and UDP traffic against whitelist
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j whitelist
iptables -A FORWARD -i eth1 -p udp --dport 443 -j whitelist
# Drop all other HTTPS traffic
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 443 -j DROP
# Drop all traffic aimed straight at the proxy
iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p tcp --dport 8080 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 8080 -j DROP
Resumindo, redirecione o tráfego HTTP para a porta 8080, elimine todo o tráfego HTTPS que não esteja na lista de permissões (em uma cadeia separada) e elimine todo o tráfego que usa explicitamente o proxy. Sem a última regra, um cliente pode acessar qualquer site usando HTTPS desde que configure seu navegador para usar o proxy, pois a porta de destino é 8080 e não 443. Portanto, mesmo descartar todo o tráfego vinculado a 443 não bloqueia completamente o HTTPS. .
Responder1
Meus 2 centavos:
Em relação ao HTTP: ter um firewall encaminhando de forma transparente o tráfego da porta 80 para um proxy/filtro é a maneira mais simples de fazer as coisas. Não há necessidade de configuração do cliente, + você pode isentar qualquer host/sub-rede de usar o proxy sem a necessidade de reconfiguração do cliente. Essa é a única maneira de você ter certeza de que tudo o que deveria passar pelo proxy, sim.
Qualquer método diferente de bloquear todo o tráfego HTTPS 443 de saída e permitir apenas um subconjunto de sites com base no IP permitido para a porta de saída 443 não funcionará conforme o esperado. O protocolo seguro HTTPS foi projetado (algumas falhas à parte) para evitar ataques Man-In-The-Middle (os proxies SÃO MITM "legais"). Dessa forma, o HTTPS pode fazer o que foi projetado para fazer. Se, no entanto, você quiserIGNORARHTTPS, você deve configurar seu squid para usar DIRECT e não usar CONNECT (toque), mas mesmo se for esse o caso, você ainda pode encontrar sites problemáticos com partes HTTP/HTTPS mistas. Dessa forma, seu proxy Squid também gerenciará HTTPS. Isso também deve se refletir na parte de encaminhamento transparente do seu firewall.
Responder2
Sempre que você perceber que algo que deveria funcionar não está funcionando, você precisa perguntar se há algum outro fator envolvido que você não está vendo. A regra
sudo iptables -A INPUT -p tcp ! --dport 8080 -j REJECT
Parece que deveria funcionar, mas você temanexadopara a cadeia INPUT, portanto provavelmente foi contornado por uma regra anterior na cadeia. Esta regra deve ser adequada por si só, já que a cadeia INPUT é a primeira cadeia que os pacotes recebidos atingem. Se forem REJEITADOS na cadeia INPUT, eles nunca chegarão às cadeias FORWARD ou OUTPUT. Claro, esta regra irá bloqueartudoTCP que não é destinado à porta 8080, o que provavelmente não é o que você realmente deseja, a menos que o proxy em 8080 seja o único serviço na máquina e você faça login apenas no console.
Então a primeira coisa a fazer é listar as regras e procurar o que pode estar causando a passagem dos pacotes:
sudo iptables -L
Se o seu firewall for NAT reverso, você também deverá listar a tabela NAT.
sudo iptables -L -t nat
Depois, tente colocar a mesma regra nocomeçoda cadeia:
sudo iptables -I INPUT -p tcp ! --dport 8080 -j REJECT
e veja se isso não resolve o problema, ou pelo menos lhe dá mais confiança de que você entende como iptables
funciona para poder completar seu conjunto de regras. Se você estiver trabalhando neste host remotamente, minha sugestão irá interrompê-lo, então você deve fazer isso apenas no console. Para trabalhar com segurança remotamente, consulte meu colegaPostagem de Eli Rosencruft sobre como ajustar firewalls remotamente.
Responder3
Padrão
Uma cadeia separada (definida pelo usuário) pode ajudar.
# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100
# redirect all traffic FROM user 100 to custom chain
iptables -A INPUT -p tcp -s 192.168.1.100 -j custom_user_100
# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP
Então - o que isso faz é redirecionar qualquer tráfego DE 192.168.1.100 para uma cadeia personalizada. Esta cadeia personalizada (definida pelo usuário) retorna apenas se uma correspondência válida for encontrada (tráfego destinado à porta 8080). Todo o outro tráfego não correspondente que não resulta em retorno da cadeia éderrubado.
Posteriormente você poderá visualizar as estatísticas das tabelas para verificar se foi isso que aconteceu:
iptables -L -v -n
Encaminhamento
Agora, caso você esteja processando o tráfego de encaminhamento, haverá um conjunto diferente de regras - mas a ideia de usar uma cadeia personalizada (definida pelo usuário) é a mesma. Gosto de consultar o diagrama neste link:http://www.csie.ntu.edu.tw/~b93070/CNL/v4.0/CNLv4.0.files/Page697.htmao tentar entender o fluxo de pacotes.
Nesse caso, você pode querer fazer algo como o seguinte:
# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100
# redirect all traffic FROM user 100 to custom chain
iptables -A FORWARD -p tcp -s 192.168.1.100 -j custom_user_100
# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP
Isto é idêntico ao primeiro, exceto que a regra que foi aplicada à cadeia INPUT é, em vez disso, aplicada à cadeia FORWARD.
Atualização 24/05/2013
Eu reli sua pergunta. Então vai recomeçar.
Vamos supor que seu “proxy” seja na verdade um roteador. Isto é - ele está passando todos os pacotes de uma interface para outra - talvez usando NAT. Isso significa que todos os pacotes de interesse estão fluindo pela cadeia FORWARD.
Próximo: você diz que configurará todos os clientes usando a porta 8080 para acessar o próprio proxy. Multar. Isto significa que todosaquelesos pacotes entrarão no "proxy" através da cadeia INPUT.
Então: você só quer evitar que alguém saia pela porta 8080 na cadeia FORWARD.
iptables -A FORWARD -p tcp --dport 8080 -j REJECT
Esta regra garantirá que tudo o que for encaminhado para uma porta de destino 8080 será rejeitado (um pacote ICMP será enviado ao cliente que tentou passar o pacote através do proxy).
Depois de implementar esta regra, é VITAL que você teste isso tentando fazer uma conexão proibida - então você lista as regras digitando:
iptables -L -v -n |grep 8080
e certifique-se de que o contador aumentou. Caso contrário, algo está errado com a configuração do roteador.
Responder4
Se você não deseja que seus clientes acessem apenas sites http{s} sem o proxy, você pode apenas DROP
encaminhar REJECT
pacotes para as portas 80 e 443:
IPTABLES -I FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -j REJECT
Onde eth1
está sua interface interna. Fazendo desta forma você não terá que mexer em outras portas/acessos.