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

In questo articolo desidero esplorare le possibilità del proxy trasparente, che consente di reindirizzare in modo completamente invisibile per i clienti tutto o parte del traffico attraverso server proxy esterni.

Quando ho iniziato a affrontare questo compito, mi sono imbattuto in un problema significativo: il protocollo HTTPS. Nei tempi passati non c'erano particolari problemi con il proxying HTTP, ma quando si tratta di proxying HTTPS, i browser segnalano un'intrusione nel protocollo e la situazione si complica.

Nelle comuni istruzioni per il server proxy Squid si propone persino di generare un proprio certificato e installarlo sui client, il che è decisamente insensato e sembra una sorta di attacco MITM. So che Squid è già in grado di gestire qualcosa di simile, ma in questo articolo parleremo di un metodo collaudato e funzionante con 3proxy, fornito dal rispettabile 3APA3A.

Di seguito approfondiremo il processo di compilazione di 3proxy dai sorgenti, la sua configurazione, la proxying completa e selettiva utilizzando NAT, la distribuzione della banda su più server proxy esterni, nonché l'uso di un router e di route statiche. Utilizziamo Debian 9 x64 come sistema operativo. Iniziamo!

Installazione di 3proxy e avvio di un server proxy standard

1. Installiamo ifconfig (dal pacchetto net-tools)
apt-get install net-tools
2. Installiamo Midnight Commander
apt-get install mc
3. Attualmente abbiamo 2 interfacce:
enp0s3 — esterna, si connette a Internet
enp0s8 — interna, deve connettersi alla rete locale
Negli altri sistemi operativi basati su Debian, le interfacce sono solitamente chiamate eth0 e 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 packets 6412 bytes 8676619 (8.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1726 bytes 289128 (282.3 KiB)
TX errors 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 packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 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 packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

L'interfaccia enp0s8 attualmente non è in uso, la attiveremo quando vorremo utilizzare la configurazione Proxy NAT o NAT. Sarà proprio in quel momento che avrà senso assegnargli un IP statico.

4. Iniziamo l'installazione di 3proxy

4.1 Installazione dei pacchetti di 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 Passiamo a 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 la 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 Passiamo alla 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 per rendere il nostro server completamente anonimo (funziona realmente, tutto verificato, l'IP dei clienti è nascosto)

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

Aggiungiamo la riga

#define ANONYMOUS 1

Premiamo Ctrl+x e Enter 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]: Leaving directory ‘/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin’
make[1]: Uscendo dalla directory ‘/opt/proxy/3proxy-0.8.12/src’

Nessun errore, continuiamo.

4.9. Installeremo il programma nel sistema

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

4.10. Passiamo alla radice e controlliamo 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 home dell'utente

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

4.12. Andiamo nella directory dove dovrebbe trovarsi il config

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

4.13. Creiamo un file vuoto e copiamo il config lì dentro

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 all'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 sta ascoltando le porte

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

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

Come indicato nella configurazione, il web proxy ascolta sulla porta 8080, mentre il proxy Socks5 sulla porta 3128.

4.17. Per impostare l'avvio automatico del servizio proxy dopo il riavvio, è necessario aggiungerlo al cron.

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

Aggiungiamo la riga

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

Premiamo Enter, poiché cron deve vedere il carattere di fine riga e salvare il file.

Dovrebbe apparire un messaggio di installazione del nuovo crontab.

crontab: installing new crontab

4.18. Riavviamo il sistema e proviamo a connetterci al proxy tramite il browser. Per la verifica 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 verificato il funzionamento del proxy dopo il riavvio, possiamo controllare i log. A questo punto, la configurazione del server proxy è completata.

3 proxy log1542573996.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 Transparent Proxy NAT

In this configuration, all devices on the internal network will operate transparently on the internet through a remote proxy server. Absolutely all TCP connections will be redirected to one or several (effectively extending bandwidth, see configuration example #2!) proxy servers. The DNS service will utilize the capabilities of 3proxy (dnspr). UDP will not be transmitted out, as we are currently not using the forwarding mechanism (disabled by default in the Linux kernel).

1. It's time to activate the enp0s8 interface

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

Here we assigned the enp0s8 interface a static address of 192.168.201.254 and a mask of 255.255.255.0
We save the config with Ctrl+X and reboot

root@debian9:~# riavvia

2. Checking the interfaces

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 errors 0 dropped 0 overruns 0 frame 0
TX packets 65 bytes 10917 (10.6 KiB)
TX errors 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 packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 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 packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

3. Everything is set up, now it is necessary to configure 3proxy for transparent proxying.

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

Example configuration of transparent proxy server #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
consenti *
genitore 1000 socks5 IP_АДРЕС_ВНЕШНЕГО_ПРОКСИ 3128 tester 1234
plugin /opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so plugin_trasparente
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 nuovamente al crontab
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

6. Verifichiamo quali porte sta ora ascoltando il nostro proxy
root@debian9:~# netstat -nlp

log netstatConnessioni Internet attive (solo server)
Proto Recv-Q Send-Q Indirizzo locale Indirizzo estero Stato PID/Nome 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 a ricevere qualsiasi connessione TCP sulla porta 888, DNS sulla porta 53, per poi reindirizzarli a un socks5 remoto — proxy e DNS Google 8.8.8.8. Ci resta da configurare le regole di 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.

autoritativo;

# 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 controlliamo il servizio sulla porta 67
root@debian9:~# riavvia
root@debian9:~# netstat -nlp

log netstatConnessioni Internet attive (solo server)
Proto Recv-Q Send-Q Indirizzo locale Indirizzo estero Stato PID/Nome 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. Devi 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 aumentare la larghezza di banda, è possibile utilizzare più server proxy contemporaneamente. La somma totale deve essere 1000. Nuove connessioni vengono stabilite con probabilità 0,2, 0,2, 0,2, 0,2, 0,1, 0,1 verso i server proxy specificati.

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

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
consenti *

parent 200 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO_1 3128 tester 1234
parent 200 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO_2 3128 tester 1234
parent 200 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO_3 3128 tester 1234
parent 200 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO_4 3128 tester 1234
parent 100 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO_5 3128 tester 1234
parent 100 socks5 IP_ADDRESS_DEL_PROXY_ESTERNO_6 3128 tester 1234

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

Impostazione e avvio della configurazione NAT + Proxy Trasparente

In questa configurazione utilizzeremo un comune meccanismo NAT con proxy trasparente selettivo o completo per indirizzi o sottoreti specifici. Gli utenti della rete interna interagiranno con determinati servizi/sottoreti senza nemmeno rendersi conto di stare lavorando attraverso un proxy. Tutte le connessioni https funzionano perfettamente, non è necessario generare/sostituire certificati.

Per prima cosa, definiamo quali sottoreti/servizi vogliamo proxy. Supponiamo che i server proxy esterni si trovino dove è attivo un servizio come pandora.com. Ora dobbiamo determinare le sue sottoreti/indirizzi.

1. Pinghiamo

root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes 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 vede 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 eseguire l'aggregazione. Andiamo sul sito ip-calculator.ru/aggregate e incolliamo la nostra lista. Come risultato, otteniamo 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. Ripuliamo le regole 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 sia abilitato in modo permanente dopo il riavvio, modifichiamo il file

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

E commentiamo la riga

net.ipv4.ip_forward = 1

Ctrl+X per salvare il file

5. Inoltriamo le sottoreti di pandora.com attraverso il 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 del proxy trasparente tramite router

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

IMPORTANTE! È necessario che il nostro gateway riceva un IP statico dal router oppure sia impostato su statico da solo.

1. Configurare 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. Consentire 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 utilizzati

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. Ramo di sviluppo di 3proxy su GitHub github.com/z3APA3A/3proxy/issues/274

Fonte: habr.com

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