Fondamenti del proxy trasparente utilizzando 3proxy e iptables/netfilter o come "far passare tutto attraverso il proxy"

In questo articolo vorrei rivelare le potenzialità del proxy trasparente, che consente di reindirizzare completamente o in parte il traffico attraverso server proxy esterni, senza che i clienti se ne accorgano.

Quando ho iniziato a risolvere questo problema, mi sono imbattuto in un'importante difficoltà: il protocollo HTTPS. Nei vecchi tempi, non c'erano particolari problemi con il proxy trasparente per HTTP, ma nel caso del proxy per HTTPS, i browser segnalano un'interferenza nel protocollo e lì finisce la festa.

Nelle istruzioni più comuni per il server proxy Squid, si suggerisce persino di generare un certificato proprio e installarlo sui client, cosa che è semplicemente insensata e sembra un attacco MITM. So che Squid è in grado di fare qualcosa di simile, ma in questo articolo parleremo di un metodo testato e funzionante utilizzando 3proxy del rispettabile 3APA3A.

Successivamente esamineremo in dettaglio il processo di compilazione di 3proxy dai sorgenti, la sua configurazione, il proxy completo e selettivo utilizzando NAT, la distribuzione della banda su più server proxy esterni e l'uso di un router e di route statiche. Utilizziamo Debian 9 x64 come sistema operativo. Cominciamo!

Installazione di 3proxy e avvio di un normale server proxy

1. Installiamo ifconfig (dal pacchetto net-tools)
apt-get install net-tools
2. Installiamo Midnight Commander
apt-get install mc
3. Abbiamo attualmente 2 interfacce:
enp0s3 — esterna, si connette a Internet
enp0s8 — interna, deve collegarsi alla rete locale
Negli altri sistemi basati su Debian, le interfacce sono solitamente chiamate eth0 ed eth1.
ifconfig -a

Interfacceenp0s3: flags=4163 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)
RX pacchetti 6412 byte 8676619 (8.2 MiB)
RX error 0 dropped 0 overruns 0 frame 0
TX pacchetti 1726 byte 289128 (282.3 KiB)
TX error 0 dropped 0 overruns 0 carrier 0 collisions 0

enp0s8: flags=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX pacchetti 0 byte 0 (0.0 B)
RX error 0 dropped 0 overruns 0 frame 0
TX pacchetti 0 byte 0 (0.0 B)
TX error 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX pacchetti 0 byte 0 (0.0 B)
RX error 0 dropped 0 overruns 0 frame 0
TX pacchetti 0 byte 0 (0.0 B)
TX error 0 dropped 0 overruns 0 carrier 0 collisions 0

L'interfaccia enp0s8 al momento non è in uso, la attiveremo quando vorremo utilizzare la configurazione Proxy NAT o NAT. Proprio in quel momento sarà logico assegnargli un IP statico.

4. Iniziamo a installare 3proxy

4.1 Installazione dei pacchetti di base per la compilazione di 3proxy dai sorgenti

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

4.2 Creiamo una cartella per scaricare l'archivio con i sorgenti

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

4.3 Andiamo in questa cartella

root@debian9:~# cd /opt/proxy

4.4 Ora scarichiamo l'ultima versione di 3proxy. Al momento della scrittura dell'articolo, l'ultima versione stabile era 0.8.12 (18/04/2018). Scarichiamola dal sito ufficiale di 3proxy

root@debian9:​/opt​/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz

4.5 Estraiamo l'archivio scaricato

root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz

4.6 Andiamo nella cartella estratta per compilare il programma

root@debian9:/opt/proxy# cd 3proxy-0.8.12

4.7 Dobbiamo aggiungere una riga nel file di intestazione affinché il nostro server sia completamente anonimo (funziona realmente, tutto è stato verificato, gli ip dei clienti sono nascosti)

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

Aggiungiamo la riga

#define ANONYMOUS 1

Premiamo Ctrl+x e Invio per salvare le modifiche.

4.8 Iniziamo a compilare il programma

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

Makelogmake[2]: Uscita dalla directory '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Uscita dalla directory '/opt/proxy/3proxy-0.8.12/src'

Nessun errore, continuiamo.

4.9 Installiamo il programma nel sistema

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

4.10 Andiamo nella cartella principale e controlliamo dove è stato installato il programma

root@debian9:~# cd ~/
root@debian9:~# whereis 3proxy

3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy

4.11 Creiamo una cartella per i file di configurazione e i log nella home dell'utente

root@debian9:~# mkdir -p /home/joke/proxy/logs

4.12 Andiamo nella cartella dove dovrebbe trovarsi il config

root@debian9:~# cd /home/joke/proxy/

4.13 Creiamo un file vuoto e copiamo il config

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

3proxy.confdaemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
users tester:CL:1234
timeouts 1 5 30 60 180 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"
rotate 3
auth strong
flush
allow tester
socks -p3128
proxy -p8080

Per salvare premiamo Ctrl + Z

4.14 Creiamo un file pid per evitare errori durante l'avvio.

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

Per salvare premiamo Ctrl + Z

4.15 Avviamo il server proxy!

root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf

4.16 Controlliamo se il server ascolta le porte

root@debian9:~/home/joke/proxy# netstat -nlp

netstat logConnessioni Internet attive (solo server)
Proto Recv-Q Send-Q Indirizzo locale Indirizzo estero Stato PID/Nome del programma
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ASCOLTO 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCOLTO 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* ASCOLTO 504/3proxy
tcp6 0 0 :::22 :::* ASCOLTO 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient

Come indicato nel config, il web-proxy ascolta sulla porta 8080, il proxy Socks5 sulla 3128.

4.17 Per far partire automaticamente il servizio proxy dopo il riavvio, dobbiamo aggiungerlo a cron.

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

Aggiungiamo la riga

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

Premiamo Invio, poiché cron deve vedere il simbolo di fine linea e salviamo il file.

Dovrebbe apparire un messaggio che segnala l'installazione di un nuovo crontab.

crontab: installazione di un nuovo crontab

4.18. Riavviamo il sistema e proviamo a connetterci tramite browser al proxy. Per il test utilizziamo il browser Firefox (per il web proxy) e l'estensione FoxyProxy per socks5 con autenticazione.

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

4.19. Dopo aver controllato il funzionamento del proxy dopo il riavvio, possiamo guardare i log. Con questo la configurazione del server proxy è completata.

3 log proxy1542573996.018 PROXY.8080 00000 tester 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 tester 192.168.23.10:51193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443

Configurazione e avvio della configurazione del Proxy Trasparente NAT

In questa configurazione, tutti i dispositivi della rete interna lavoreranno in modo trasparente su Internet tramite un server proxy remoto. Tutte le connessioni tcp saranno reindirizzate a uno o più server proxy (espandendo realmente la larghezza di banda, esempio di configurazione n. 2!). Il servizio DNS utilizzerà le funzionalità di 3proxy (dnspr). UDP non passerà all'esterno poiché per ora non utilizziamo il meccanismo forward (disattivato per impostazione predefinita nel kernel di Linux).

1. È ora di attivare l'interfaccia enp0s8

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

/etc/network/interfaces file# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp0s3
iface enp0s3 inet dhcp

# The secondary network interface
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.201.254
netmask 255.255.255.0

Qui abbiamo assegnato all'interfaccia enp0s8 un indirizzo statico 192.168.201.254 e una maschera 255.255.255.0
Salviamo la configurazione con Ctrl+X e riavviamo

root@debian9:~# riavvia

2. Controlliamo le interfacce

root@debian9:~# ifconfig

ifconfig logenp0s3: flags=4163 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)
RX packets 61 bytes 7873 (7.6 KiB)
RX error 0 dropped 0 overruns 0 frame 0
TX packets 65 bytes 10917 (10.6 KiB)
TX error 0 dropped 0 overruns 0 carrier 0 collisions 0

enp0s8: flags=4163 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)
RX pacchetti 0 byte 0 (0.0 B)
RX error 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX error 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX pacchetti 0 byte 0 (0.0 B)
RX error 0 dropped 0 overruns 0 frame 0
TX pacchetti 0 byte 0 (0.0 B)
TX error 0 dropped 0 overruns 0 carrier 0 collisions 0

3. È andato tutto bene, ora è necessario configurare 3proxy per il proxy trasparente.

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

Esempio di configurazione del server proxy trasparente n. 1daemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
timeouts 1 5 30 60 180 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"
rotate 3
flush
auth iponly
dnspr
allow *
parent 1000 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO 3128 tester 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. Ora avviamo 3proxy con la nuova configurazione
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Aggiungiamo di nuovo al crontab
root@debian9: /home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

6. Controlliamo cosa sta ascoltando il nostro proxy adesso
root@debian9:~# netstat -nlp

netstat logConnessioni Internet attive (solo server)
Proto Recv-Q Send-Q Indirizzo locale Indirizzo estero Stato PID/Nome del programma
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* LISTEN 354/3proxy
tcp6 0 0 :::22 :::* LISTEN 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. Ora il proxy è pronto per accettare qualsiasi connessione TCP sulla porta 888, DNS sulla porta 53, per poi reindirizzarli a un proxy remoto socks5 e DNS Google 8.8.8.8. Dobbiamo solo configurare le regole netfilter (iptables) e DHCP per l'assegnazione degli indirizzi.

8. Installiamo il pacchetto iptables-persistent e dhcpd

root@debian9:~# apt-get install iptables-persistent isc-dhcp-server

9. Modifichiamo il file di avvio dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf

dhcpd.conf# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks…
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.

authoritative;

# A slightly different configuration for an internal subnet.
subnet 192.168.201.0 netmask 255.255.255.0 {
range 192.168.201.10 192.168.201.250;
option domain-name-servers 192.168.201.254;
option routers 192.168.201.254;
option broadcast-address 192.168.201.255;
default-lease-time 600;
max-lease-time 7200;
}

11. Riavviamo e verifichiamo il servizio sulla porta 67
root@debian9:~# riavvia
root@debian9:~# netstat -nlp

netstat logConnessioni Internet attive (solo server)
Proto Recv-Q Send-Q Indirizzo locale Indirizzo estero Stato PID/Nome del programma
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* LISTEN 310/3proxy
tcp6 0 0 :::22 :::* LISTEN 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
raw 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd

12. Rimane da reindirizzare tutte le richieste tcp sulla porta 888 e salvare la regola in 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. Per espandere la larghezza di banda, è possibile utilizzare più server proxy contemporaneamente. La somma totale deve essere 1000. Le nuove connessioni vengono stabilite con probabilità 0.2, 0.2, 0.2, 0.2, 0.1, 0.1 verso i proxy specificati.

Nota: se abbiamo un web-proxy invece di socks5 bisogna scrivere connect, se socks4, allora socks4 (socks4 NON SUPPORTA L'AUTENTICAZIONE LOGIN/PASSWORD!)

Esempio di configurazione del proxy trasparente n. 2daemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
maxconn 500
timeouts 1 5 30 60 180 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"
rotate 3
flush
auth iponly
dnspr
allow *

parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 tester 1234
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 tester 1234
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 tester 1234
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 tester 1234
parent 100 socks5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 tester 1234
parent 100 socks5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 tester 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

Configurazione e avvio della configurazione NAT + Proxy Trasparente

In questa configurazione utilizzeremo il meccanismo NAT standard con un proxy trasparente selettivo o completo per alcuni indirizzi o sottoreti. Gli utenti della rete interna utilizzeranno determinati servizi/sottoreti anche senza rendersene conto, poiché stanno operando tramite il proxy. Tutte le connessioni https funzionano perfettamente, non è necessario generare/sostituire certificati.

Iniziamo definendo quali sottoreti/servizi vogliamo proseguire. Supponiamo che i server proxy esterni si trovino dove funziona un servizio come pandora.com. Ora dobbiamo definire le sue sottoreti/indirizzi.

1. Pinghiamo

root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) byte di dati.

2. Cerchiamo su Google BGP 208.85.40.20

Visitiamo il sito bgp.he.net/net/208.85.40.0/24#_netinfo
Si può vedere che la sottorete cercata è AS40428 Pandora Media, Inc

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

Apriamo i prefissi v4

bgp.he.net/AS40428#_prefixes

Ecco le sottoreti cercate!

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. Per ridurre il numero di sottoreti, dobbiamo effettuare un'aggregazione. Passiamo al sito ip-calculator.ru/aggregate e copiamo la nostra lista lì. Come risultato, avremo 6 sottoreti invece di 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. Puliamo le regole di iptables

root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X

Attiviamo il meccanismo di forward 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

Affinché il forward rimanga attivo dopo il riavvio, modifichiamo il file

root@debian9:~# nano /etc/sysctl.conf

E decommentiamo la riga

net.ipv4.ip_forward = 1

Ctrl+X per salvare il file

5. Incapsuliamo le sottoreti di pandora.com nel 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. Salviamo le regole

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

Configurazione e avvio della configurazione Transparent Proxy tramite router

In questa configurazione, il server proxy trasparente può essere un PC separato o una macchina virtuale dietro il router domestico/aziendale. È sufficiente impostare rotte statiche sul router o sui dispositivi e tutta la sottorete utilizzerà il proxy senza necessità di ulteriori configurazioni.

IMPORTANTE! È necessario che il nostro gateway riceva un IP statico dal router o sia configurato come statico.

1. Configuriamo l'indirizzo statico del gateway (adattatore enp0s3)

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

/etc/network/interfaces file# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp0s3
iface enp0s3 inet static
address 192.168.23.2
netmask 255.255.255.0
gateway 192.168.23.254

# The secondary network interface
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.201.254
netmask 255.255.255.0

2. Permettiamo ai dispositivi nella sottorete 192.168.23.0/24 di utilizzare il 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. Salviamo le regole
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Configuriamo le sottoreti sul router

Elenco delle reti del router199.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

Materiali/risorse utilizzate

1. Sito ufficiale del programma 3proxy 3proxy.ru

2. Istruzioni per l'installazione di 3proxy dai sorgenti www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Sezione sviluppatore di 3proxy su GitHub github.com/z3APA3A/3proxy/issues/274

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster