Nozioni di base sul proxy trasparente utilizzando 3proxy e iptables/netfilter o come "mettere tutto attraverso un proxy"

In questo articolo vorrei svelare le possibilità del proxy trasparente, che consente di reindirizzare tutto o parte del traffico attraverso server proxy esterni in modo assolutamente invisibile ai client.

Quando ho iniziato a risolvere questo problema, mi sono trovato di fronte al fatto che la sua implementazione presentava un problema significativo: il protocollo HTTPS. Ai vecchi tempi non c’erano problemi particolari con il proxy HTTP trasparente, ma con il proxy HTTPS i browser segnalano interferenze con il protocollo e qui finisce la felicità.

Nelle istruzioni comuni per il server proxy Squid, suggeriscono persino di generare il proprio certificato e di installarlo sui client, il che è per lo meno una totale assurdità, irrazionale e sembra un attacco MITM. So che Squid può già fare qualcosa di simile, ma questo articolo riguarda un metodo collaudato e funzionante che utilizza 3proxy del rispettato 3APA3A.

Successivamente, esamineremo in dettaglio il processo di creazione di 3proxy dal sorgente, la sua configurazione, il proxying completo e selettivo tramite NAT, la distribuzione dei canali su diversi server proxy esterni, nonché l'uso di un router e percorsi statici. Usiamo Debian 9 x64 come sistema operativo. Inizio!

Installazione di 3proxy ed esecuzione di un normale server proxy

1. Installa ifconfig (dal pacchetto net-tools)
apt-get install net-tools
2. Installa Midnight Commander
apt-get install mc
3. Ora abbiamo 2 interfacce:
enp0s3 - esterno, guarda Internet
enp0s8 - interno, deve esaminare la rete locale
Su altre distribuzioni basate su Debian le interfacce sono solitamente denominate eth0 ed eth1.
ifconfig -a

interfacceenp0s3: flag=4163 mt 1500
inet 192.168.23.11 maschera di rete 255.255.255.0 trasmesso 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Pacchetti RX 6412 byte 8676619 (8.2 MiB)
Errori RX 0 eliminati 0 superamenti 0 frame 0
Pacchetti TX 1726 byte 289128 (282.3 KiB)
Errori TX 0 eliminati 0 superamenti 0 portante 0 collisioni 0

enp0s8: flag=4098 mt 1500
etere 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Pacchetti RX 0 byte 0 (0.0 B)
Errori RX 0 eliminati 0 superamenti 0 frame 0
Pacchetti TX 0 byte 0 (0.0 B)
Errori TX 0 eliminati 0 superamenti 0 portante 0 collisioni 0

lo: bandiere=73 Mtu 65536
inet 127.0.0.1 maschera di rete 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Loopback locale)
Pacchetti RX 0 byte 0 (0.0 B)
Errori RX 0 eliminati 0 superamenti 0 frame 0
Pacchetti TX 0 byte 0 (0.0 B)
Errori TX 0 eliminati 0 superamenti 0 portante 0 collisioni 0

L'interfaccia enp0s8 non è attualmente utilizzata, la abiliteremo quando vorremo utilizzare Proxy NAT o configurazione NAT. Sarebbe allora logico assegnargli un IP statico.

4. Iniziamo l'installazione di 3proxy

4.1 Installazione di pacchetti base per compilare 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'ultimo pacchetto 3proxy. Al momento in cui scrivo, l'ultima versione stabile era la 0.8.12 (18/04/2018). Scaricala dal sito ufficiale 3proxy

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

4.5. Decomprimiamo l'archivio scaricato

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

4.6. Vai alla directory decompressa per creare il programma

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

4.7. Successivamente, dobbiamo aggiungere una riga al file header in modo che il nostro server sia completamente anonimo (funziona davvero, tutto è controllato, gli IP dei client sono nascosti)

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

Aggiungi una riga

#define ANONYMOUS 1

Premi Ctrl+x e Invio per salvare le modifiche.

4.8. Iniziamo ad assemblare 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. Installa il programma sul sistema

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

4.10. Vai alla directory principale e controlla dove è stato installato il programma

root@debian9:/opt/proxy/3proxy-0.8.12# 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 directory home dell'utente

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

4.12. Vai alla directory in cui dovrebbe essere la configurazione

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

4.13. Crea un file vuoto e copia lì la configurazione

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

3proxy.confdemone
pidfile /home/scherzo/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
tester degli utenti:CL:1234
timeout 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"
ruotare 3
autenticità forte
lavare
consentire al tester
calzini -p3128
procura -p8080

Per salvare, premi Ctrl + Z

4.14. Creiamo un file pid in modo che non ci siano errori durante l'avvio.

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

Per salvare, premi Ctrl + Z

4.15. Lanciamo il server proxy!

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

4.16. Vediamo se il server è in ascolto sulle porte

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

registro netstatConnessioni Internet attive (solo server)
Proto Recv-Q Invia-Q Indirizzo locale Indirizzo esterno Stato PID/Nome programma
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ASCOLTA 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCOLTA 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* ASCOLTA 504/3proxy
tcp6 0 0 :::22 :::* ASCOLTA 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient

Come è stato scritto nella configurazione, il nostro proxy web ascolta la porta 8080, il proxy Socket5 ascolta la porta 3128.

4.17. Per avviare automaticamente il servizio proxy dopo un riavvio, è necessario aggiungerlo a cron.

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

Aggiungi una riga

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

Premiamo Invio, poiché cron dovrebbe vedere il carattere di fine riga e salvare il file.

Dovrebbe esserci un messaggio sull'installazione di un nuovo crontab.

crontab: installazione del nuovo crontab

4.18. Riavviamo il sistema e proviamo a connetterci tramite il browser al proxy. Per verificare utilizziamo il browser Firefox (per un proxy web) e il componente aggiuntivo FoxyProxy per calzini5 con autenticazione.

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

4.19. Dopo aver verificato il funzionamento del proxy dopo un riavvio, è possibile visualizzare i registri. Questo completa la configurazione del server proxy.

3 registro 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

Impostazione ed esecuzione della configurazione NAT proxy trasparente

In questa configurazione, tutti i dispositivi sulla rete interna funzioneranno in modo trasparente su Internet tramite un server proxy remoto. Assolutamente tutte le connessioni TCP verranno reindirizzate a uno o più server proxy (espande davvero la larghezza del canale, esempio di configurazione n. 2!). Il servizio DNS utilizzerà le funzionalità 3proxy (dnspr). UDP non “andrà” verso l'esterno, poiché non stiamo ancora utilizzando il meccanismo di inoltro (disabilitato per impostazione predefinita nel kernel Linux).

1. È ora di abilitare l'interfaccia enp0s8

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

/etc/network/interfaces# Questo file descrive le interfacce di rete disponibili sul vostro sistema
# E come per attivarli. Per ulteriori informazioni, vedere Interfacce (5).

fonte /etc/network/interfaces.d/*

# L'interfaccia di rete di loopback
auto è
iface lo inet loopback

# L'interfaccia di rete principale
consentire-hotplug enp0s3
iface enp0s3 inet dhcp

# L'interfaccia di rete secondaria
consentire-hotplug enp0s8
iface enp0s8 inet statico
indirizzo 192.168.201.254
maschera di rete 255.255.255.0

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

root@debian9:~# reboot

2. Controllo delle interfacce

root@debian9:~# ifconfig

registro ifconfigenp0s3: flag=4163 mt 1500
inet 192.168.23.11 maschera di rete 255.255.255.0 trasmesso 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Pacchetti RX 61 byte 7873 (7.6 KiB)
Errori RX 0 eliminati 0 superamenti 0 frame 0
Pacchetti TX 65 byte 10917 (10.6 KiB)
Errori TX 0 eliminati 0 superamenti 0 portante 0 collisioni 0

enp0s8: flag=4163 mt 1500
inet 192.168.201.254 maschera di rete 255.255.255.0 trasmesso 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 scopeid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Pacchetti RX 0 byte 0 (0.0 B)
Errori RX 0 eliminati 0 superamenti 0 frame 0
Pacchetti TX 8 byte 648 (648.0 B)
Errori TX 0 eliminati 0 superamenti 0 portante 0 collisioni 0

lo: bandiere=73 Mtu 65536
inet 127.0.0.1 maschera di rete 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Loopback locale)
Pacchetti RX 0 byte 0 (0.0 B)
Errori RX 0 eliminati 0 superamenti 0 frame 0
Pacchetti TX 0 byte 0 (0.0 B)
Errori TX 0 eliminati 0 superamenti 0 portante 0 collisioni 0

3. Tutto ha funzionato, ora devi 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. 1demone
pidfile /home/scherzo/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
timeout 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"
ruotare 3
lavare
autenticazione solo
dnspr
permettere *
genitore 1000 calzini5 INDIRIZZO_IP DEL PROXY_ESTERNO 3128 tester 1234
plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so trasparente_plugin
tcppm -i0.0.0.0 888 127.0.0.1 11111

4. Ora lanciamo 3proxy con la nuova configurazione
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

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

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

registro netstatConnessioni Internet attive (solo server)
Proto Recv-Q Invia-Q Indirizzo locale Indirizzo esterno Stato PID/Nome programma
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCOLTA 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ASCOLTA 354/3proxy
tcp6 0 0 :::22 :::* ASCOLTA 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 ad accettare eventuali connessioni TCP sulla porta 888, DNS sulla porta 53, in modo da poterle poi reindirizzare sul proxy remoto calzini5 e DNS Google 8.8.8.8. Tutto quello che dobbiamo fare è configurare netfilter (iptables) e le regole DHCP per l'emissione degli indirizzi.

8. Installa il pacchetto iptables-persistent e dhcpd

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

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

dhcpd.conf#dhcpd.conf
#
# File di configurazione di esempio per ISC dhcpd
#

# definizioni di opzioni comuni a tutte le reti supportate...
opzione nome dominio "esempio.org";
opzione server-nome-dominio ns1.example.org, ns2.example.org;

tempo di locazione predefinito 600;
tempo massimo di locazione 7200;

ddns-update-style nessuno;

# Se questo server DHCP è il server DHCP ufficiale per il locale
# rete, la direttiva autorevole non dovrebbe essere commentata.

autorevole;

# Una configurazione leggermente diversa per una sottorete interna.
sottorete 192.168.201.0 maschera di rete 255.255.255.0 {
intervallo 192.168.201.10 192.168.201.250;
opzione server-nome-dominio 192.168.201.254;
router opzionali 192.168.201.254;
opzione broadcast-address 192.168.201.255;
tempo di locazione predefinito 600;
tempo massimo di locazione 7200;
}

11. Riavviare e controllare il servizio sulla porta 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp

registro netstatConnessioni Internet attive (solo server)
Proto Recv-Q Invia-Q Indirizzo locale Indirizzo esterno Stato PID/Nome programma
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCOLTA 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ASCOLTA 310/3proxy
tcp6 0 0 :::22 :::* ASCOLTA 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
grezzo 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd

12. Non resta che 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 del canale, è possibile utilizzare più server proxy contemporaneamente. Il totale deve essere 1000. Le nuove connessioni vengono stabilite con una probabilità di 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 ai server proxy specificati.

Nota: se disponiamo di un proxy web, al posto di calzini5 dobbiamo scrivere connect, se calzini4, allora calzini4 (socks4 NON SUPPORTA L'AUTORIZZAZIONE DI LOGIN/PASSWORD!)

Esempio di configurazione del server proxy trasparente n. 2demone
pidfile /home/scherzo/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
maxconn 500
timeout 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"
ruotare 3
lavare
autenticazione solo
dnspr
permettere *

genitore 200 calzini5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 tester 1234
genitore 200 calzini5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 tester 1234
genitore 200 calzini5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 tester 1234
genitore 200 calzini5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 tester 1234
genitore 100 calzini5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 tester 1234
genitore 100 calzini5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 tester 1234

plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so trasparente_plugin
tcppm -i0.0.0.0 888 127.0.0.1 11111

Impostazione ed esecuzione della configurazione NAT + proxy trasparente

In questa configurazione utilizzeremo il consueto meccanismo NAT con proxy selettivo o completamente trasparente di singoli indirizzi o sottoreti. Gli utenti della rete interna lavoreranno con determinati servizi/sottoreti senza nemmeno rendersi conto che stanno lavorando tramite un proxy. Tutte le connessioni https funzionano correttamente, non è necessario generare/sostituire alcun certificato.

Innanzitutto, decidiamo quali sottoreti/servizi vogliamo proxy. Supponiamo che i proxy esterni si trovino dove opera un servizio come pandora.com. Ora resta da determinare le sue sottoreti/indirizzi.

1. Suono

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

2. Digita BGP 208.85.40.20 in Google

Andiamo al sito bgp.he.net/net/208.85.40.0/24#_netinfo
Si può vedere che la sottorete che sto cercando è AS40428 Pandora Media, Inc

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

Apertura dei prefissi v4

bgp.he.net/AS40428#_prefixes

Ecco le sottoreti richieste!

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, è necessario eseguire l'aggregazione. Vai al sito ip-calculator.ru/aggregate e copia il nostro elenco lì. Di conseguenza: 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. Cancella le regole di iptables

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

Abilita il meccanismo di inoltro 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

Per garantire che l'inoltro sia abilitato in modo permanente dopo un riavvio, modifichiamo il file

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

E decommenta la riga

net.ipv4.ip_forward = 1

Ctrl+X per salvare il file

5. Avvolgiamo le sottoreti di pandora.com in 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. Manteniamo le regole

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

Impostazione ed esecuzione del proxy trasparente tramite la configurazione del router

In questa configurazione, il server proxy trasparente può essere un PC separato o una macchina virtuale dietro un router domestico/aziendale. È sufficiente registrare percorsi statici sul router o sui dispositivi e l'intera sottorete utilizzerà un proxy senza la necessità di ulteriori impostazioni.

IMPORTANTE! È necessario che il nostro gateway riceva un IP statico dal router, oppure sia configurato per essere esso stesso statico.

1. Configurare un indirizzo gateway statico (adattatore enp0s3)

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

/etc/network/interfaces# Questo file descrive le interfacce di rete disponibili sul vostro sistema
# E come per attivarli. Per ulteriori informazioni, vedere Interfacce (5).

fonte /etc/network/interfaces.d/*

# L'interfaccia di rete di loopback
auto è
iface lo inet loopback

# L'interfaccia di rete principale
consentire-hotplug enp0s3
iface enp0s3 inet statico
indirizzo 192.168.23.2
maschera di rete 255.255.255.0
192.168.23.254 Gateway

# L'interfaccia di rete secondaria
consentire-hotplug enp0s8
iface enp0s8 inet statico
indirizzo 192.168.201.254
maschera di rete 255.255.255.0

2. Consenti ai dispositivi della 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. Manteniamo le regole
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Registriamo le sottoreti sul router

Elenco delle reti dei 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 installare 3proxy dal sorgente www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Ramo di sviluppo 3proxy su GitHub github.com/z3APA3A/3proxy/issues/274

Fonte: habr.com

Aggiungi un commento