Neste artigo gostaria de revelar as possibilidades do proxy transparente, que permite redirecionar todo ou parte do tráfego através de servidores proxy externos de forma absolutamente despercebida pelos clientes.
Quando comecei a resolver esse problema, me deparei com o fato de que sua implementação apresentava um problema significativo - o protocolo HTTPS. Antigamente, não havia problemas especiais com o proxy HTTP transparente, mas com o proxy HTTPS, os navegadores relatam interferência no protocolo e é aí que a felicidade termina.
Nas instruções comuns do servidor proxy Squid, eles até sugerem gerar seu próprio certificado e instalá-lo nos clientes, o que é, no mínimo, um absurdo completo, irracional e parece um ataque MITM. Eu sei que o Squid já pode fazer algo semelhante, mas este artigo é sobre um método comprovado e funcional usando 3proxy do respeitado 3APA3A.
A seguir, veremos detalhadamente o processo de construção do 3proxy a partir da fonte, sua configuração, proxy completo e seletivo usando NAT, distribuição de canais para diversos servidores proxy externos, bem como o uso de roteador e rotas estáticas. Usamos Debian 9 x64 como sistema operacional. Começar!
Instalando 3proxy e executando um servidor proxy normal
1. Instale ifconfig (do pacote net-tools)
apt-get install net-tools
2. Instale o Comandante da Meia-Noite
apt-get install mc
3. Agora temos 2 interfaces:
enp0s3 - externo, olha na Internet
enp0s8 - interno, deve procurar na rede local
Em outras distribuições baseadas em Debian, as interfaces são geralmente denominadas eth0 e eth1.
ifconfig -a
Interfacesenp0s3: sinalizadores=4163 mtu 1500
inet 192.168.23.11 máscara de rede 255.255.255.0 transmissão 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 éter 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Pacotes RX 6412 bytes 8676619 (8.2 MiB)
Erros de RX 0 descartados 0 overruns 0 frame 0
Pacotes TX 1726 bytes 289128 (282.3 KiB)
Erros de TX 0 descartados 0 overruns 0 portadora 0 colisões 0
enp0s8: sinalizadores = 4098 mtu 1500
éter 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Pacotes RX 0 bytes 0 (0.0 B)
Erros de RX 0 descartados 0 overruns 0 frame 0
Pacotes TX 0 bytes 0 (0.0 B)
Erros de TX 0 descartados 0 overruns 0 portadora 0 colisões 0
lo: sinalizadores = 73 mtu 65536
inet 127.0.0.1 máscara de rede 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (loopback local)
Pacotes RX 0 bytes 0 (0.0 B)
Erros de RX 0 descartados 0 overruns 0 frame 0
Pacotes TX 0 bytes 0 (0.0 B)
Erros de TX 0 descartados 0 overruns 0 portadora 0 colisões 0
A interface enp0s8 não é usada atualmente, iremos habilitá-la quando quisermos usar a configuração Proxy NAT ou NAT. É então que seria lógico atribuir-lhe um IP estático.
4. Vamos começar a instalar o 3proxy
4.1 Instalando pacotes básicos para compilar 3proxy a partir de fontes
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Vamos criar uma pasta para baixar o arquivo com fontes
root@debian9:~# mkdir -p /opt/proxy
4.3. Vamos para esta pasta
root@debian9:~# cd /opt/proxy
4.4. Agora vamos baixar o pacote 3proxy mais recente. No momento em que este artigo foi escrito, a versão estável mais recente era 0.8.12 (18/04/2018). Baixe-a no site oficial do 3proxy
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. Vamos descompactar o arquivo baixado
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Vá para o diretório descompactado para construir o programa
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. Em seguida, precisamos adicionar uma linha ao arquivo de cabeçalho para que nosso servidor fique completamente anônimo (realmente funciona, tudo está verificado, os IPs dos clientes ficam ocultos)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Adicione uma linha
#define ANONYMOUS 1
Pressione Ctrl+x e Enter para salvar as alterações.
4.8. Vamos começar a montar o programa
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
Makelogmake[2]: Saindo do diretório '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Saindo do diretório '/opt/proxy/3proxy-0.8.12/src'
Sem erros, vamos continuar.
4.9. Instale o programa no sistema
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Vá para o diretório raiz e verifique onde o programa foi instalado
root@debian9:/opt/proxy/3proxy-0.8.12# cd ~/
root@debian9:~# whereis 3proxy
3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy
4.11. Vamos criar uma pasta para arquivos de configuração e logs no diretório inicial do usuário
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. Vá para o diretório onde a configuração deve estar
root@debian9:~# cd /home/joke/proxy/
4.13. Crie um arquivo vazio e copie a configuração lá
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.confdemônio
pidfile /home/joke/proxy/3proxy.pid
servidor n 8.8.8.8
cache 65536
testador de usuários:CL:1234
tempos limite 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
formato de log "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
girar 3
autenticação forte
rubor
permitir testador
meias -p3128
proxy -p8080
Para salvar, pressione Ctrl + Z
4.14. Vamos criar um arquivo pid para que não haja erros durante a inicialização.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
Para salvar, pressione Ctrl + Z
4.15. Vamos iniciar o servidor proxy!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. Vamos ver se o servidor está escutando nas portas
root@debian9:~/home/joke/proxy# netstat -nlp
registro netstatConexões de Internet ativas (somente servidores)
Proto Recv-Q Send-Q Endereço local Endereço estrangeiro Estado PID/Nome do programa
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ESCUTE 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUTE 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* ESCUTE 504/3proxy
tcp6 0 0 :::22 :::* ESCUTE 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient
Conforme foi escrito na configuração, nosso proxy web escuta na porta 8080, o proxy Socks5 escuta na porta 3128.
4.17. Para iniciar automaticamente o serviço de proxy após uma reinicialização, você precisa adicioná-lo ao cron.
root@debian9:/home/joke/proxy# crontab -e
Adicione uma linha
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Pressionamos Enter, pois o cron deve ver o caractere de fim de linha e salvar o arquivo.
Deve haver uma mensagem sobre a instalação de um novo crontab.
crontab: instalando o novo crontab
4.18. Vamos reiniciar o sistema e tentar conectar-se ao proxy através do navegador. Para verificar, usamos o navegador Firefox (para proxy web) e o complemento FoxyProxy para meias5 com autenticação.
root@debian9:/home/joke/proxy# reboot
4.19. Depois de verificar a operação do proxy após uma reinicialização, você pode visualizar os logs. Isso conclui a configuração do servidor proxy.
3 registros de proxy1542573996.018 PROXY.8080 00000 testador 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com:443_HTTP/1.1
1542574289.634 SOCK5.3128 00000 testador 192.168.23.10:51193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443
Configurando e executando a configuração do Transparent Proxy NAT
Nesta configuração, todos os dispositivos da rede interna operarão de forma transparente na Internet através de um servidor proxy remoto. Absolutamente todas as conexões TCP serão redirecionadas para um ou mais servidores proxy (realmente expande a largura do canal, exemplo de configuração nº 2!). O serviço DNS usará recursos 3proxy (dnspr). O UDP não irá “ir” para fora, pois ainda não estamos usando o mecanismo de encaminhamento (desativado por padrão no kernel Linux).
1. É hora de habilitar a interface enp0s8
root@debian9:~# nano /etc/network/interfaces
arquivo /etc/network/interfaces# Este arquivo descreve as interfaces de rede disponíveis em seu sistema
# E como ativá-los. Para mais informações, consulte Interfaces (5).
fonte /etc/network/interfaces.d/*
# A interface de rede loopback
o carro
iface inet loopback eis
# A interface de rede primária
permitir-hotplug enp0s3
iface enp0s3 inet dhcp
# A interface de rede secundária
permitir-hotplug enp0s8
iface enp0s8 inet estático
endereço 192.168.201.254
máscara de rede 255.255.255.0
Aqui atribuímos à interface enp0s8 um endereço estático 192.168.201.254 e uma máscara 255.255.255.0
Salve a configuração Ctrl+X e reinicie
root@debian9:~# reboot
2. Verificando as interfaces
root@debian9:~# ifconfig
registro ifconfigenp0s3: sinalizadores=4163 mtu 1500
inet 192.168.23.11 máscara de rede 255.255.255.0 transmissão 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 éter 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Pacotes RX 61 bytes 7873 (7.6 KiB)
Erros de RX 0 descartados 0 overruns 0 frame 0
Pacotes TX 65 bytes 10917 (10.6 KiB)
Erros de TX 0 descartados 0 overruns 0 portadora 0 colisões 0
enp0s8: sinalizadores=4163 mtu 1500
inet 192.168.201.254 máscara de rede 255.255.255.0 transmissão 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 scopeid 0x20 éter 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Pacotes RX 0 bytes 0 (0.0 B)
Erros de RX 0 descartados 0 overruns 0 frame 0
Pacotes TX 8 bytes 648 (648.0 B)
Erros de TX 0 descartados 0 overruns 0 portadora 0 colisões 0
lo: sinalizadores = 73 mtu 65536
inet 127.0.0.1 máscara de rede 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (loopback local)
Pacotes RX 0 bytes 0 (0.0 B)
Erros de RX 0 descartados 0 overruns 0 frame 0
Pacotes TX 0 bytes 0 (0.0 B)
Erros de TX 0 descartados 0 overruns 0 portadora 0 colisões 0
3. Deu tudo certo, agora você precisa configurar o 3proxy para proxy transparente.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Exemplo de configuração de servidor proxy transparente nº 1demônio
pidfile /home/joke/proxy/3proxy.pid
servidor n 8.8.8.8
cache 65536
tempos limite 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
formato de log "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
girar 3
rubor
autenticação iponly
dnspr
permitir *
pai 1000 meias5 IP_ADDRESS OF EXTERNAL_PROXY 3128 testador 1234
plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so transparente_plugin
tcppm -i0.0.0.0 888 127.0.0.1 11111
4. Agora lançamos o 3proxy com a nova configuração
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Adicione ao crontab novamente
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Vamos ver o que nosso proxy está ouvindo agora
root@debian9:~# netstat -nlp
registro netstatConexões de Internet ativas (somente servidores)
Proto Recv-Q Send-Q Endereço local Endereço estrangeiro Estado PID/Nome do programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUTE 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCUTE 354/3proxy
tcp6 0 0 :::22 :::* ESCUTE 349/sshd
udp 0 0 0.0.0.0:53 0.0.0.0:* 354/3proxy
udp 0 0 0.0.0.0:68 0.0.0.0:* 367/dhclient
7. Agora o proxy está pronto para aceitar quaisquer conexões TCP na porta 888, DNS na porta 53, para que possam ser redirecionadas para o proxy Socks5 remoto e DNS Google 8.8.8.8. Tudo o que precisamos fazer é configurar o netfilter (iptables) e as regras DHCP para emissão de endereços.
8. Instale o pacote iptables-persistent e dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Edite o arquivo de inicialização do dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf
dhcpd.conf#dhcpd.conf
#
# Exemplo de arquivo de configuração para ISC dhcpd
#
# definições de opções comuns a todas as redes suportadas…
opção nome de domínio "example.org";
opção de servidores de nomes de domínio ns1.example.org, ns2.example.org;
tempo de locação padrão 600;
tempo máximo de locação 7200;
ddns-update-style nenhum;
# Se este servidor DHCP for o servidor DHCP oficial para o local
# rede, a diretiva oficial não deve ser comentada.
autoritário;
# Uma configuração ligeiramente diferente para uma sub-rede interna.
sub-rede 192.168.201.0 máscara de rede 255.255.255.0 {
intervalo 192.168.201.10 192.168.201.250;
opção de servidores de nomes de domínio 192.168.201.254;
roteadores de opção 192.168.201.254;
opção de endereço de transmissão 192.168.201.255;
tempo de locação padrão 600;
tempo máximo de locação 7200;
}
11. Reinicie e verifique o serviço na porta 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp
registro netstatConexões de Internet ativas (somente servidores)
Proto Recv-Q Send-Q Endereço local Endereço estrangeiro Estado PID/Nome do programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUTE 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCUTE 310/3proxy
tcp6 0 0 :::22 :::* ESCUTE 389/sshd
udp 0 0 0.0.0.0:20364 0.0.0.0:* 393/dhcpd
udp 0 0 0.0.0.0:53 0.0.0.0:* 310/3proxy
udp 0 0 0.0.0.0:67 0.0.0.0:* 393/dhcpd
udp 0 0 0.0.0.0:68 0.0.0.0:* 405/dhclient
udp6 0 0 :::31728 :::* 393/dhcpd
bruto 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd
12. Resta redirecionar todas as solicitações TCP para a porta 888 e salvar a regra no iptables
root@debian9:~# iptables -t nat -A PREROUTING -s 192.168.201.0/24 -p tcp -j REDIRECT --to-ports 888
root@debian9:~# iptables-save > /etc/iptables/rules.v4
13. Para expandir a largura de banda do canal, você pode usar vários servidores proxy ao mesmo tempo. O total deve ser 1000. Novas conexões são estabelecidas com uma probabilidade de 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 para os servidores proxy especificados.
Nota: se tivermos um proxy web, então em vez de Socks5 precisamos escrever Connect, se Socks4, então Socks4 (Socks4 NÃO SUPORTA AUTORIZAÇÃO DE LOGIN/SENHA!)
Exemplo de configuração de servidor proxy transparente nº 2demônio
pidfile /home/joke/proxy/3proxy.pid
servidor n 8.8.8.8
cache 65536
maxconn 500
tempos limite 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
formato de log "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
girar 3
rubor
autenticação iponly
dnspr
permitir *
pai 200 meias5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 testador 1234
pai 200 meias5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 testador 1234
pai 200 meias5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 testador 1234
pai 200 meias5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 testador 1234
pai 100 meias5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 testador 1234
pai 100 meias5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 testador 1234
plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so transparente_plugin
tcppm -i0.0.0.0 888 127.0.0.1 11111
Configurando e executando a configuração NAT + Transparent Proxy
Nesta configuração, usaremos o mecanismo NAT usual com proxy seletivo ou totalmente transparente de endereços ou sub-redes individuais. Os usuários da rede interna trabalharão com determinados serviços/sub-redes sem sequer perceberem que estão trabalhando por meio de um proxy. Todas as conexões https funcionam bem, nenhum certificado precisa ser gerado/substituído.
Primeiro, vamos decidir quais sub-redes/serviços queremos usar como proxy. Vamos supor que os proxies externos estejam localizados onde opera um serviço como o pandora.com. Agora resta determinar suas sub-redes/endereços.
1. Pingar
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes de dados.
2. Digite BGP 208.85.40.20 no Google
Vá para o site
Pode-se observar que a sub-rede que procuro é AS40428 Pandora Media, Inc
Abrindo prefixos v4
Aqui estão as sub-redes necessárias!
199.116.161.0/24
199.116.162.0/24
199.116.164.0/23
199.116.164.0/24
199.116.165.0/24
208.85.40.0/24
208.85.41.0/24
208.85.42.0/23
208.85.42.0/24
208.85.43.0/24
208.85.44.0/24
208.85.46.0/23
208.85.46.0/24
208.85.47.0/24
3. Para reduzir o número de sub-redes, é necessário realizar a agregação. Vá para o site
199.116.161.0/24
199.116.162.0/24
199.116.164.0/23
208.85.40.0/22
208.85.44.0/24
208.85.46.0/23
4. Limpe as regras do iptables
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Habilite o mecanismo de encaminhamento e NAT
root@debian9:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@debian9:~# iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
root@debian9:~# iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
root@debian9:~# iptables -t nat -A POSTROUTING -o enp0s3 -s 192.168.201.0/24 -j MASQUERADE
Para garantir que o encaminhamento seja habilitado permanentemente após uma reinicialização, vamos alterar o arquivo
root@debian9:~# nano /etc/sysctl.conf
E descomente a linha
net.ipv4.ip_forward = 1
Ctrl+X para salvar o arquivo
5. Envolvemos as sub-redes pandora.com em um proxy
root@debian9:~# iptables -t nat -A PREROUTING -s 192.168.201.0/24 -d 199.116.161.0/24,199.116.162.0/24,199.116.164.0/23,208.85.40.0/22,208.85.44.0/24,208.85.46.0/23 -p tcp -j REDIRECT --to-ports 888
6. Vamos manter as regras
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configurando e executando o Transparent Proxy por meio da configuração do roteador
Nesta configuração, o servidor proxy transparente pode ser um PC separado ou uma máquina virtual atrás de um roteador doméstico/corporativo. Basta registrar rotas estáticas no roteador ou dispositivos e toda a sub-rede utilizará um proxy sem a necessidade de configurações adicionais.
IMPORTANTE! É necessário que nosso gateway receba um IP estático do roteador, ou seja configurado para ser estático.
1. Configure um endereço de gateway estático (adaptador enp0s3)
root@debian9:~# nano /etc/network/interfaces
arquivo /etc/network/interfaces# Este arquivo descreve as interfaces de rede disponíveis em seu sistema
# E como ativá-los. Para mais informações, consulte Interfaces (5).
fonte /etc/network/interfaces.d/*
# A interface de rede loopback
o carro
iface inet loopback eis
# A interface de rede primária
permitir-hotplug enp0s3
iface enp0s3 inet estático
endereço 192.168.23.2
máscara de rede 255.255.255.0
192.168.23.254 portal
# A interface de rede secundária
permitir-hotplug enp0s8
iface enp0s8 inet estático
endereço 192.168.201.254
máscara de rede 255.255.255.0
2. Permitir que dispositivos da sub-rede 192.168.23.0/24 usem proxy
root@debian9:~# iptables -t nat -A PREROUTING -s 192.168.23.0/24 -d 199.116.161.0/24,199.116.162.0/24,199.116.164.0/23,208.85.40.0/22,208.85.44.0/24,208.85.46.0/23 -p tcp -j REDIRECT --to-ports 888
3. Vamos manter as regras
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Vamos cadastrar sub-redes no roteador
Lista de redes de roteadores199.116.161.0 255.255.255.0 192.168.23.2
199.116.162.0 255.255.255.0 192.168.23.2
199.116.164.0 255.255.254.0 192.168.23.2
208.85.40.0 255.255.252.0 192.168.23.2
208.85.44.0 255.255.255.0 192.168.23.2
208.85.46.0 255.255.254.0 192.168.23.2
Materiais/recursos usados
1. Site oficial do programa 3proxy
2. Instruções para instalar o 3proxy da fonte
3. Ramo de desenvolvimento 3proxy no GitHub
Fonte: habr.com