En este artículo, me gustaría revelar las posibilidades del proxy transparente, que le permite pasar completamente desapercibido para los clientes para redirigir todo o parte del tráfico a través de servidores proxy externos.
Cuando comencé a resolver este problema, me encontré con el hecho de que su implementación tiene un problema importante: el protocolo HTTPS. En los viejos tiempos, no había problemas particulares con el proxy HTTP transparente, pero con el proxy HTTPS, los navegadores informan sobre la interferencia del protocolo y ahí es donde termina la felicidad.
En las instrucciones comunes para el servidor proxy Squid, incluso ofrecen generar su propio certificado e instalarlo en los clientes, lo cual es una completa tontería, al menos irracional, y parece un ataque MITM. Sé que Squid ya sabe cómo hacer algo similar, pero este artículo trata sobre un método probado y funcional usando 3proxy del respetado 3APA3A.
A continuación, veremos en detalle el proceso de creación de 3proxy desde el origen, su configuración, el proxy completo y selectivo mediante NAT, la distribución del canal a varios servidores proxy externos, así como el uso de un enrutador y rutas estáticas. Usamos Debian 9 x64 como sistema operativo. ¡Comenzar!
Instalar 3proxy y ejecutar un proxy normal
1. Instale ifconfig (del paquete net-tools)
apt-get install net-tools
2. Instalar Midnight Commander
apt-get install mc
3. Ahora tenemos 2 interfaces:
enp0s3 - externo, busca en Internet
enp0s8 - interno, debe buscar en la red local
En otras distribuciones basadas en Debian, las interfaces suelen llamarse eth0 y eth1.
ifconfig -a
Interfacesenp0s3: banderas=4163 1500 mtu
inet 192.168.23.11 máscara de red 255.255.255.0 transmisión 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 alcanceid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Paquetes RX 6412 bytes 8676619 (8.2 MiB)
Errores de RX 0 caídos 0 excesos 0 marco 0
Paquetes TX 1726 bytes 289128 (282.3 KiB)
Errores de TX 0 caídas 0 excesos 0 operador 0 colisiones 0
enp0s8: banderas=4098 1500 mtu
éter 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Paquetes RX 0 bytes 0 (0.0 B)
Errores de RX 0 caídos 0 excesos 0 marco 0
Paquetes TX 0 bytes 0 (0.0 B)
Errores de TX 0 caídas 0 excesos 0 operador 0 colisiones 0
lo: banderas=73 mtu 65536
inet 127.0.0.1 máscara de red 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 bucle txqueuelen 1 (bucle invertido local)
Paquetes RX 0 bytes 0 (0.0 B)
Errores de RX 0 caídos 0 excesos 0 marco 0
Paquetes TX 0 bytes 0 (0.0 B)
Errores de TX 0 caídas 0 excesos 0 operador 0 colisiones 0
La interfaz enp0s8 actualmente no se usa, la habilitaremos cuando queramos usar la configuración NAT o NAT Proxy. Es entonces que lo lógico sería asignarle una ip estática.
4. Empecemos a instalar 3proxy
4.1 Instalación de paquetes base para compilar 3proxy desde la fuente
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Cree una carpeta para descargar el archivo con fuentes.
root@debian9:~# mkdir -p /opt/proxy
4.3. vamos a esta carpeta
root@debian9:~# cd /opt/proxy
4.4. Ahora descarguemos el paquete 3proxy más reciente. Al momento de escribir este artículo, la última versión estable era 0.8.12 (18/04/2018) Descárguela del sitio web oficial de 3proxy
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. Descomprimir el archivo descargado
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Vaya al directorio desempaquetado para compilar el programa.
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. A continuación, debe agregar una línea al archivo de encabezado para que nuestro servidor sea completamente anónimo (realmente funciona, todo está verificado, las direcciones IP de los clientes están ocultas)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Agregar una línea
#define ANONYMOUS 1
Presione Ctrl+x y Enter para guardar los cambios.
4.8. Construyamos el programa
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
hacer registromake[2]: dejando el directorio '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: dejando el directorio '/opt/proxy/3proxy-0.8.12/src'
No hay errores, continúa.
4.9. Instalar el programa en el sistema.
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Vaya al directorio raíz y verifique dónde se instaló el 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. Vamos a crear una carpeta para archivos de configuración e iniciar sesión en el directorio de inicio del usuario
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. Vaya al directorio donde debería estar la configuración
root@debian9:~# cd /home/joke/proxy/
4.13. Cree un archivo vacío y copie la configuración allí
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.confdemonio
archivo pid /home/joke/proxy/3proxy.pid
servidor 8.8.8.8
nscaché 65536
probador de usuario: CL: 1234
tiempos de espera 1 5 30 60 180 1800 16 60
registro /home/joke/proxy/logs/3proxy.log D
formato de registro "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotar 3
autenticación fuerte
enjuagar
permitir probador
calcetines -p3128
proxy-p8080
Para guardar, presione Ctrl + Z
4.14. Vamos a crear un archivo pid para que no haya errores de inicio.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
Para guardar, presione Ctrl + Z
4.15. ¡Comencemos el servidor proxy!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. Veamos si el servidor está escuchando en los puertos.
root@debian9:~/home/joke/proxy# netstat -nlp
registro de netstatConexiones a Internet activas (solo servidores)
Proto Recv-Q Send-Q Dirección local Dirección extranjera Estado PID/Nombre del programa
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ESCUCHAR 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUCHAR 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* ESCUCHAR 504/3proxy
tcp6 0 0 :::22 :::* ESCUCHAR 338/sshd
upd 0 0 0.0.0.0:68 0.0.0.0:* 352/clientedh
Como estaba escrito en la configuración, el proxy web escucha en el puerto 8080, proxy Socks5 - 3128.
4.17. Para iniciar automáticamente el servicio de proxy después de un reinicio, debe agregarlo a cron.
root@debian9:/home/joke/proxy# crontab -e
Agregar una línea
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Presionamos Enter, ya que cron debería ver el carácter de fin de línea y guardar el archivo.
Debería haber un mensaje sobre la instalación de un nuevo crontab.
crontab: instalando nuevo crontab
4.18. Reiniciemos el sistema e intentemos conectarnos a través del navegador al proxy. Para la verificación, usamos el navegador Firefox (para un proxy web) y el complemento FoxyProxy para socks5 con autenticación.
root@debian9:/home/joke/proxy# reboot
4.19. Después de verificar el trabajo del proxy después del reinicio, puede ver los registros. Esto completa la configuración del servidor proxy.
3 registros 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_HTTP/1.1
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
Configuración y ejecución de la configuración de NAT de proxy transparente
En esta configuración, todos los dispositivos de la red interna funcionarán de forma transparente en Internet a través de un servidor proxy remoto. Absolutamente todas las conexiones tcp serán redirigidas a uno o varios servidores proxy (¡realmente expande el ancho del canal, ejemplo de configuración No. 2!). El servicio DNS utilizará capacidades de 3proxy (dnspr). UDP no "irá" al exterior, ya que aún no usamos el mecanismo de reenvío (deshabilitado por defecto en el kernel de Linux).
1. Es hora de habilitar la interfaz enp0s8
root@debian9:~# nano /etc/network/interfaces
/etc/red/archivo de interfaces# Este archivo describe las interfaces de red disponibles en el sistema
# Y cómo activarlos. Para obtener más información, vea Interfaces (5).
fuente /etc/network/interfaces.d/*
# La interfaz de red de bucle invertido
auto lo
del iface lo inet loopback
# La interfaz de red principal
permitir conexión en caliente enp0s3
iface enp0s3 inet dhcp
# La interfaz de red secundaria
permitir conexión en caliente enp0s8
iface enp0s8 inet estático
dirección 192.168.201.254
netmask 255.255.255.0
Aquí le asignamos a la interfaz enp0s8 una dirección estática 192.168.201.254 y una máscara 255.255.255.0
Guardar configuración Ctrl+X y reiniciar
root@debian9:~# reboot
2. Comprobación de interfaces
root@debian9:~# ifconfig
registro ifconfigenp0s3: banderas=4163 1500 mtu
inet 192.168.23.11 máscara de red 255.255.255.0 transmisión 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 alcanceid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Paquetes RX 61 bytes 7873 (7.6 KiB)
Errores de RX 0 caídos 0 excesos 0 marco 0
Paquetes TX 65 bytes 10917 (10.6 KiB)
Errores de TX 0 caídas 0 excesos 0 operador 0 colisiones 0
enp0s8: banderas=4163 1500 mtu
inet 192.168.201.254 máscara de red 255.255.255.0 transmisión 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 alcanceid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Paquetes RX 0 bytes 0 (0.0 B)
Errores de RX 0 caídos 0 excesos 0 marco 0
Paquetes TX 8 bytes 648 (648.0 B)
Errores de TX 0 caídas 0 excesos 0 operador 0 colisiones 0
lo: banderas=73 mtu 65536
inet 127.0.0.1 máscara de red 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 bucle txqueuelen 1 (bucle invertido local)
Paquetes RX 0 bytes 0 (0.0 B)
Errores de RX 0 caídos 0 excesos 0 marco 0
Paquetes TX 0 bytes 0 (0.0 B)
Errores de TX 0 caídas 0 excesos 0 operador 0 colisiones 0
3. Todo salió bien, ahora necesita configurar 3proxy para un proxy transparente.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Ejemplo de configuración de proxy transparente #1demonio
archivo pid /home/joke/proxy/3proxy.pid
servidor 8.8.8.8
nscaché 65536
tiempos de espera 1 5 30 60 180 1800 16 60
registro /home/joke/proxy/logs/3proxy.log D
formato de registro "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotar 3
enjuagar
autenticación de forma única
dnspr
permitir *
padre 1000 calcetines5 IP_ADDRESS_EXTERNAL_PROXY 3128 probador 1234
complemento /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so complemento_transparente
tcppm-i0.0.0.0 888 127.0.0.1 11111
4. Ahora ejecute 3proxy con nueva configuración
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Agregar a crontab nuevamente
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Veamos qué está escuchando nuestro proxy ahora
root@debian9:~# netstat -nlp
registro de netstatConexiones a Internet activas (solo servidores)
Proto Recv-Q Send-Q Dirección local Dirección extranjera Estado PID/Nombre del programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUCHAR 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCUCHAR 354/3proxy
tcp6 0 0 :::22 :::* ESCUCHAR 349/sshd
upd 0 0 0.0.0.0:53 0.0.0.0:* 354/3proxy
upd 0 0 0.0.0.0:68 0.0.0.0:* 367/clientedh
7. Ahora el proxy está listo para aceptar cualquier conexión TCP en el puerto 888, DNS en el puerto 53, para redirigirlas a calcetines remotos5 - proxy y DNS Google 8.8.8.8. Nos queda por configurar las reglas de netfilter (iptables) y DHCP para la emisión de direcciones.
8. Instale el paquete iptables-persistent y dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Edite el archivo de inicio dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf
dhcpd.conf#dhcpd.conf
#
# Archivo de configuración de muestra para ISC dhcpd
#
# definiciones de opciones comunes a todas las redes admitidas...
opción nombre-dominio "ejemplo.org";
opción servidores de nombres de dominio ns1.example.org, ns2.example.org;
tiempo de arrendamiento predeterminado 600;
tiempo máximo de arrendamiento 7200;
ddns-actualización-estilo ninguno;
# Si este servidor DHCP es el servidor DHCP oficial para el local
# red, la directiva autorizada no debe comentarse.
autoritario;
# Una configuración ligeramente diferente para una subred interna.
subred 192.168.201.0 máscara de red 255.255.255.0 {
rango 192.168.201.10 192.168.201.250;
opción servidores de nombres de dominio 192.168.201.254;
enrutadores opcionales 192.168.201.254;
opción dirección de transmisión 192.168.201.255;
tiempo de arrendamiento predeterminado 600;
tiempo máximo de arrendamiento 7200;
}
11. Reinicie y verifique el servicio en el puerto 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp
registro de netstatConexiones a Internet activas (solo servidores)
Proto Recv-Q Send-Q Dirección local Dirección extranjera Estado PID/Nombre del programa
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUCHAR 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCUCHAR 310/3proxy
tcp6 0 0 :::22 :::* ESCUCHAR 389/sshd
udp 0 0 0.0.0.0:20364 0.0.0.0:* 393/dhcpd
upd 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
upd 0 0 0.0.0.0:68 0.0.0.0:* 405/clientedh
udp6 0 0 :::31728 :::* 393/dhcpd
crudo 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd
12. Queda por redirigir todas las peticiones tcp al puerto 888 y guardar la regla 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 expandir el ancho de banda del canal, puede usar varios servidores proxy a la vez. La cantidad total debe ser 1000. Las nuevas conexiones se establecen con una probabilidad de 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 a los servidores proxy especificados.
Nota: si tenemos un proxy web, entonces, en lugar de socks5, debe escribir conectar, si calcetines4, luego calcetines4 (¡socks4 NO APOYA LA AUTORIZACIÓN DE INICIO DE SESIÓN / CONTRASEÑA!)
Ejemplo de configuración de proxy transparente #2demonio
archivo pid /home/joke/proxy/3proxy.pid
servidor 8.8.8.8
nscaché 65536
maxconn 500
tiempos de espera 1 5 30 60 180 1800 16 60
registro /home/joke/proxy/logs/3proxy.log D
formato de registro "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotar 3
enjuagar
autenticación de forma única
dnspr
permitir *
padre 200 calcetines5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 probador 1234
padre 200 calcetines5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 probador 1234
padre 200 calcetines5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 probador 1234
padre 200 calcetines5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 probador 1234
padre 100 calcetines5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 probador 1234
padre 100 calcetines5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 probador 1234
complemento /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so complemento_transparente
tcppm-i0.0.0.0 888 127.0.0.1 11111
Configuración y ejecución de la configuración NAT + Proxy transparente
En esta configuración, utilizaremos el mecanismo NAT habitual con proxy transparente selectivo o total de direcciones o subredes individuales. Los usuarios de la red interna trabajarán con ciertos servicios/subredes sin siquiera darse cuenta de que están trabajando a través de un proxy. Todas las conexiones https funcionan bien, no es necesario generar/reemplazar certificados.
Primero, decidamos qué subredes/servicios queremos proxy. Supongamos que los proxies externos están ubicados donde se ejecuta un servicio como pandora.com. Ahora queda por determinar sus subredes/direcciones.
1. hacer ping
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes de datos.
2. Tecleamos en Google BGP 208.85.40.20
Ir al sitio web
Se puede ver que la subred que busco es AS40428 Pandora Media, Inc.
Apertura de prefijos v4
¡Aquí están las subredes requeridas!
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 la cantidad de subredes, debe realizar la agregación. vamos al 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. Limpie las reglas de iptables
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Habilitar el mecanismo de reenvío y 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 el reenvío se habilite permanentemente después de reiniciar, cambiaremos el archivo
root@debian9:~# nano /etc/sysctl.conf
Y descomentar la línea
net.ipv4.ip_forward = 1
Ctrl+X para guardar el archivo
5. Envuelva las subredes de pandora.com en un 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. Guarda las reglas
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configurar y ejecutar el proxy transparente a través de la configuración del enrutador
En esta configuración, el servidor proxy transparente puede ser una PC separada o una máquina virtual detrás de un enrutador doméstico/corporativo. Basta con registrar rutas estáticas en el enrutador o dispositivos, y toda la subred usará el proxy sin necesidad de configuraciones adicionales.
¡IMPORTANTE! Es necesario que nuestra puerta de enlace reciba una IP estática del router, o esté configurada para que sea estática.
1. Configure una dirección de puerta de enlace estática (adaptador enp0s3)
root@debian9:~# nano /etc/network/interfaces
/etc/red/archivo de interfaces# Este archivo describe las interfaces de red disponibles en el sistema
# Y cómo activarlos. Para obtener más información, vea Interfaces (5).
fuente /etc/network/interfaces.d/*
# La interfaz de red de bucle invertido
auto lo
del iface lo inet loopback
# La interfaz de red principal
permitir conexión en caliente enp0s3
iface enp0s3 inet estático
dirección 192.168.23.2
netmask 255.255.255.0
pasarela 192.168.23.254
# La interfaz de red secundaria
permitir conexión en caliente enp0s8
iface enp0s8 inet estático
dirección 192.168.201.254
netmask 255.255.255.0
2. Permita que los dispositivos de la subred 192.168.23.0/24 usen 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. Guarda las reglas
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Escribamos subredes en el enrutador
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
Materiales/recursos usados
1. Sitio web oficial del programa 3proxy
2. Instrucciones para instalar 3proxy desde fuentes
3. Rama de desarrollador 3proxy en GitHub
Fuente: habr.com