Elementele de bază ale proxy-ului transparent folosind 3proxy și iptables/netfilter sau cum să „puneți totul printr-un proxy”

Î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 bgp.he.net/net/208.85.40.0/24#_netinfo
Se vede că subrețeaua pe care o caut este AS40428 Pandora Media, Inc

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

Deschiderea prefixelor v4

bgp.he.net/AS40428#_prefixes

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 ip-calculator.ru/aggregate și copiați lista noastră acolo. Ca rezultat - 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. Ș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 3proxy.ru

2. Instrucțiuni pentru instalarea 3proxy din sursă www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Ramura de dezvoltare 3proxy pe GitHub github.com/z3APA3A/3proxy/issues/274

Sursa: www.habr.com

Adauga un comentariu