Noções básicas de proxy transparente usando 3proxy e iptables/netfilter ou como “colocar tudo através de um proxy”

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 bgp.he.net/net/208.85.40.0/24#_netinfo
Pode-se observar que a sub-rede que procuro é AS40428 Pandora Media, Inc

bgp.he.net/net/208.85.40.0/24#_netinfo

Abrindo prefixos v4

bgp.he.net/AS40428#_prefixes

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 ip-calculator.ru/agregado e copie nossa lista lá. Como resultado - 6 sub-redes em vez de 14.

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 3proxy.ru

2. Instruções para instalar o 3proxy da fonte www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Ramo de desenvolvimento 3proxy no GitHub github.com/z3APA3A/3proxy/issues/274

Fonte: habr.com

Adicionar um comentário