Los conceptos básicos del proxy transparente usando 3proxy e iptables/netfilter o cómo "pasar todo a través de un proxy"

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 bgp.he.net/net/208.85.40.0/24#_netinfo
Se puede ver que la subred que busco es AS40428 Pandora Media, Inc.

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

Apertura de prefijos v4

bgp.he.net/AS40428#_prefixes

¡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 ip-calculator.ru/agregado y copiar nuestra lista allí. Como resultado, 6 subredes en lugar 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. 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 3proxy.ru

2. Instrucciones para instalar 3proxy desde fuentes www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Rama de desarrollador 3proxy en GitHub github.com/z3APA3A/3proxy/issues/274

Fuente: habr.com

Añadir un comentario