Grunnleggende om gjennomsiktig proxying ved bruk av 3proxy og iptables/netfilter eller hvordan du "legger alt gjennom en proxy"

I denne artikkelen vil jeg avsløre mulighetene for transparent proxying, som lar deg omdirigere hele eller deler av trafikken gjennom eksterne proxy-servere helt ubemerket av klienter.

Da jeg begynte å løse dette problemet, ble jeg møtt med det faktum at implementeringen hadde ett betydelig problem - HTTPS-protokollen. I de gode gamle dager var det ingen spesielle problemer med gjennomsiktig HTTP-proxying, men med HTTPS-proxying rapporterer nettlesere interferens med protokollen og det er der lykken slutter.

I de vanlige instruksjonene for Squid-proxyserveren foreslår de til og med å generere ditt eget sertifikat og installere det på klienter, noe som i det minste er fullstendig tull, irrasjonelt og ser ut som et MITM-angrep. Jeg vet at Squid allerede kan gjøre noe lignende, men denne artikkelen handler om en velprøvd og arbeidsmetode ved å bruke 3proxy fra den respekterte 3APA3A.

Deretter vil vi se i detalj på prosessen med å bygge 3proxy fra kilden, dens konfigurasjon, full og selektiv proxying ved bruk av NAT, kanaldistribusjon til flere eksterne proxy-servere, samt bruk av en ruter og statiske ruter. Vi bruker Debian 9 x64 som operativsystem. Begynne!

Installere 3proxy og kjøre en vanlig proxy-server

1. Installer ifconfig (fra net-tools-pakken)
apt-get install net-tools
2. Installer Midnight Commander
apt-get install mc
3. Vi har nå 2 grensesnitt:
enp0s3 - ekstern, ser på Internett
enp0s8 - intern, må se inn i det lokale nettverket
På andre Debian-baserte distribusjoner kalles grensesnittene vanligvis eth0 og eth1.
ifconfig -a

Grensesnittenp0s3: flagg=4163 mtu 1500
inet 192.168.23.11 nettmaske 255.255.255.0 kringkasting 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefikslen 64 scopeid 0x20 eter 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-pakker 6412 byte 8676619 (8.2 MiB)
RX-feil 0 droppet 0 overskridelser 0 ramme 0
TX-pakker 1726 byte 289128 (282.3 KiB)
TX-feil 0 droppet 0 overskridelser 0 transportør 0 kollisjoner 0

enp0s8: flagg=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-pakker 0 byte 0 (0.0 B)
RX-feil 0 droppet 0 overskridelser 0 ramme 0
TX-pakker 0 byte 0 (0.0 B)
TX-feil 0 droppet 0 overskridelser 0 transportør 0 kollisjoner 0

lo: flagg=73 mtu 65536
inet 127.0.0.1 nettmaske 255.0.0.0
inet6 ::1 prefikslen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-pakker 0 byte 0 (0.0 B)
RX-feil 0 droppet 0 overskridelser 0 ramme 0
TX-pakker 0 byte 0 (0.0 B)
TX-feil 0 droppet 0 overskridelser 0 transportør 0 kollisjoner 0

Enp0s8-grensesnittet brukes ikke for øyeblikket, vi vil aktivere det når vi vil bruke Proxy NAT eller NAT-konfigurasjon. Det er da det ville være logisk å tildele den en statisk IP.

4. La oss begynne å installere 3proxy

4.1 Installere grunnleggende pakker for kompilering av 3proxy fra kilder

root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y

4.2. La oss lage en mappe for nedlasting av arkivet med kilder

root@debian9:~# mkdir -p /opt/proxy

4.3. La oss gå til denne mappen

root@debian9:~# cd /opt/proxy

4.4. La oss nå laste ned den nyeste 3proxy-pakken. I skrivende stund var den siste stabile versjonen 0.8.12 (18/04/2018) Last den ned fra det offisielle 3proxy-nettstedet

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

4.5. La oss pakke ut det nedlastede arkivet

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

4.6. Gå til den utpakkede katalogen for å bygge programmet

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

4.7. Deretter må vi legge til en linje i overskriftsfilen slik at serveren vår er helt anonym (det fungerer virkelig, alt er sjekket, klient-IP-er er skjult)

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

Legg til en linje

#define ANONYMOUS 1

Trykk Ctrl+x og Enter for å lagre endringene.

4.8. La oss begynne å sette sammen programmet

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

Makelogmake[2]: Forlater katalogen '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Forlater katalogen '/opt/proxy/3proxy-0.8.12/src'

Ingen feil, la oss fortsette.

4.9. Installer programmet på systemet

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

4.10. Gå til rotkatalogen og sjekk hvor programmet ble installert

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

3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy

4.11. La oss lage en mappe for konfigurasjonsfiler og logger i brukerens hjemmekatalog

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

4.12. Gå til katalogen der konfigurasjonen skal være

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

4.13. Opprett en tom fil og kopier konfigurasjonen der

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

3proxy.confdaemon
pidfil /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
brukertester: CL:1234
tidsavbrudd 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"
roter 3
auth sterk
flush
tillate tester
sokker -p3128
proxy -p8080

For å lagre, trykk Ctrl + Z

4.14. La oss lage en pid-fil slik at det ikke er noen feil under oppstart.

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

For å lagre, trykk Ctrl + Z

4.15. La oss starte proxy-serveren!

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

4.16. La oss se om serveren lytter på porter

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

netstat-loggAktive Internett-tilkoblinger (bare servere)
Proto Recv-Q Send-Q Lokal adresse Utenlandsk adresse Oppgi PID/programnavn
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LYTT 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:* LYTT 504/3proxy
tcp6 0 0 :::22 :::* LYTT 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhklient

Som det ble skrevet i konfigurasjonen, lytter vår nettproxy til port 8080, Socks5-proxy lytter til port 3128.

4.17. For å autostarte proxy-tjenesten etter en omstart, må du legge den til cron.

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

Legg til en linje

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

Vi trykker på Enter, siden cron skal se slutten av linjens tegn, og lagrer filen.

Det skal være en melding om installasjon av en ny crontab.

crontab: installerer ny crontab

4.18. La oss starte systemet på nytt og prøve å koble til proxyen via nettleseren. For å sjekke bruker vi Firefox-nettleseren (for en nettproxy) og FoxyProxy-tillegget for socks5 med autentisering.

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

4.19. Etter å ha kontrollert driften av proxyen etter en omstart, kan du se loggene. Dette fullfører proxy-serveroppsettet.

3 proxy-logg1542573996.018 PROXY.8080 00000 tester 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com/443_HTTP
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

Sette opp og kjøre Transparent Proxy NAT-konfigurasjon

I denne konfigurasjonen vil alle enheter på det interne nettverket operere transparent på Internett gjennom en ekstern proxy-server. Absolutt alle TCP-tilkoblinger vil bli omdirigert til en eller flere (øker virkelig kanalbredden, konfigurasjonseksempel nr. 2!) proxy-servere. DNS-tjenesten vil bruke 3proxy (dnspr)-funksjoner. UDP vil ikke "gå" utover, siden vi ennå ikke bruker videresendingsmekanismen (deaktivert som standard i Linux-kjernen).

1. Det er på tide å aktivere enp0s8-grensesnittet

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

/etc/network/interfaces-filen# Denne filen beskriver nettverksgrensesnitt som er tilgjengelige på systemet
# Aktivert og hvordan dem. For mer informasjon, se grensesnitt (5).

kilde /etc/network/interfaces.d/*

# Den interne nettverksenheten loopback
auto det
iface lo inet loopback

# Det primære nettverksgrensesnittet
tillat-hotplug enp0s3
iface enp0s3 inet dhcp

# Det sekundære nettverksgrensesnittet
tillat-hotplug enp0s8
iface enp0s8 inet statisk
adresse 192.168.201.254
nettmaske 255.255.255.0

Her tildelte vi enp0s8-grensesnittet en statisk adresse 192.168.201.254 og en maske 255.255.255.0
Lagre konfigurasjonen Ctrl+X og start på nytt

root@debian9:~# reboot

2. Sjekke grensesnittene

root@debian9:~# ifconfig

ifconfig-loggenp0s3: flagg=4163 mtu 1500
inet 192.168.23.11 nettmaske 255.255.255.0 kringkasting 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefikslen 64 scopeid 0x20 eter 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-pakker 61 byte 7873 (7.6 KiB)
RX-feil 0 droppet 0 overskridelser 0 ramme 0
TX-pakker 65 byte 10917 (10.6 KiB)
TX-feil 0 droppet 0 overskridelser 0 transportør 0 kollisjoner 0

enp0s8: flagg=4163 mtu 1500
inet 192.168.201.254 nettmaske 255.255.255.0 kringkasting 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefikslen 64 scopeid 0x20 eter 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-pakker 0 byte 0 (0.0 B)
RX-feil 0 droppet 0 overskridelser 0 ramme 0
TX-pakker 8 byte 648 (648.0 B)
TX-feil 0 droppet 0 overskridelser 0 transportør 0 kollisjoner 0

lo: flagg=73 mtu 65536
inet 127.0.0.1 nettmaske 255.0.0.0
inet6 ::1 prefikslen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-pakker 0 byte 0 (0.0 B)
RX-feil 0 droppet 0 overskridelser 0 ramme 0
TX-pakker 0 byte 0 (0.0 B)
TX-feil 0 droppet 0 overskridelser 0 transportør 0 kollisjoner 0

3. Alt ordnet seg, nå må du konfigurere 3proxy for transparent proxying.

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

Eksempelkonfigurasjon av transparent proxy-server nr. 1daemon
pidfil /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
tidsavbrudd 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"
roter 3
flush
auth iponly
dnspr
tillat *
foreldre 1000 sokker5 IP_ADRESSE AV 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. Nå starter vi 3proxy med den nye konfigurasjonen
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Legg til i crontab igjen
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

6. La oss se hva proxyen vår lytter til nå
root@debian9:~# netstat -nlp

netstat-loggAktive Internett-tilkoblinger (bare servere)
Proto Recv-Q Send-Q Lokal adresse Utenlandsk adresse Oppgi PID/programnavn
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:* LYTT 354/3proxy
tcp6 0 0 :::22 :::* LYTT 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/dhklient

7. Nå er proxyen klar til å akseptere alle TCP-tilkoblinger på port 888, DNS på port 53, slik at de deretter kan omdirigeres til den eksterne socks5-proxyen og DNS Google 8.8.8.8. Alt vi trenger å gjøre er å konfigurere netfilter (iptables) og DHCP-regler for utstedelse av adresser.

8. Installer iptables-persistent og dhcpd-pakken

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

9. Rediger oppstartsfilen for dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf

dhcpd.conf# dhcpd.conf
#
# Eksempel på konfigurasjonsfil for ISC dhcpd
#

# alternativdefinisjoner felles for alle støttede nettverk...
alternativ domenenavn "example.org";
alternativ domenenavn-tjenere ns1.example.org, ns2.example.org;

standard leietid 600;
maks-leietid 7200;

ddns-update-stil ingen;

# Hvis denne DHCP-serveren er den offisielle DHCP-serveren for den lokale
# nettverk, bør det autoritative direktivet være ukommentert.

autoritær;

# En litt annen konfigurasjon for et internt subnett.
undernett 192.168.201.0 nettmaske 255.255.255.0 {
rekkevidde 192.168.201.10 192.168.201.250;
alternativ domenenavn-servere 192.168.201.254;
opsjonsrutere 192.168.201.254;
alternativ kringkastingsadresse 192.168.201.255;
standard leietid 600;
maks-leietid 7200;
}

11. Start på nytt og sjekk tjenesten på port 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp

netstat-loggAktive Internett-tilkoblinger (bare servere)
Proto Recv-Q Send-Q Lokal adresse Utenlandsk adresse Oppgi PID/programnavn
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:* LYTT 310/3proxy
tcp6 0 0 :::22 :::* LYTT 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/dhklient
udp6 0 0 :::31728 :::* 393/dhcpd
rå 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd

12. Alt som gjenstår er å omdirigere alle tcp-forespørsler til port 888 og lagre regelen i 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. For å utvide kanalbåndbredden kan du bruke flere proxy-servere samtidig. Totalen må være 1000. Nye forbindelser opprettes med en sannsynlighet på 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 til de angitte proxy-serverne.

Merk: hvis vi har en nettproxy, må vi i stedet for socks5 skrive connect, if socks4, så socks4 (socks4 STØTTER IKKE PÅLOGGING/PASSORDAUTORISERING!)

Eksempelkonfigurasjon av transparent proxy-server nr. 2daemon
pidfil /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
maxconn 500
tidsavbrudd 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"
roter 3
flush
auth iponly
dnspr
tillat *

foreldre 200 sokker5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 tester 1234
foreldre 200 sokker5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 tester 1234
foreldre 200 sokker5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 tester 1234
foreldre 200 sokker5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 tester 1234
foreldre 100 sokker5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 tester 1234
foreldre 100 sokker5 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

Sette opp og kjøre NAT + Transparent Proxy-konfigurasjon

I denne konfigurasjonen vil vi bruke den vanlige NAT-mekanismen med selektiv eller full gjennomsiktig proxying av individuelle adresser eller subnett. Interne nettverksbrukere vil jobbe med visse tjenester/undernett uten engang å innse at de jobber gjennom en proxy. Alle https-tilkoblinger fungerer fint, ingen sertifikater må genereres/erstattes.

Først, la oss bestemme hvilke undernett/tjenester vi ønsker å gi proxy. La oss anta at eksterne proxyer er plassert der en tjeneste som pandora.com opererer. Nå gjenstår det å bestemme subnettene/adressene.

1. Ping

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

2. Skriv inn BGP 208.85.40.20 i Google

La oss gå til siden bgp.he.net/net/208.85.40.0/24#_netinfo
Det kan sees at subnettet jeg ser etter er AS40428 Pandora Media, Inc

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

Åpning av v4-prefikser

bgp.he.net/AS40428#_prefikser

Her er de nødvendige undernettene!

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. For å redusere antall undernett, må du utføre aggregering. Gå til siden ip-calculator.ru/aggregate og kopier listen vår dit. Som et resultat - 6 undernett i stedet for 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. Klare iptables-regler

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

Aktiver forover- og NAT-mekanismen

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

For å sikre at videresending er aktivert permanent etter en omstart, la oss endre filen

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

Og avkommenter linjen

net.ipv4.ip_forward = 1

Ctrl+X for å lagre filen

5. Vi pakker pandora.com-undernett i en 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. La oss holde reglene

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

Sette opp og kjøre Transparent Proxy via ruterkonfigurasjon

I denne konfigurasjonen kan den transparente proxy-serveren være en separat PC eller en virtuell maskin bak en hjemme-/bedriftsruter. Det er nok å registrere statiske ruter på ruteren eller enhetene, og hele subnettet vil bruke en proxy uten behov for ytterligere innstillinger.

VIKTIG! Det er nødvendig at gatewayen vår mottar en statisk IP fra ruteren, eller er konfigurert til å være statisk selv.

1. Konfigurer en statisk gateway-adresse (enp0s3-adapter)

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

/etc/network/interfaces-filen# Denne filen beskriver nettverksgrensesnitt som er tilgjengelige på systemet
# Aktivert og hvordan dem. For mer informasjon, se grensesnitt (5).

kilde /etc/network/interfaces.d/*

# Den interne nettverksenheten loopback
auto det
iface lo inet loopback

# Det primære nettverksgrensesnittet
tillat-hotplug enp0s3
iface enp0s3 inet statisk
adresse 192.168.23.2
nettmaske 255.255.255.0
192.168.23.254 gateway

# Det sekundære nettverksgrensesnittet
tillat-hotplug enp0s8
iface enp0s8 inet statisk
adresse 192.168.201.254
nettmaske 255.255.255.0

2. Tillat enheter fra undernettverket 192.168.23.0/24 å bruke proxy-tjener

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. La oss holde reglene
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. La oss registrere subnett på ruteren

Ruternettverksliste+199.116.161.0 255.255.255.0 192.168.23.2 XNUMX
+199.116.162.0 255.255.255.0 192.168.23.2 XNUMX
+199.116.164.0 255.255.254.0 192.168.23.2 XNUMX
+208.85.40.0 255.255.252.0 192.168.23.2 XNUMX
+208.85.44.0 255.255.255.0 192.168.23.2 XNUMX
+208.85.46.0 255.255.254.0 192.168.23.2 XNUMX

Materialer/ressurser brukt

1. Offisiell nettside til 3proxy-programmet 3proxy.ru

2. Instruksjoner for å installere 3proxy fra kilden www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. 3proxy utviklingsgren på GitHub github.com/z3APA3A/3proxy/issues/274

Kilde: www.habr.com

Legg til en kommentar