Isso só funciona na única máquina, porque depende do proxy transparente poder interagir com iptables
e obter o IP de destino original do tráfego de saída.
Observe também que esse método é um pouco hacky, no sentido de que para superar um problema de loop infinito (redirecionando para proxy - > redirecionando para proxy - > ...), as regras de firewall são aplicadas a uma operação grupo de usuários do sistema, o que significa que qualquer usuário que não esteja no grupo não obterá o tráfego de saída encaminhado por meio do proxy.
Etapas:
- Crie um novo grupo de usuários do sistema operacional chamado proxy
- Adicione todos os usuários do sistema operacional (exceto root!) a este novo grupo
- Obtenha o id do grupo proxy e lembre-se dele para mais tarde
- Configure um servidor proxy transparente de algum tipo que possa aceitar o (s) protocolo (s) que você deseja fazer proxy e possa interagir com
iptables
. Eu useimitmproxy
(que é baseado em Python) e configure-o para ser executado como um serviço de root e escute em proxyPort . -
Adicione uma regra a
iptables
para redirecionar todo o tráfego de saída destinado a uma determinada porta (por exemplo, http) para 127.0.0.1: proxyPort , da seguinte forma:iptables -t nat -A OUTPUT -m owner --gid-owner proxyGID -p tcp --dport 80 -j DNAT --to 127.0.0.1:proxyPort
, substituindo proxyGID e proxyPort de forma adequada - Configure
iptables
ouufw
para permitir tráfego de saída para proxyPort , permitir que qualquer porta seja intermediada por proxy (por exemplo, 80) e proibir todos os outros por padrão. - Configure seu proxy transparente para deixar as solicitações da maneira que quiser. Para responder a essa pergunta, você deve configurar o proxy para executar um DNS reverso no IP de destino original e verificar se o domínio resultante está em uma lista branca pré-configurada, caso contrário, o tráfego deverá ser eliminado.