În acest articol, ne propunem să explorăm posibilitățile de proxificare transparentă, care permite redirecționarea întregului sau a unei părți din trafic prin servere proxy externe, fără ca clienții să observe.
Când am început să rezolv această problemă, m-am confruntat cu o dificultate semnificativă – protocolul HTTPS. În vremurile de altă dată, proxificarea HTTP nu prezenta mari probleme, dar în cazul proxificării HTTPS, browserele indică o intervenție în protocol, iar aici se termină avantajul.
În instrucțiunile comune pentru serverul proxy Squid, se sugerează chiar generarea unui certificat propriu și instalarea acestuia pe clienți, ceea ce este complet absurd, cel puțin irațional și seamănă cu un atac MITM. Știu că Squid poate face ceva similar, dar acest articol se referă la o metodă verificată și funcțională folosind 3proxy de la respectatul 3APA3A.
În continuare, vom analiza în detaliu procesul de compilare a 3proxy din surse, configurarea sa, proxificarea completă și selectivă folosind NAT, distribuirea canalului pe mai multe servere proxy externe, precum și utilizarea unui router și a rutelor statice. Ca sistem de operare, vom folosi Debian 9 x64. Să începem!
Instalarea 3proxy și pornirea unui server proxy obișnuit
1. Instalăm ifconfig (din pachetul net-tools)
apt-get install net-tools
2. Instalăm Midnight Commander
apt-get install mc
3. Avem acum 2 interfețe:
enp0s3 — extern, conectat la internet
enp0s8 — intern, care ar trebui să fie conectat la rețeaua locală
În alte distribuții bazate pe Debian, interfețele sunt de obicei denumite eth0 și eth1.
ifconfig -a
Interfețeenp0s3: 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
Interfața enp0s8 nu este utilizată în momentul de față; o vom activa când dorim să utilizăm configurația Proxy NAT sau NAT. Acel moment va fi logic să asignăm un IP static.
4. Să începem instalarea 3proxy
4.1 Instalarea pachetelor de bază pentru compilarea 3proxy din surse
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Vom să creăm un folder pentru descărcarea arhivei cu sursele.
root@debian9:~# mkdir -p /opt/proxy
4.3. Vom intra în acest folder.
root@debian9:~# cd /opt/proxy
4.4. Acum vom descărca ultima versiune a pachetului 3proxy. La momentul scrierii articolului, cea mai recentă versiune stabilă era 0.8.12 (18/04/2018). O vom descărca de pe site-ul oficial 3proxy.
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. Vom dezarhiva arhiva descărcată.
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Trecem în directorul dezarhivat pentru a compila programul.
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. Apoi trebuie să adăugăm o linie în fișierul de antet, astfel încât serverul nostru să fie complet anonim (funcționează cu adevărat, totul a fost testat, IP-urile clienților sunt ascunse).
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Adăugăm linia.
#define ANONYMOUS 1
Apăsăm Ctrl+x și Enter pentru a salva modificările.
4.8. Începem compilarea programului.
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
Makelogmake[2]: Ieșire din directorul '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Ieșire din directorul '/opt/proxy/3proxy-0.8.12/src'
Nu sunt erori, continuăm.
4.9. Vom instala programul în sistem.
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Ne ducem în directorul rădăcină și verificăm unde a fost instalat programul.
root@debian9:~/opt/proxy/3proxy-0.8.12# cd ~/
root@debian9:~# whereis 3proxy
3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy
4.11. Vom crea un folder pentru fișierele de configurare și loguri în directorul home al utilizatorului.
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. Intrați în directorul unde ar trebui să fie configurația.
root@debian9:~# cd /home/joke/proxy/
4.13. Creăm un fișier gol și copiem acolo configurația.
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
Pentru a salva, apăsăm Ctrl + Z.
4.14. Vom crea un fișier pid pentru a evita erorile la pornire.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
Pentru a salva, apăsăm Ctrl + Z.
4.15. Pornim serverul proxy!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. Vom verifica dacă serverul ascultă pe porturi.
root@debian9:~/home/joke/proxy# netstat -nlp
log netstatConexiuni active pe Internet (doar servere)
Proto Recv-Q Send-Q Adresă locală Adresă străină Stare PID/Nume program
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
Așa cum era scris în configurație, web-proxy-ul ascultă pe portul 8080, iar Socks5-proxy-ul pe 3128.
4.17. Pentru pornirea automată a serviciului proxy după repornire, trebuie să-l adăugăm în cron.
root@debian9:~/home/joke/proxy# crontab -e
Adăugăm linia.
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Apăsăm Enter, deoarece cron trebuie să vadă caracterul de sfârșit de linie și salvăm fișierul.
Ar trebui să fie un mesaj despre instalarea unui nou crontab.
crontab: instalarea unui nou crontab
4.18. Să restartăm sistemul și să încercăm să ne conectăm prin browser la proxy. Vom folosi browserul Firefox (pentru web-proxy) și extensia FoxyProxy pentru socks5 cu autentificare.
root@debian9:~/home/joke/proxy# reboot
4.19. După ce am verificat funcționarea proxy-ului după reboot, putem verifica log-urile. Aceasta finalizează configurarea serverului proxy.
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
Configurarea și pornirea configurației Transparent Proxy NAT
În această configurație, toate dispozitivele din rețeaua internă vor funcționa transparent pe internet prin intermediul unui server proxy extern. Toate conexiunile TCP vor fi redirecționate către unul sau mai multe servere proxy (extinde realmente lățimea de bandă, exemplu de configurație nr. 2!). Serviciul DNS va folosi capabilitățile 3proxy (dnspr). UDP nu va putea ieși, deoarece nu folosim deocamdată mecanismul forward (opțiune dezactivată în mod implicit în nucleul Linux).
1. A sosit momentul să activăm interfața 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
Aici am atribuit interfeței enp0s8 o adresă statică 192.168.201.254 și o mască 255.255.255.0
Salvăm configurația cu Ctrl+X și ne restartăm
root@debian9:~# repornire
2. Verificăm interfețele
root@debian9:~# ifconfig
log ifconfigenp0s3: 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. Totul a reușit, acum trebuie să configurăm 3proxy pentru proxy-ing transparent.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Exemplu de configurare a serverului proxy transparent nr. 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 ADRESA_IP_PROXY_EXTERNA 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. Acum pornim 3proxy cu noua configurație
root@debian9:~/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Vom adăuga din nou în crontab
root@debian9:~/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Să vedem ce ascultă acum proxy-ul nostru
root@debian9:~# netstat -nlp
log netstatConexiuni active pe Internet (doar servere)
Proto Recv-Q Send-Q Adresă locală Adresă străină Stare PID/Nume program
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. Acum, proxy-ul este pregătit să accepte orice conexiuni TCP pe portul 888 și DNS pe portul 53, pentru a le redirecționa apoi către un proxy socks5 și DNS-ul Google 8.8.8.8. Trebuie să configurăm încă regulile netfilter (iptables) și DHCP pentru a distribui adresele.
8. Vom instala pachetul iptables-persistent și dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Modificăm fișierul de pornire pentru 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. Ne restartăm și verificăm serviciul pe portul 67
root@debian9:~# repornire
root@debian9:~# netstat -nlp
log netstatConexiuni active pe Internet (doar servere)
Proto Recv-Q Send-Q Adresă locală Adresă străină Stare PID/Nume program
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. Rămâne să redirecționăm toate cererile tcp pe portul 888 și să salvăm regula în 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. Pentru a extinde lățimea de bandă, se pot folosi mai multe servere proxy simultan. Suma totală trebuie să fie 1000. Noile conexiuni sunt stabilite cu o probabilitate de 0.2, 0.2, 0.2, 0.2, 0.1, 0.1 către serverele proxy specificate.
Notă: dacă avem un web-proxy, atunci în loc de socks5 trebuie să scriem connect, iar dacă este socks4, atunci socks4 (socks4 NU SUPORTĂ AUTORIZAREA CU USER/PAROLĂ!)
Exemplu de configurare pentru un server proxy transparent nr. 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_ADRESA_EXTERNA_PROXY#1 3128 tester 1234
parent 200 socks5 IP_ADRESA_EXTERNA_PROXY#2 3128 tester 1234
parent 200 socks5 IP_ADRESA_EXTERNA_PROXY#3 3128 tester 1234
parent 200 socks5 IP_ADRESA_EXTERNA_PROXY#4 3128 tester 1234
parent 100 socks5 IP_ADRESA_EXTERNA_PROXY#5 3128 tester 1234
parent 100 socks5 IP_ADRESA_EXTERNA_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
Configurarea și pornirea configurației NAT + Proxy Transparent
În această configurație, vom utiliza mecanismul obișnuit NAT cu proxy transparent parțial sau total pentru anumite adrese sau subrețele. Utilizatorii din rețeaua internă vor lucra cu anumite servicii/subrețele fără să-și dea seama că operează printr-un proxy. Toate conexiunile https funcționează perfect, nu este nevoie să generăm/să înlocuim certificate.
Să ne stabilim mai întâi ce subrețele/servicii dorim să le proxy-ăm. Să presupunem că serverele proxy externe se află acolo unde funcționează un astfel de serviciu, cum ar fi pandora.com. Acum trebuie să definim subrețelele/adresele sale.
1. Pingăm
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes of data.
2. Căutăm în Google BGP 208.85.40.20
Accesăm site-ul
Se observă că subrețeaua căutată este AS40428 Pandora Media, Inc
Deschidem prefixelor v4
Iată subrețelele căutate!
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. Pentru a reduce numărul de subrețele, trebuie să efectuăm agregarea. Accesăm site-ul și copiem acolo lista noastră. Rezultatul — 6 subrețele în loc 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. Curățăm regulile iptables
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Activăm mecanismul de forwarding și 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
Pentru ca forwarding-ul să fie activat permanent după repornire, modificăm fișierul
root@debian9:~# nano /etc/sysctl.conf
Și desfăcăm linia
net.ipv4.ip_forward = 1
Ctrl+X pentru a salva fișierul
5. Împachetăm subrețelele pandora.com în 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. Vom salva regulile
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configurare și lansare a configurației Transparent Proxy prin router
În această configurație, serverul proxy transparent poate fi un PC separat sau o mașină virtuală în spatele router-ului de acasă/corporativ. Este suficient să configurăm rute statice pe router sau pe dispozitive și întreaga subrețea va folosi proxy fără a necesita alte setări suplimentare.
IMPORTANT! Este necesar ca gateway-ul nostru să primească un IP static de la router sau să fie configurat pe static.
1. Configurăm adresa statică a gateway-ului (adaptor 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. Permitem dispozitivelor din subrețeaua 192.168.23.0/24 să utilizeze proxy-ul
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. Vom salva regulile
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Vom scrie subrețelele pe router
Lista rețelelor router-ului199.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
Materialele/resursele utilizate
1. Site-ul oficial al programului 3proxy
2. Instrucțiunea de instalare a 3proxy din surse
3. Ramura de dezvoltare a 3proxy pe GitHub
Sursa: habr.com
