În acest articol aș dori să vă dezvălui posibilitățile de proxy transparent, care vă permite să redirecționați tot sau o parte din trafic prin servere proxy externe absolut neobservate de clienți.
Când am început să rezolv această problemă, m-am confruntat cu faptul că implementarea ei a avut o problemă semnificativă - protocolul HTTPS. Pe vremurile bune, nu existau probleme speciale cu proxy-ul HTTP transparent, dar cu proxy-ul HTTPS, browserele raportează interferențe cu protocolul și acolo se termină fericirea.
În instrucțiunile comune pentru serverul proxy Squid, ei sugerează chiar să generați propriul certificat și să îl instalați pe clienți, ceea ce este cel puțin o prostie totală, irațională și arată ca un atac MITM. Știu că Squid poate face deja ceva similar, dar acest articol este despre o metodă dovedită și de lucru care folosește 3proxy de la respectatul 3APA3A.
În continuare, vom analiza în detaliu procesul de construire a 3proxy de la sursă, configurația acestuia, proxy complet și selectiv folosind NAT, distribuția canalului către mai multe servere proxy externe, precum și utilizarea unui router și a rutelor statice. Utilizăm Debian 9 x64 ca sistem de operare. ÎNCEPE!
Instalarea 3proxy și rularea unui server proxy obișnuit
1. Instalați ifconfig (din pachetul net-tools)
apt-get install net-tools
2. Instalați Midnight Commander
apt-get install mc
3. Acum avem 2 interfețe:
enp0s3 - extern, se uită la Internet
enp0s8 - intern, trebuie să caute în rețeaua locală
Pe alte distribuții bazate pe Debian, interfețele sunt de obicei numite eth0 și eth1.
ifconfig -a
Interfețeenp0s3: steaguri=4163 mtu 1500
inet 192.168.23.11 netmask 255.255.255.0 difuzare 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Pachete RX 6412 octeți 8676619 (8.2 MiB)
Erori RX 0 a scăzut 0 depășiri 0 cadru 0
Pachete TX 1726 octeți 289128 (282.3 KiB)
Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
enp0s8: steaguri=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Pachete RX 0 octeți 0 (0.0 B)
Erori RX 0 a scăzut 0 depășiri 0 cadru 0
Pachete TX 0 octeți 0 (0.0 B)
Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
iată: steaguri=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 bucla txqueuelen 1 (Loopback local)
Pachete RX 0 octeți 0 (0.0 B)
Erori RX 0 a scăzut 0 depășiri 0 cadru 0
Pachete TX 0 octeți 0 (0.0 B)
Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
Interfața enp0s8 nu este utilizată în prezent, o vom activa atunci când dorim să folosim configurația Proxy NAT sau NAT. Atunci ar fi logic să îi atribuim un IP static.
4. Să începem să instalăm 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. Să creăm un folder pentru descărcarea arhivei cu surse
root@debian9:~# mkdir -p /opt/proxy
4.3. Să mergem la acest folder
root@debian9:~# cd /opt/proxy
4.4. Acum să descarcăm cel mai recent pachet 3proxy. La momentul scrierii, cea mai recentă versiune stabilă era 0.8.12 (18) Descărcați-o de pe site-ul oficial 04proxy
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. Să despachetăm arhiva descărcată
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Accesați directorul dezambalat pentru a construi programul
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. Apoi, trebuie să adăugăm o linie la fișierul antet, astfel încât serverul nostru să fie complet anonim (funcționează cu adevărat, totul este verificat, IP-urile clientului sunt ascunse)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Adăugați o linie
#define ANONYMOUS 1
Apăsați Ctrl+x și Enter pentru a salva modificările.
4.8. Să începem asamblarea programului
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
Makelogmake[2]: Ieșim din directorul „/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin”
make[1]: Ieșim din directorul „/opt/proxy/3proxy-0.8.12/src”
Fără erori, să continuăm.
4.9. Instalați programul pe sistem
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Accesați directorul rădăcină și verificați 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. Să creăm un folder pentru fișierele de configurare și jurnalele în directorul principal al utilizatorului
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. Accesați directorul în care ar trebui să fie configurația
root@debian9:~# cd /home/joke/proxy/
4.13. Creați un fișier gol și copiați configurația acolo
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.confdaemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
tester utilizatori:CL:1234
timeouts 1 5 30 60 180 1800 16 60
log /home/joke/proxy/logs/3proxy.log D
format de jurnal „- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T”
rotiți 3
auth puternic
culoare
permite testerului
ciorapi -p3128
proxy -p8080
Pentru a salva, apăsați Ctrl + Z
4.14. Să creăm un fișier pid, astfel încât să nu existe erori în timpul pornirii.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
Pentru a salva, apăsați Ctrl + Z
4.15. Să lansăm serverul proxy!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. Să vedem dacă serverul ascultă pe porturi
root@debian9:~/home/joke/proxy# netstat -nlp
jurnal netstatConexiuni la internet active (numai servere)
Proto Recv-Q Trimitere-Q Adresă locală Adresă străină Stat PID/Nume program
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ASCULTĂ 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCULTĂ 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* ASCULTĂ 504/3proxy
tcp6 0 0 :::22 :::* ASCULTĂ 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient
După cum a fost scris în configurație, proxy-ul nostru web ascultă portul 8080, proxy-ul Socks5 ascultă portul 3128.
4.17. Pentru a porni automat serviciul proxy după o repornire, trebuie să îl adăugați la cron.
root@debian9:/home/joke/proxy# crontab -e
Adăugați o linie
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Apăsăm Enter, deoarece cron ar trebui să vadă caracterul de sfârșit de linie și salvăm fișierul.
Ar trebui să existe un mesaj despre instalarea unui nou crontab.
crontab: instalarea noului crontab
4.18. Să repornim sistemul și să încercăm să ne conectăm prin browser la proxy. Pentru a verifica, folosim browserul Firefox (pentru un proxy web) și add-on-ul FoxyProxy pentru socks5 cu autentificare.
root@debian9:/home/joke/proxy# reboot
4.19. După verificarea funcționării proxy-ului după o repornire, puteți vizualiza jurnalele. Aceasta finalizează configurarea serverului proxy.
3 jurnal proxy1542573996.018 PROXY.8080 00000 tester 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com:443_HT
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 rularea configurației Transparent Proxy NAT
În această configurație, toate dispozitivele din rețeaua internă vor funcționa în mod transparent pe Internet printr-un server proxy la distanță. Absolut toate conexiunile TCP vor fi redirecționate către unul sau mai multe servere proxy (extinde cu adevărat lățimea canalului, exemplul de configurare nr. 2!). Serviciul DNS va folosi capabilitățile 3proxy (dnspr). UDP nu va „merge” spre exterior, deoarece nu folosim încă mecanismul de avans (dezactivat implicit în nucleul Linux).
1. Este timpul să activați interfața enp0s8
root@debian9:~# nano /etc/network/interfaces
fișierul /etc/network/interfaces# Acest fișier descrie interfețele de rețea disponibile pe sistemul dumneavoastră
# și cum să le activezi. Pentru mai multe informații, consultați interfețe(5).
sursa /etc/network/interfaces.d/*
# Interfața de rețea loopback
ma ocupa
iface lo inet loopback
# Interfața de rețea principală
permit-hotplug enp0s3
iface enp0s3 inet dhcp
# Interfața de rețea secundară
permit-hotplug enp0s8
iface enp0s8 inet static
adresa 192.168.201.254
mască de rețea 255.255.255.0
Aici am atribuit interfeței enp0s8 o adresă statică 192.168.201.254 și o mască 255.255.255.0
Salvați configurația Ctrl+X și reporniți
root@debian9:~# reboot
2. Verificarea interfețelor
root@debian9:~# ifconfig
jurnal ifconfigenp0s3: steaguri=4163 mtu 1500
inet 192.168.23.11 netmask 255.255.255.0 difuzare 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
Pachete RX 61 octeți 7873 (7.6 KiB)
Erori RX 0 a scăzut 0 depășiri 0 cadru 0
Pachete TX 65 octeți 10917 (10.6 KiB)
Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
enp0s8: steaguri=4163 mtu 1500
inet 192.168.201.254 netmask 255.255.255.0 difuzare 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 scopeid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
Pachete RX 0 octeți 0 (0.0 B)
Erori RX 0 a scăzut 0 depășiri 0 cadru 0
Pachete TX 8 octeți 648 (648.0 B)
Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
iată: steaguri=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 bucla txqueuelen 1 (Loopback local)
Pachete RX 0 octeți 0 (0.0 B)
Erori RX 0 a scăzut 0 depășiri 0 cadru 0
Pachete TX 0 octeți 0 (0.0 B)
Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
3. Totul a funcționat, acum trebuie să configurați 3proxy pentru proxy 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
format de jurnal „- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T”
rotiți 3
culoare
auth iponly
dnspr
permite *
părinte 1000 șosete5 IP_ADDRESS OF EXTERNAL_PROXY 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 lansăm 3proxy cu noua configurație
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Adăugați 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
jurnal netstatConexiuni la internet active (numai servere)
Proto Recv-Q Trimitere-Q Adresă locală Adresă străină Stat PID/Nume program
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCULTĂ 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ASCULTĂ 354/3proxy
tcp6 0 0 :::22 :::* ASCULTĂ 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 gata să accepte orice conexiuni TCP pe portul 888, DNS pe portul 53, astfel încât acestea să poată fi apoi redirecționate către proxy-ul de la distanță socks5 și DNS Google 8.8.8.8. Tot ce trebuie să facem este să configuram netfilter (iptables) și regulile DHCP pentru emiterea adreselor.
8. Instalați pachetul iptables-persistent și dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Editați fișierul de pornire dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf
dhcpd.conf# dhcpd.conf
#
# Exemplu de fișier de configurare pentru ISC dhcpd
#
# definiții de opțiuni comune tuturor rețelelor acceptate...
opțiune nume-domeniu „example.org”;
opțiune domain-name-servers ns1.example.org, ns2.example.org;
timpul de leasing implicit 600;
max-lease-time 7200;
ddns-update-style none;
# Dacă acest server DHCP este serverul DHCP oficial pentru local
# rețea, directiva autorizată ar trebui să nu fie comentată.
autoritar;
# O configurație ușor diferită pentru o subrețea internă.
subrețea 192.168.201.0 netmask 255.255.255.0 {
interval 192.168.201.10 192.168.201.250;
opțiune domain-name-server 192.168.201.254;
routerele de opțiuni 192.168.201.254;
opțiune broadcast-address 192.168.201.255;
timpul de leasing implicit 600;
max-lease-time 7200;
}
11. Reporniți și verificați serviciul pe portul 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp
jurnal netstatConexiuni la internet active (numai servere)
Proto Recv-Q Trimitere-Q Adresă locală Adresă străină Stat PID/Nume program
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCULTĂ 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* ASCULTĂ 310/3proxy
tcp6 0 0 :::22 :::* ASCULTĂ 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
brut 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd
12. Tot ce rămâne este să redirecționați toate cererile tcp către portul 888 și să salvați 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ă a canalului, puteți utiliza mai multe servere proxy simultan. Totalul trebuie să fie 1000. Se stabilesc conexiuni noi cu o probabilitate de 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 la serverele proxy specificate.
Notă: dacă avem un proxy web, atunci în loc de socks5 trebuie să scriem connect, dacă socks4, atunci socks4 (socks4 NU SUPPORTĂ AUTORIZAREA LOGIN/PAROLA!)
Exemplu de configurare a serverului 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
format de jurnal „- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T”
rotiți 3
culoare
auth iponly
dnspr
permite *
părinte 200 șosete5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 tester 1234
părinte 200 șosete5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 tester 1234
părinte 200 șosete5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 tester 1234
părinte 200 șosete5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 tester 1234
părinte 100 șosete5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 tester 1234
părinte 100 șosete5 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
Configurarea și rularea configurației NAT + Transparent Proxy
În această configurație, vom folosi mecanismul obișnuit NAT cu proxy selectivă sau complet transparentă a adreselor sau subrețelelor individuale. Utilizatorii interni ai rețelei vor lucra cu anumite servicii/subrețele fără să-și dea seama că lucrează printr-un proxy. Toate conexiunile https funcționează bine, nu trebuie să fie generate/înlocuite certificate.
În primul rând, să decidem ce subrețele/servicii dorim să proxy. Să presupunem că proxy-urile externe sunt localizate acolo unde funcționează un serviciu precum pandora.com. Acum rămâne să-i determinăm subrețelele/adresele.
1. Ping
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) octeți de date.
2. Introduceți BGP 208.85.40.20 în Google
Să mergem pe site
Se vede că subrețeaua pe care o caut este AS40428 Pandora Media, Inc
Deschiderea prefixelor v4
Iată subrețelele necesare!
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ă efectuați agregarea. Accesați site-ul
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. Ștergeți regulile iptables
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Activați mecanismul înainte ș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 a ne asigura că redirecționarea este activată permanent după o repornire, să schimbăm fișierul
root@debian9:~# nano /etc/sysctl.conf
Și anulați comentariul
net.ipv4.ip_forward = 1
Ctrl+X pentru a salva fișierul
5. Împachetăm subrețele pandora.com într-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. Să păstrăm regulile
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configurarea și rularea Proxy-ului transparent prin configurarea routerului
În această configurație, serverul proxy transparent poate fi un computer separat sau o mașină virtuală în spatele unui router de acasă/corporație. Este suficient să înregistrați rute statice pe router sau dispozitive și întreaga subrețea va folosi un proxy fără a fi nevoie de setări suplimentare.
IMPORTANT! Este necesar ca gateway-ul nostru să primească un IP static de la router sau să fie configurat să fie static în sine.
1. Configurați o adresă de gateway statică (adaptor enp0s3)
root@debian9:~# nano /etc/network/interfaces
fișierul /etc/network/interfaces# Acest fișier descrie interfețele de rețea disponibile pe sistemul dumneavoastră
# și cum să le activezi. Pentru mai multe informații, consultați interfețe(5).
sursa /etc/network/interfaces.d/*
# Interfața de rețea loopback
ma ocupa
iface lo inet loopback
# Interfața de rețea principală
permit-hotplug enp0s3
iface enp0s3 inet static
adresa 192.168.23.2
mască de rețea 255.255.255.0
poarta de acces 192.168.23.254
# Interfața de rețea secundară
permit-hotplug enp0s8
iface enp0s8 inet static
adresa 192.168.201.254
mască de rețea 255.255.255.0
2. Permiteți dispozitivelor din subrețeaua 192.168.23.0/24 să utilizeze 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. Să păstrăm regulile
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Să înregistrăm subrețele pe router
Lista rețelelor de 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
Materiale/resurse utilizate
1. Site-ul oficial al programului 3proxy
2. Instrucțiuni pentru instalarea 3proxy din sursă
3. Ramura de dezvoltare 3proxy pe GitHub
Sursa: www.habr.com