Os conceptos básicos do proxy transparente usando 3proxy e iptables/netfilter ou como "pasar todo a través dun proxy"

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 bgp.he.net/net/208.85.40.0/24#_netinfo
Pódese ver que a subrede que busco é AS40428 Pandora Media, Inc.

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

Abrir prefixos v4

bgp.he.net/AS40428#_prefixes

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 ip-calculator.ru/aggregate e copia alí a nosa lista. 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. 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 3proxy.ru

2. Instrucións para instalar 3proxy desde fontes www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

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

Fonte: www.habr.com

Engadir un comentario