Neste artigo, gustaríame revelar as posibilidades de proxy transparente, que permite que os clientes pasen completamente desapercibidos para redirixir todo ou parte do tráfico a través de servidores proxy externos.
Cando comecei a resolver este problema, atopeime co feito de que a súa implementación ten un problema importante: o protocolo HTTPS. Nos bos tempos, non había problemas particulares co proxy HTTP transparente, pero co proxy HTTPS, os navegadores informan da interferencia do protocolo e aí termina a felicidade.
En instrucións comúns para o servidor proxy Squid, incluso ofrecen xerar o seu propio certificado e instalalo nos clientes, o que é unha tontería, polo menos irracional, e parece un ataque MITM. Sei que Squid xa sabe facer algo semellante, pero este artigo trata dun método de traballo comprobado que utiliza 3proxy do respectado 3APA3A.
A continuación, analizaremos detalladamente o proceso de construción de 3proxy desde a orixe, a súa configuración, o proxy completo e selectivo mediante NAT, a distribución da canle a varios servidores proxy externos, así como o uso dun enrutador e rutas estáticas. Usamos Debian 9 x64 como SO. Comeza!
Instalando 3proxy e executando un proxy normal
1. Instala ifconfig (do paquete net-tools)
apt-get install net-tools
2. Instala Midnight Commander
apt-get install mc
3. Agora temos 2 interfaces:
enp0s3 - externo, mira a Internet
enp0s8 - interno, debe buscar na rede local
Noutras distribucións baseadas en Debian, as interfaces adoitan chamarse eth0 e eth1.
ifconfig -a
Interfacesenp0s3: bandeiras=4163 mtu 1500
inet 192.168.23.11 máscara de rede 255.255.255.0 emisión 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Paquetes RX 6412 bytes 8676619 (8.2 MiB)
Erros de RX 0 caídos 0 desbordamentos 0 fotogramas 0
Paquetes TX 1726 bytes 289128 (282.3 KiB)
Erros de TX 0 caídos 0 desbordamentos 0 operador 0 colisións 0
enp0s8: bandeiras=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Paquetes RX 0 bytes 0 (0.0 B)
Erros de RX 0 caídos 0 desbordamentos 0 fotogramas 0
Paquetes TX 0 bytes 0 (0.0 B)
Erros de TX 0 caídos 0 desbordamentos 0 operador 0 colisións 0
véxase: bandeiras=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)
Paquetes RX 0 bytes 0 (0.0 B)
Erros de RX 0 caídos 0 desbordamentos 0 fotogramas 0
Paquetes TX 0 bytes 0 (0.0 B)
Erros de TX 0 caídos 0 desbordamentos 0 operador 0 colisións 0
Actualmente non se utiliza a interface enp0s8, habilitarémola cando queiramos utilizar a configuración do proxy NAT ou NAT. É entón cando o lóxico sería asignarlle unha ip estática.
4. Comecemos a instalar 3proxy
4.1 Instalación de paquetes básicos para compilar 3proxy desde a fonte
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Crea un cartafol para descargar o arquivo coas fontes
root@debian9:~# mkdir -p /opt/proxy
4.3. Imos a este cartafol
root@debian9:~# cd /opt/proxy
4.4. Agora imos descargar o último paquete 3proxy. No momento de escribir este artigo, a última versión estable era a 0.8.12 (18/04/2018) Descárguea desde o sitio web oficial de 3proxy
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. Descomprimir o arquivo descargado
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Vaia ao directorio desempaquetado para construír o programa
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. A continuación, cómpre engadir unha liña ao ficheiro de cabeceira para que o noso servidor sexa completamente anónimo (realmente funciona, todo está comprobado, as ips do cliente están ocultas)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Engadindo unha liña
#define ANONYMOUS 1
Preme Ctrl+x e Intro para gardar os cambios.
4.8. Imos construír o programa
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
makelogmake[2]: saíndo do directorio '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: saíndo do directorio '/opt/proxy/3proxy-0.8.12/src'
Sen erros, continúa.
4.9. Instala o programa no sistema
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Vaia ao directorio raíz e comprobe onde se instalou o programa
root@debian9:/opt/proxy/3proxy-0.8.12# cd ~/
root@debian9:~# whereis 3proxy
3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy
4.11. Imos crear un cartafol para ficheiros de configuración e rexistros no directorio de inicio do usuario
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. Vaia ao directorio onde debería estar a configuración
root@debian9:~# cd /home/joke/proxy/
4.13. Crea un ficheiro baleiro e copia alí a configuración
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.confservizo
pidfile /home/joke/proxy/3proxy.pid
servidor 8.8.8.8
nscache 65536
Probador de usuario:CL:1234
tempo de espera 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
formato de rexistro "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
xirar 3
auth forte
a ras
permitir o probador
medias -p3128
proxy -p8080
Para gardar, preme Ctrl + Z
4.14. Imos crear un ficheiro pid para que non haxa erros de inicio.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
Para gardar, preme Ctrl + Z
4.15. Comecemos o servidor proxy!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. A ver se o servidor escoita nos portos
root@debian9:~/home/joke/proxy# netstat -nlp
rexistro de netstatConexións a Internet activas (só servidores)
Proto Recv-Q Enviar-Q Enderezo local Enderezo estranxeiro Estado PID/Nome do programa
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ESCOITAR 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCOITAR 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* ESCOITAR 504/3proxy
tcp6 0 0 :::22 :::* ESCOITAR 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient
Tal e como estaba escrito na configuración, o proxy web escoita no porto 8080, o proxy Socks5 - 3128.
4.17. Para iniciar automaticamente o servizo proxy despois dun reinicio, cómpre engadilo a cron.
root@debian9:/home/joke/proxy# crontab -e
Engadindo unha liña
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Prememos Intro, xa que cron debería ver o carácter de fin de liña e gardar o ficheiro.
Debería haber unha mensaxe sobre a instalación dun novo crontab.
crontab: instalando o novo crontab
4.18. Reiniciemos o sistema e intentemos conectarnos a través do navegador ao proxy. Para a verificación, usamos o navegador Firefox (para un proxy web) e o complemento FoxyProxy para socks5 con autenticación.
root@debian9:/home/joke/proxy# reboot
4.19. Despois de comprobar o traballo do proxy despois do reinicio, podes ver os rexistros. Isto completa a configuración do servidor proxy.
3 rexistro de proxy1542573996.018 PROXY.8080 00000 probador 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com:443_HT
1542574289.634 SOCK5.3128 00000 probador 192.168.23.10:51193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443
Configurar e executar a configuración NAT de proxy transparente
Nesta configuración, todos os dispositivos da rede interna funcionarán de forma transparente en Internet a través dun servidor proxy remoto. Absolutamente todas as conexións tcp serán redirixidas a un ou varios servidores proxy (realmente amplía o ancho da canle, exemplo de configuración número 2). O servizo DNS utilizará capacidades 3proxy (dnspr). UDP non "sará" fóra, xa que aínda non usamos o mecanismo de avance (desactivado por defecto no núcleo de Linux).
1. É hora de activar a interface enp0s8
root@debian9:~# nano /etc/network/interfaces
Ficheiro /etc/network/interfaces# Este ficheiro describe as interfaces de rede dispoñibles no seu sistema
# e como activalos. Para obter máis información, consulte interfaces(5).
fonte /etc/network/interfaces.d/*
# A interface de rede de loopback
caralo
iface lo inet loopback
# A interface de rede principal
allow-hotplug enp0s3
iface enp0s3 inet dhcp
# A interface de rede secundaria
allow-hotplug enp0s8
iface enp0s8 inet estático
enderezo 192.168.201.254
máscara de rede 255.255.255.0
Aquí asignámoslle á interface enp0s8 un enderezo estático 192.168.201.254 e unha máscara 255.255.255.0
Garda a configuración Ctrl+X e reinicia
root@debian9:~# reboot
2. Comprobación de interfaces
root@debian9:~# ifconfig
rexistro ifconfigenp0s3: bandeiras=4163 mtu 1500
inet 192.168.23.11 máscara de rede 255.255.255.0 emisión 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Paquetes RX 61 bytes 7873 (7.6 KiB)
Erros de RX 0 caídos 0 desbordamentos 0 fotogramas 0
Paquetes TX 65 bytes 10917 (10.6 KiB)
Erros de TX 0 caídos 0 desbordamentos 0 operador 0 colisións 0
enp0s8: bandeiras=4163 mtu 1500
inet 192.168.201.254 máscara de rede 255.255.255.0 emisión 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 scopeid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Paquetes RX 0 bytes 0 (0.0 B)
Erros de RX 0 caídos 0 desbordamentos 0 fotogramas 0
Paquetes TX 8 bytes 648 (648.0 B)
Erros de TX 0 caídos 0 desbordamentos 0 operador 0 colisións 0
véxase: bandeiras=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)
Paquetes RX 0 bytes 0 (0.0 B)
Erros de RX 0 caídos 0 desbordamentos 0 fotogramas 0
Paquetes TX 0 bytes 0 (0.0 B)
Erros de TX 0 caídos 0 desbordamentos 0 operador 0 colisións 0
3. Todo funcionou, agora cómpre configurar 3proxy para un proxy transparente.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Exemplo de configuración de proxy transparente #1servizo
pidfile /home/joke/proxy/3proxy.pid
servidor 8.8.8.8
nscache 65536
tempo de espera 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
formato de rexistro "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
xirar 3
a ras
auth de forma única
dnspr
permitir *
pai 1000 socks5 IP_ADDRESS_EXTERNAL_PROXY 3128 probador 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 executa 3proxy cunha nova configuración
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Engade de novo a crontab
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Vexamos o que escoita agora o noso proxy
root@debian9:~# netstat -nlp
rexistro de netstatConexións a Internet activas (só servidores)
Proto Recv-Q Enviar-Q Enderezo local Enderezo estranxeiro Estado PID/Nome do programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCOITAR 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCOITAR 354/3proxy
tcp6 0 0 :::22 :::* ESCOITAR 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á preparado para aceptar calquera conexión TCP no porto 888, DNS no porto 53, para que logo poidan ser redirixidos aos socks5 remotos: proxy e DNS Google 8.8.8.8. Queda por configurar o netfilter (iptables) e as regras DHCP para emitir enderezos.
8. Instale o paquete iptables-persistent e dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Edite o ficheiro de inicio dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf
dhcpd.conf# dhcpd.conf
#
# Ficheiro de configuración de mostra para ISC dhcpd
#
# definicións de opcións comúns a todas as redes admitidas...
opción nome-dominio "example.org";
opción domain-name-servers ns1.example.org, ns2.example.org;
tempo de aluguer por defecto 600;
tempo máximo de arrendamento 7200;
ddns-update-style none;
# Se este servidor DHCP é o servidor DHCP oficial para o local
# rede, a directiva autorizada non debe ser comentada.
autoritario;
# Unha configuración lixeiramente diferente para unha subrede interna.
subred 192.168.201.0 máscara de rede 255.255.255.0 {
rango 192.168.201.10 192.168.201.250;
opción domain-name-servers 192.168.201.254;
enrutadores de opcións 192.168.201.254;
opción broadcast-address 192.168.201.255;
tempo de aluguer por defecto 600;
tempo máximo de arrendamento 7200;
}
11. Reinicie e comprobe o servizo no porto 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp
rexistro de netstatConexións a Internet activas (só servidores)
Proto Recv-Q Enviar-Q Enderezo local Enderezo estranxeiro Estado PID/Nome do programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCOITAR 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCOITAR 310/3proxy
tcp6 0 0 :::22 :::* ESCOITAR 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
en bruto 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd
12. Queda por redirixir todas as solicitudes tcp ao porto 888 e gardar a regra en 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 ampliar o ancho de banda da canle, pode usar varios servidores proxy á vez. O importe total debería ser 1000. Establécense novas conexións cunha probabilidade de 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 aos servidores proxy especificados.
Nota: se temos un proxy web, entón, en lugar de socks5, debes escribir connect, se socks4, entón socks4 (socks4 NON SOPORTA A AUTORIZACIÓN DE INICIO DE SESIÓN / CONTRASEÑA!)
Exemplo de configuración de proxy transparente #2servizo
pidfile /home/joke/proxy/3proxy.pid
servidor 8.8.8.8
nscache 65536
maxconn 500
tempo de espera 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
formato de rexistro "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
xirar 3
a ras
auth de forma única
dnspr
permitir *
pai 200 calcetíns5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 probador 1234
pai 200 calcetíns5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 probador 1234
pai 200 calcetíns5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 probador 1234
pai 200 calcetíns5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 probador 1234
pai 100 calcetíns5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 probador 1234
pai 100 calcetíns5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 probador 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 configuración de NAT + Proxy transparente
Nesta configuración, utilizaremos o mecanismo NAT habitual con proxy selectivo ou totalmente transparente de enderezos ou subredes individuais. Os usuarios da rede interna traballarán con determinados servizos/subredes sen sequera decatarse de que están a traballar a través dun proxy. Todas as conexións https funcionan ben, non hai que xerar/substituír certificados.
En primeiro lugar, imos decidir que subredes/servizos queremos proxy. Supoñamos que os proxies externos están situados onde se está a executar un servizo como pandora.com. Agora queda determinar as súas subredes / enderezos.
1. Ping
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes de datos.
2. Escribimos Google BGP 208.85.40.20
Imos ao sitio
Pódese ver que a subrede que busco é AS40428 Pandora Media, Inc.
Abrir prefixos v4
Aquí están as subredes necesarias!
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 reducir o número de subredes, cómpre realizar a agregación. Imos ao sitio
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. Limpar as regras de iptables
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Activa o mecanismo de avance 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 reenvío estea habilitado permanentemente despois do reinicio, cambiaremos o ficheiro
root@debian9:~# nano /etc/sysctl.conf
E descomenta a liña
net.ipv4.ip_forward = 1
Ctrl+X para gardar o ficheiro
5. Envolve as subredes de pandora.com nun 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. Garda as regras
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configurar e executar o proxy transparente mediante a configuración do enrutador
Nesta configuración, o servidor proxy transparente pode ser un PC separado ou unha máquina virtual detrás dun enrutador doméstico/corporativo. É suficiente con rexistrar rutas estáticas no enrutador ou dispositivos, e toda a subrede usará o proxy sen necesidade de ningunha configuración adicional.
IMPORTANTE! É necesario que a nosa pasarela reciba unha IP estática do router, ou estea configurada para a propia estática.
1. Configure un enderezo de pasarela estático (adaptador enp0s3)
root@debian9:~# nano /etc/network/interfaces
Ficheiro /etc/network/interfaces# Este ficheiro describe as interfaces de rede dispoñibles no seu sistema
# e como activalos. Para obter máis información, consulte interfaces(5).
fonte /etc/network/interfaces.d/*
# A interface de rede de loopback
caralo
iface lo inet loopback
# A interface de rede principal
allow-hotplug enp0s3
iface enp0s3 inet estático
enderezo 192.168.23.2
máscara de rede 255.255.255.0
pasarela 192.168.23.254
# A interface de rede secundaria
allow-hotplug enp0s8
iface enp0s8 inet estático
enderezo 192.168.201.254
máscara de rede 255.255.255.0
2. Permitir que os dispositivos da subrede 192.168.23.0/24 utilicen o 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. Garda as regras
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Escribamos subredes no router
Lista de redes de enrutadores199.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. Páxina web oficial do programa 3proxy
2. Instrucións para instalar 3proxy desde fontes
3. Rama de desenvolvedores 3proxy en GitHub
Fonte: www.habr.com