Los conceptos básicos de proxy transparente usando 3proxy e iptables / netfilter o cómo "dejar que todo pase por un proxy"

En este artículo, me gustaría revelar las posibilidades de proxy transparente, que le permite redirigir todo o parte del tráfico a través de servidores proxy externos de manera absolutamente imperceptible.

Cuando comencé a resolver este problema, me enfrenté al hecho de que su implementación tiene un problema importante: el protocolo HTTPS. En los viejos tiempos, no había problemas especiales con el proxy HTTP transparente, pero al proxy HTTPS, los navegadores informan interferencia con el protocolo, y ahí es donde termina la felicidad.

En instrucciones comunes para el servidor proxy, Squid incluso ofrece generar su propio certificado e instalarlo para los clientes, lo cual es completamente absurdo al menos irracional y parece un ataque MITM. Sé que Squid ya puede hacer algo como esto, pero este artículo trata sobre una forma comprobada y de trabajo usando 3proxy del respetado 3APA3A.

A continuación, consideraremos en detalle el proceso de creación de 3proxy desde el origen, su configuración, proxy completo y selectivo utilizando NAT, distribución de canales a varios servidores proxy externos, así como el uso de un enrutador y rutas estáticas. Utilizamos Debian 9 x64 como sistema operativo. ¡Empecemos!

Instale 3proxy e inicie un servidor proxy normal


1. Instale ifconfig (desde el paquete net-tools)
apt-get install net-tools
2. Instalar Midnigth Commander
apt-get install mc
3. Ahora tenemos 2 interfaces:
enp0s3 - externo, busca en Internet
enp0s8 - interno, debe buscar en una red de área local
En otras distribuciones basadas en Debian, las interfaces generalmente se denominan eth0 y eth1.
ifconfig -a

Interfaces
enp0s3: flags = 4163 <UP, BROADCAST, RUNNING, MULTICAST> mtu 1500
inet 192.168.23.11 netmask 255.255.255.0 broadcast 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)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 1726 bytes 289128 (282.3 KiB)
Errores de TX 0 caídos 0 desbordamientos 0 transportista 0 colisiones 0

enp0s8: flags = 4098 <TRANSMISIÓN, MULTICAST> mtu 1500
éter 08: 00: 27: 79: a7: e3 txqueuelen 1000 (Ethernet)
Paquetes RX 0 bytes 0 (0.0 B)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 0 bytes 0 (0.0 B)
Errores de TX 0 caídos 0 desbordamientos 0 transportista 0 colisiones 0

lo: flags = 73 <ARRIBA, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 máscara de red 255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Loopback local)
Paquetes RX 0 bytes 0 (0.0 B)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 0 bytes 0 (0.0 B)
Errores de TX 0 caídos 0 desbordamientos 0 transportista 0 colisiones 0

La interfaz enp0s8 no se usa actualmente, la habilitaremos cuando queramos usar la configuración NAT Proxy o NAT. Entonces es lógico asignarle una ip estática.

4. Proceda a instalar 3proxy

4.1 Instalación de paquetes básicos para compilar 3proxy desde la fuente

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

4.2. Crea una carpeta para descargar el archivo con la fuente

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

4.3. Vamos a esta carpeta

root@debian9:~# cd /opt/proxy


4.4. Ahora descargue el último paquete 3proxy. Al momento de escribir, 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. Descomprima 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, los clientes ip están ocultos)

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

Agregar una línea

#define ANONYMOUS 1

Presione Ctrl + xy Enter para guardar los cambios.

4.8. Vamos a construir el programa

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

Makelog
make [2]: Saliendo del directorio '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make [1]: Saliendo del directorio '/opt/proxy/3proxy-0.8.12/src'

Sin errores, continúe.

4.9. Instala 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 está instalado 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. Cree una carpeta para archivos de configuración y registros 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.conf
demonio
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
probador de usuarios: CL: 1234
tiempos de espera 1 5 30 60180 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"
rotar 3
auth fuerte
rubor
permitir probador
calcetines -p3128
proxy -p8080

Para guardar, presione Ctrl + Z

4.14. Cree un archivo pid para que no haya errores al inicio.

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

Para guardar, presione Ctrl + Z

4.15. ¡Lanza un 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 netstat
Conexiones activas a Internet (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:* ESCUCHE 504 / 3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUCHAR 338 / sshd
tcp 0 0 0.0.0.0lla128 0.0.0.0:* ESCUCHE 504 / 3proxy
tcp6 0 0 ::: 22 ::: * ESCUCHAR 338 / sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352 / dhclient

Como estaba escrito en la configuración, el proxy web escucha el puerto 8080, y el proxy Socks5 escucha 3128.

4.17. Para iniciar el servicio proxy después de reiniciar, agréguelo a cron.

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

Agregar una línea

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

Presione Entrar, 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: instalación de nuevo crontab

4.18. Reiniciaremos el sistema e intentaremos conectarnos a través del navegador al proxy. Para la verificación, utilizamos el navegador Firefox (para proxy web) y el complemento FoxyProxy para socks5 con autenticación.

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

4.19. Después de verificar el proxy después de reiniciar, puede ver los registros. Esto completa la configuración del proxy.

3 registro de proxy
1542573996.018 PROXY.8080 00000 probador 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 probador 192.168.23.10/101193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443

Configure y ejecute la configuración NAT de proxy transparente


En esta configuración, todos los dispositivos en la red interna funcionarán de manera 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 ampliando el ancho del canal, ejemplo de configuración No. 2!). DNS utilizará las capacidades de 3proxy (dnspr). UDP no saldrá porque todavía no usamos el mecanismo de reenvío (deshabilitado de forma predeterminada en el kernel de Linux).

1. Es hora de habilitar la interfaz enp0s8

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

archivo / etc / network / interfaces
# Este archivo describe las interfaces de red disponibles en su sistema
# y cómo activarlos. Para obtener más información, consulte las interfaces (5).

fuente /etc/network/interfaces.d/*

# La interfaz de red de bucle invertido
auto lo
iface lo inet loopback

# La interfaz de red primaria
allow-hotplug enp0s3
iface enp0s3 inet dhcp

# La interfaz de red secundaria
allow-hotplug enp0s8
iface enp0s8 inet estático
dirección 192.168.201.254
máscara de red 255.255.255.0

Aquí asignamos la dirección estática 192.168.201.254 y la máscara 255.255.255.0 a la interfaz enp0s8
Guarde la configuración Ctrl + X y reinicie

root@debian9:~# reboot

2. Comprobando las interfaces

root@debian9:~# ifconfig

registro de ifconfig
enp0s3: flags = 4163 <UP, BROADCAST, RUNNING, MULTICAST> mtu 1500
inet 192.168.23.11 netmask 255.255.255.0 broadcast 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)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 65 bytes 10917 (10.6 KiB)
Errores de TX 0 caídos 0 desbordamientos 0 transportista 0 colisiones 0

enp0s8: flags = 4163 <UP, BROADCAST, RUNNING, MULTICAST> mtu 1500
inet 192.168.201.254 netmask 255.255.255.0 broadcast 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)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 8 bytes 648 (648.0 B)
Errores de TX 0 caídos 0 desbordamientos 0 transportista 0 colisiones 0

lo: flags = 73 <ARRIBA, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 máscara de red 255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Loopback local)
Paquetes RX 0 bytes 0 (0.0 B)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 0 bytes 0 (0.0 B)
Errores de TX 0 caídos 0 desbordamientos 0 transportista 0 colisiones 0

3. Todo resultó, ahora necesita configurar 3proxy para proxy transparente.

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


Ejemplo de configuración del servidor proxy transparente # 1
demonio
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
tiempos de espera 1 5 30 60180 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"
rotar 3
rubor
autenticación iponly
dnspr
permitir *
padre 1000 calcetines5 IP_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. Ahora ejecute 3proxy con la nueva configuración
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Agregue 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 netstat
Conexiones activas a Internet (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:* ESCUCHE 349 / sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCUCHE 354 / 3proxy
tcp6 0 0 ::: 22 ::: * ESCUCHE 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. Ahora el proxy está listo para aceptar cualquier conexión TCP en el puerto 888, DNS en el puerto 53, para que luego pueda ser redirigido a los calcetines remotos5: proxy de Google y DNS 8.8.8.8. Nos queda por configurar las reglas netfilter (iptables) y DHCP para emitir 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 compatibles ...
opción nombre-dominio "ejemplo.org";
opción de servidores de nombres de dominio ns1.example.org, ns2.example.org;

tiempo de arrendamiento predeterminado 600;
max-lease-time 7200;

ddns-update-style none;

# Si este servidor DHCP es el servidor DHCP oficial para el local
# network, la directiva autorizada no debe ser comentada.

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 de servidores de nombres de dominio 192.168.201.254;
enrutadores opcionales 192.168.201.254;
opción broadcast-address 192.168.201.255;
tiempo de arrendamiento predeterminado 600;
max-lease-time 7200;
}

11. Reinicie y verifique el servicio en el puerto 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp


registro de netstat
Conexiones activas a Internet (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:* ESCUCHE 389 / sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ESCUCHE 310 / 3proxy
tcp6 0 0 ::: 22 ::: * ESCUCHE 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
sin procesar 0 0 0.0.0.0:1 0.0.0.0:* 393 / dhcpd


12. Queda por redirigir todas las solicitudes de 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. La cantidad total debe ser 1000. Se establecen nuevas conexiones 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 necesita escribir connect, si socks4, luego socks4 (socks4 ¡NO APOYA LA AUTORIZACIÓN DE INICIO DE SESIÓN / CONTRASEÑA!)

Ejemplo de configuración del servidor proxy transparente # 2
demonio
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
maxconn 500
tiempos de espera 1 5 30 60180 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"
rotar 3
rubor
autenticación iponly
dnspr
permitir *

padre 200 calcetines5 IP_EXT_EXT_PROXY # 1 3128 probador 1234
padre 200 calcetines5 IP_EXT_EXT_PROXY # 2 3128 probador 1234
padre 200 calcetines5 IP_EXT_EXT_PROXY # 3 3128 probador 1234
padre 200 calcetines5 IP_EXT_EXT_PROXY # 4 3128 probador 1234
padre 100 calcetines5 IP_EXT_EXT_PROXY # 5 3128 probador 1234
padre 100 calcetines5 IP_EXT_EXT_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 y ejecutar la configuración de proxy transparente NAT +


En esta configuración, utilizaremos el mecanismo NAT habitual con representación selectiva o transparente total de direcciones o subredes individuales. Los usuarios de la red interna trabajarán con ciertos servicios / subredes sin siquiera darse cuenta de que funcionan a través de un proxy. Todas las conexiones https funcionan bien, no es necesario generar / reemplazar certificados.

Primero, decidimos qué subredes / servicios queremos proxy. Supongamos que los servidores proxy externos se encuentran donde se está ejecutando un servicio como pandora.com. Ahora queda por determinar su subred / dirección.

1. Ping

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

2. Escribimos en Google BGP 208.85.40.20

Vaya al sitio web bgp.he.net/net/208.85.40.0/24#_netinfo
Puede ver que estoy buscando la subred es AS40428 Pandora Media, Inc

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

Abrir prefijos v4

bgp.he.net/AS40428#_prefixes

¡Aquí están las subredes deseadas!

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 el número de subredes, se debe realizar la agregación. Vaya a ip-calculator.ru/aggregate y copie 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. Borrar 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 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 esté siempre activado después de reiniciar, cambie 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. Envolvemos las subredes de pandora.com en el 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. Guardar las reglas

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

Configure y ejecute 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. Es suficiente registrar rutas estáticas en el enrutador o dispositivos y toda la subred usará proxies sin la necesidad de ninguna configuración adicional.

¡IMPORTANTE! Es necesario que nuestra puerta de enlace reciba una IP estática del enrutador, o que esté configurada para la misma estática.

1. Configure una dirección de puerta de enlace estática (adaptador enp0s3)

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

archivo / etc / network / interfaces
# Este archivo describe las interfaces de red disponibles en su sistema
# y cómo activarlos. Para obtener más información, consulte las interfaces (5).

fuente /etc/network/interfaces.d/*

# La interfaz de red de bucle invertido
auto lo
iface lo inet loopback

# La interfaz de red primaria
allow-hotplug enp0s3
iface enp0s3 inet estático
dirección 192.168.23.2
máscara de red 255.255.255.0
Gateway 192.168.23.254

# La interfaz de red secundaria
allow-hotplug enp0s8
iface enp0s8 inet estático
dirección 192.168.201.254
máscara de red 255.255.255.0

2. Permitir que los dispositivos de la subred 192.168.23.0/24 utilicen el 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. Guardar las reglas
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Registraremos las subredes en el enrutador

Lista de red del enrutador
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

Materiales / recursos utilizados


1. El sitio web oficial del programa 3proxy 3proxy.ru

2. Instrucciones de instalación para 3proxy de la fuente www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

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

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


All Articles