Noções básicas de proxy transparente usando 3proxy e iptables / netfilter ou como "deixar tudo passar por um proxy"

Neste artigo, gostaria de revelar as possibilidades de proxy transparente, o que permite redirecionar todo ou parte do tráfego através de servidores proxy externos de maneira absolutamente imperceptível.

Quando comecei a resolver esse problema, fui confrontado com o fato de sua implementação ter um problema significativo - o protocolo HTTPS. Nos bons e velhos tempos, não havia problemas especiais com o proxy HTTP transparente, mas ao fazer o proxy HTTPS, os navegadores relatam interferência no protocolo, e é aí que a felicidade termina.

Em instruções comuns para o servidor proxy, o Squid se oferece para gerar seu próprio certificado e instalá-lo para clientes, o que é um absurdo completo, pelo menos irracional e parece um ataque MITM. Eu sei que o Squid já sabe como fazer algo assim, mas este artigo é sobre uma maneira comprovada e funcional de usar o 3proxy do respeitado 3APA3A.

A seguir, consideraremos em detalhes o processo de criação do 3proxy a partir da fonte, sua configuração, proxy completo e seletivo usando NAT, distribuição de canais para vários servidores proxy externos, bem como o uso de um roteador e rotas estáticas. Usamos o Debian 9 x64 como sistema operacional. Vamos começar!

Instale o 3proxy e inicie um servidor proxy regular


1. Instale o ifconfig (do pacote net-tools)
apt-get install net-tools
2. Instale o Midnigth Commander
apt-get install mc
3. Agora temos 2 interfaces:
enp0s3 - externo, procura na Internet
enp0s8 - interno, deve procurar em uma rede local
Em outras distribuições baseadas no Debian, as interfaces são geralmente chamadas de eth0 e eth1.
ifconfig -a

Interfaces
enp0s3: flags = 4163 <UP, TRANSMISSÃO, EXECUÇÃO MULTICAST> mtu 1500
inet 192.168.23.11 máscara de rede 255.255.255.0 broadcast 192.168.23.255
inet6 fe80 :: a00: 27ff: fec2: ba4 prefixo 64 escopo 0x20 éter 08: 00: 27: c2: ba: e4 txqueuelen 1000 (Ethernet)
Pacotes RX 6412 bytes 8676619 (8,2 MiB)
Erros RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 1726 bytes 289128 (282,3 KiB)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0

enp0s8: flags = 4098 <BROADCAST, MULTICAST> mtu 1500
éter 08: 00: 27: 79: a7: e3 txqueuelen 1000 (Ethernet)
Pacotes RX 0 bytes 0 (0,0 B)
Erros RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 0 bytes 0 (0,0 B)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0

lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 máscara de rede 255.0.0.0
inet6 :: 1 prefixo 128 escopo 0x loop txqueuelen 1 (loop local)
Pacotes RX 0 bytes 0 (0,0 B)
Erros RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 0 bytes 0 (0,0 B)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0

A interface enp0s8 não está sendo usada no momento, vamos ativá-la quando quisermos usar a configuração Proxy NAT ou NAT. É lógico atribuir um IP estático a ele.

4. Prossiga para instalar o 3proxy

4.1 Instalando pacotes básicos para compilar 3proxy a partir do código-fonte

root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y

4.2 Crie uma pasta para baixar o arquivo com a fonte

root@debian9:~# mkdir -p /opt/proxy

4.3 Vamos para esta pasta

root@debian9:~# cd /opt/proxy


4.4 Agora baixe o pacote 3proxy mais recente. No momento da redação deste artigo, a versão estável mais recente era 0.8.12 (18/04/2018) Faça o download no site oficial da 3proxy

root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz


4.5 Descompacte o arquivo baixado

root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz

4.6 Vá para o diretório descompactado para criar o programa

root@debian9:/opt/proxy# cd 3proxy-0.8.12

4.7 Em seguida, você precisa adicionar uma linha ao arquivo de cabeçalho para que nosso servidor fique completamente anônimo (realmente funciona, tudo está verificado, os clientes IP ficam ocultos)

root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h

Adicione uma linha

#define ANONYMOUS 1

Pressione Ctrl + xe Enter para salvar as alterações.

4.8 Vamos construir o programa

root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux

Makelog
make [2]: Deixando o diretório '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make [1]: Deixando o diretório '/opt/proxy/3proxy-0.8.12/src'

Sem erros, continue.

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 está 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 Crie 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 em que a configuração deve ser

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.conf
daemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 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
logformat "- + _L% t.%.% N.% p% E% U% C:% c% R:% r% O% I% h% T"
rodar 3
auth forte
nivelar
permitir testador
meias -p3128
proxy -p8080

Para salvar, pressione Ctrl + Z

4.14 Crie um arquivo pid para que não haja erros na inicialização.

root@debian9:/home/joke/proxy# cat > 3proxy.pid

Para salvar, pressione Ctrl + Z

4.15 Inicie um 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

log netstat
Conexões ativas da Internet (apenas servidores)
Proto Recv-Q Send-Q Endereço Local Endereço Externo Estado PID / Nome do Programa
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 504 / 3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUTE 338 / sshd
tcp 0 0 0.0.0.0lla128 0.0.0.0:* OUVIR 504 / 3proxy
tcp6 0 0 ::: 22 ::: * ESCUTE 338 / sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352 / dhclient

Como foi escrito na configuração, o proxy da Web escuta a porta 8080 e o proxy Socks5 escuta 3128.

4.17 Para iniciar o serviço de proxy após a reinicialização, adicione-o ao cron.

root@debian9:/home/joke/proxy# crontab -e

Adicione uma linha

@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf

Pressione Enter, pois o cron deverá exibir 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 Reiniciaremos o sistema e tentaremos conectar através do navegador ao proxy. Para verificação, usamos o navegador Firefox (para proxy da web) e o complemento FoxyProxy para socks5 com autenticação.

root@debian9:/home/joke/proxy# reboot

4.19 Após verificar o proxy após a reinicialização, você pode ver os logs. Isso completa a configuração do proxy.

3 log de proxy
1542573996.018 PROXY.8080 00000 testador 192.168.23.10:50915 217.12.15.54ced43 1193 6939 0 CONNECT_ads.yahoo.com:443_HTTP/1.1
1542574289.634 SOCK5.3128 00000 testador 192.168.23.10/101193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443

Configurar e executar a configuração NAT do Proxy Transparente


Nesta configuração, todos os dispositivos na rede interna funcionarã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 vários servidores (realmente expandindo a largura do canal, exemplo de configuração nº 2!). O DNS usará os recursos do 3proxy (dnspr). O UDP não sairá porque ainda não usamos o mecanismo de encaminhamento (desativado por padrão no kernel do Linux).

1. Chegou a hora de ativar a interface enp0s8

root@debian9:~# nano /etc/network/interfaces

arquivo / etc / network / interfaces
# Este arquivo descreve as interfaces de rede disponíveis no seu sistema
# e como ativá-los. Para mais informações, consulte interfaces (5).

origem /etc/network/interfaces.d/*

# A interface de rede de loopback
auto lo
iface lo inet loopback

# A interface de rede principal
allow-hotplug enp0s3
iface enp0s3 inet dhcp

# A interface de rede secundária
allow-hotplug enp0s8
iface enp0s8 inet static
endereço 192.168.201.254
máscara de rede 255.255.255.0

Aqui, atribuímos o endereço estático 192.168.201.254 e mascaramos 255.255.255.0 à interface enp0s8
Salve a configuração Ctrl + X e reinicie

root@debian9:~# reboot

2. Verificando as interfaces

root@debian9:~# ifconfig

log ifconfig
enp0s3: flags = 4163 <UP, TRANSMISSÃO, EXECUÇÃO MULTICAST> mtu 1500
inet 192.168.23.11 máscara de rede 255.255.255.0 broadcast 192.168.23.255
inet6 fe80 :: a00: 27ff: fec2: ba4 prefixo 64 escopo 0x20 éter 08: 00: 27: c2: ba: e4 txqueuelen 1000 (Ethernet)
Pacotes RX 61 bytes 7873 (7,6 KiB)
Erros RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 65 bytes 10917 (10,6 KiB)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0

enp0s8: flags = 4163 <UP, TRANSMISSÃO, EXECUÇÃO MULTICAST> mtu 1500
inet 192.168.201.254 máscara de rede 255.255.255.0 transmitida 192.168.201.255
inet6 fe80 :: a00: 27ff: fe79: a7e3 prefixo 64 escopo 0x20 éter 08: 00: 27: 79: a7: e3 txqueuelen 1000 (Ethernet)
Pacotes RX 0 bytes 0 (0,0 B)
Erros RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 8 bytes 648 (648,0 B)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0

lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 máscara de rede 255.0.0.0
inet6 :: 1 prefixo 128 escopo 0x loop txqueuelen 1 (loop local)
Pacotes RX 0 bytes 0 (0,0 B)
Erros RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 0 bytes 0 (0,0 B)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0

3. Tudo acabou, agora você precisa configurar o 3proxy para proxying transparente.

root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf


Exemplo de configuração do servidor proxy transparente nº 1
daemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
tempos limite 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
logformat "- + _L% t.%.% N.% p% E% U% C:% c% R:% r% O% I% h% T"
rodar 3
nivelar
auth iponly
dnspr
permitir *
pai 1000 meias5 IP_EXTERNAL_PROXY 3128 testador 1234
plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so transparent_plugin
tcppm -i0.0.0.0 888 127.0.0.1 11111

4. Agora execute o 3proxy com a nova configuração
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Adicione o 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


log netstat
Conexões ativas da Internet (apenas servidores)
Proto Recv-Q Send-Q Endereço Local Endereço Externo Estado PID / Nome do Programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* OUVIR 349 ​​/ sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* OUVIR 354 / 3proxy
tcp6 0 0 ::: 22 ::: * LISTEN 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 qualquer conexão TCP na porta 888, DNS na porta 53, para que eles possam ser redirecionados para as peúgas remotas5 - proxy e Google DNS 8.8.8.8. Resta configurar as regras netfilter (iptables) e DHCP para emitir endereços.

8. Instale o pacote iptables-persistent e o dhcpd

root@debian9:~# apt-get install iptables-persistent isc-dhcp-server

9. Edite o arquivo de inicialização dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf

dhcpd.conf
# dhcpd.conf
#
# Arquivo de configuração de amostra para ISC dhcpd
#

# definições de opções comuns a todas as redes suportadas ...
opção nome do domínio "example.org";
opção domain-name-servers ns1.example.org, ns2.example.org;

tempo de concessã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
# network, a diretiva autoritativa deve ser descomentada.

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 domain-name-servers 192.168.201.254;
roteadores de opções 192.168.201.254;
opção de endereço de transmissão 192.168.201.255;
tempo de concessão padrão 600;
tempo máximo de locação 7200;
}

11. Reinicialize e verifique o serviço na porta 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp


log netstat
Conexões ativas da Internet (apenas servidores)
Proto Recv-Q Send-Q Endereço Local Endereço Externo Estado PID / Nome do Programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 389 / sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* OUVIR 310 / 3proxy
tcp6 0 0 ::: 22 ::: * LISTEN 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 valor 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 da web, em vez de socks5, será necessário escrever connect, se socks4 e socks4 (socks4 NÃO SUPORTA A AUTORIZAÇÃO DE LOGIN / SENHA!)

Exemplo de configuração transparente do servidor proxy nº 2
daemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
maxconn 500
tempos limite 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
logformat "- + _L% t.%.% N.% p% E% U% C:% c% R:% r% O% I% h% T"
rodar 3
nivelar
auth iponly
dnspr
permitir *

pai 200 meias5 IP_EXT_EXT_PROXY # 1 3128 testador 1234
pai 200 meias5 IP_EXT_EXT_PROXY # 2 3128 testador 1234
pai 200 meias5 IP_EXT_EXT_PROXY # 3 3128 testador 1234
pai 200 meias5 IP_EXT_EXT_PROXY # 4 3128 testador 1234
pai 100 meias5 IP_EXT_EXT_PROXY # 5 3128 testador 1234
pai 100 meias5 IP_EXT_EXT_PROXY # 6 3128 testador 1234

plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so transparent_plugin
tcppm -i0.0.0.0 888 127.0.0.1 11111

Configurar e executar a configuração NAT + Proxy Transparente


Nesta configuração, usaremos o mecanismo NAT usual com proxying transparente seletivo ou total de endereços ou sub-redes individuais. Os usuários da rede interna trabalharão com determinados serviços / sub-redes, mesmo sem perceber que eles funcionam através de um proxy. Todas as conexões https funcionam bem, nenhum certificado precisa ser gerado / substituído.

Primeiro, decidimos quais sub-redes / serviços queremos proxy. Suponha que proxies externos estejam localizados onde um serviço como o pandora.com está sendo executado. Agora resta determinar sua sub-rede / endereço.

1. Ping

root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56 (84) bytes de dados.

2. Digitamos no Google BGP 208.85.40.20

Acesse o site bgp.he.net/net/208.85.40.0/24#_netinfo
Você pode ver que estou procurando a sub-rede AS40428 Pandora Media, Inc

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

Prefixos v4 abertos

bgp.he.net/AS40428#_prefixes

Aqui estão as sub-redes desejadas!

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, a agregação deve ser realizada. Vá para ip-calculator.ru/aggregate 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. Regras claras de iptables

root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X


Ativar 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 que o encaminhamento esteja sempre ativado após a reinicialização, altere o arquivo

root@debian9:~# nano /etc/sysctl.conf

E descomente a linha

net.ipv4.ip_forward = 1

Ctrl + X para salvar o arquivo

5. Enrolamos as sub-redes pandora.com no 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. Salve as regras

root@debian9:~# iptables-save > /etc/iptables/rules.v4

Configurar e executar o Proxy transparente via configuração do roteador


Nessa configuração, o servidor proxy transparente pode ser um PC separado ou uma máquina virtual atrás de um roteador doméstico / corporativo. É suficiente registrar rotas estáticas no roteador ou nos dispositivos e toda a sub-rede usará proxies sem a necessidade de configurações adicionais.

IMPORTANTE! É necessário que nosso gateway receba um IP estático do roteador ou seja configurado para a própria estática.

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 no seu sistema
# e como ativá-los. Para mais informações, consulte interfaces (5).

origem /etc/network/interfaces.d/*

# A interface de rede de loopback
auto lo
iface lo inet loopback

# A interface de rede principal
allow-hotplug enp0s3
iface enp0s3 inet static
endereço 192.168.23.2
máscara de rede 255.255.255.0
gateway 192.168.23.254

# A interface de rede secundária
allow-hotplug enp0s8
iface enp0s8 inet static
endereço 192.168.201.254
máscara de rede 255.255.255.0

2. Permita que os 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. Salve as regras
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Registraremos as sub-redes no roteador

Lista de redes do roteador
199.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 Utilizados


1. O site oficial do programa 3proxy 3proxy.ru

2. Instruções de instalação do 3proxy da fonte www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Ramificação do desenvolvedor 3proxy no github github.com/z3APA3A/3proxy/issues/274

Source: https://habr.com/ru/post/pt460469/


All Articles