Det grundlæggende i gennemsigtig proxying ved hjælp af 3proxy og iptables / netfilter eller hvordan man "sætter alt gennem en proxy"

I denne artikel vil jeg gerne afsløre mulighederne for gennemsigtig proxying, som giver dig mulighed for helt ubemærket af klienter at omdirigere hele eller en del af trafikken gennem eksterne proxy-servere.

Da jeg begyndte at løse dette problem, stødte jeg på det faktum, at implementeringen har et væsentligt problem - HTTPS-protokollen. I de gode gamle dage var der ingen særlige problemer med transparent HTTP-proxy, men med HTTPS-proxy rapporterer browsere protokolinterferens, og det er her, lykken ender.

I almindelige instruktioner til Squid proxy-serveren tilbyder de endda at generere deres eget certifikat og installere det på klienter, hvilket er komplet nonsens i det mindste irrationelt og ligner et MITM-angreb. Jeg ved, at Squid allerede ved, hvordan man gør noget lignende, men denne artikel handler om en gennemprøvet og arbejdsmetode ved hjælp af 3proxy fra den respekterede 3APA3A.

Dernæst vil vi tage et detaljeret kig på processen med at bygge 3proxy fra kilden, dens konfiguration, fuld og selektiv proxy ved hjælp af NAT, distribution af kanalen til flere eksterne proxy-servere samt brugen af ​​en router og statiske ruter. Vi bruger Debian 9 x64 som OS. Begynde!

Installerer 3proxy og kører en normal proxy

1. Installer ifconfig (fra net-tools-pakken)
apt-get install net-tools
2. Installer Midnighth Commander
apt-get install mc
3. Vi har nu 2 grænseflader:
enp0s3 - ekstern, ser på internettet
enp0s8 - intern, skal kigge ind i det lokale netværk
I andre Debian-baserede distributioner hedder grænsefladerne normalt eth0 og eth1.
ifconfig -a

Interfacesenp0s3: flag=4163 mtu 1500
inet 192.168.23.11 netmaske 255.255.255.0 udsendelse 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 præfikslen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-pakker 6412 bytes 8676619 (8.2 MiB)
RX-fejl 0 faldt 0 overskridelser 0 frame 0
TX-pakker 1726 bytes 289128 (282.3 KiB)
TX fejl 0 faldt 0 overskridelser 0 transportør 0 kollisioner 0

enp0s8: flag=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-pakker 0 bytes 0 (0.0 B)
RX-fejl 0 faldt 0 overskridelser 0 frame 0
TX-pakker 0 bytes 0 (0.0 B)
TX fejl 0 faldt 0 overskridelser 0 transportør 0 kollisioner 0

lo: flag=73 mtu 65536
inet 127.0.0.1 netmaske 255.0.0.0
inet6 ::1 præfikslen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-pakker 0 bytes 0 (0.0 B)
RX-fejl 0 faldt 0 overskridelser 0 frame 0
TX-pakker 0 bytes 0 (0.0 B)
TX fejl 0 faldt 0 overskridelser 0 transportør 0 kollisioner 0

Enp0s8-grænsefladen bruges ikke i øjeblikket, vi aktiverer den, når vi vil bruge Proxy NAT- eller NAT-konfigurationen. Det er da, at det ville være logisk at tildele en statisk ip til den.

4. Lad os begynde at installere 3proxy

4.1 Installation af basispakker til kompilering af 3proxy fra kilden

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

4.2. Opret en mappe til at downloade arkivet med kilder

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

4.3. Lad os gå til denne mappe

root@debian9:~# cd /opt/proxy

4.4. Lad os nu downloade den seneste 3proxy-pakke. På tidspunktet for skrivningen var den seneste stabile version 0.8.12 (18/04/2018) Download den fra den officielle 3proxy hjemmeside

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

4.5. Pak det downloadede arkiv ud

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

4.6. Gå til den udpakkede mappe for at bygge programmet

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

4.7. Dernæst skal du tilføje en linje til header-filen, så vores server er fuldstændig anonym (det virker virkelig, alt er tjekket, klient-ips er skjult)

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

Tilføjelse af en linje

#define ANONYMOUS 1

Tryk på Ctrl+x og Enter for at gemme ændringer.

4.8. Lad os bygge programmet

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

makelogmake[2]: Forlader mappen '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Forlader mappen '/opt/proxy/3proxy-0.8.12/src'

Ingen fejl, fortsæt.

4.9. Installer programmet på systemet

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

4.10. Gå til rodmappen og kontroller, hvor programmet er installeret

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

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

4.11. Lad os oprette en mappe til konfigurationsfiler og logfiler i brugerens hjemmemappe

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

4.12. Gå til den mappe, hvor konfigurationen skal være

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

4.13. Opret en tom fil og kopier konfigurationen dertil

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

3proxy.confdaemon
pidfil /home/joke/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
brugertester: 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"
drej 3
auth stærk
flush
tillade tester
sokker -p3128
proxy -p8080

For at gemme skal du trykke på Ctrl + Z

4.14. Lad os oprette en pid-fil, så der ikke er nogen startfejl.

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

For at gemme skal du trykke på Ctrl + Z

4.15. Lad os starte proxy-serveren!

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

4.16. Lad os se, om serveren lytter på porte

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

netstat logAktive internetforbindelser (kun servere)
Proto Recv-Q Send-Q Lokal adresse Udenlandsk adresse Tilstand PID/programnavn
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LYT 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* LYT 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LYT 504/3proxy
tcp6 0 0 :::22 :::* LYT 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient

Som det blev skrevet i konfigurationen, lytter webproxyen på port 8080, Socks5 proxy - 3128.

4.17. For at autostarte proxy-tjenesten efter en genstart skal du tilføje den til cron.

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

Tilføjelse af en linje

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

Vi trykker på Enter, da cron skulle se slutningen af ​​linjen og gemme filen.

Der skulle være en besked om installation af en ny crontab.

crontab: installerer ny crontab

4.18. Lad os genstarte systemet og prøve at oprette forbindelse via browseren til proxyen. Til verifikation bruger vi Firefox-browseren (til en webproxy) og FoxyProxy-tilføjelsen til socks5 med godkendelse.

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

4.19. Efter at have kontrolleret proxyens arbejde efter genstarten, kan du se logfilerne. Dette fuldfører proxyserveropsætningen.

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

Opsætning og kørsel af Transparent Proxy NAT-konfigurationen

I denne konfiguration vil alle enheder på det interne netværk gennemsigtigt arbejde på internettet via en ekstern proxyserver. Absolut alle tcp-forbindelser vil blive omdirigeret til en eller flere (udvider virkelig kanalbredden, konfigurationseksempel nr. 2!) proxyservere. DNS-tjenesten vil bruge 3proxy (dnspr)-funktioner. UDP vil ikke "gå" udenfor, da vi endnu ikke bruger fremsendelsesmekanismen (deaktiveret som standard i Linux-kernen).

1. Det er tid til at aktivere enp0s8-grænsefladen

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

/etc/network/interfaces fil# Denne fil beskriver de netværksgrænseflader tilgængelige på dit system
# Aktiveret og hvordan Them. For mere information, se grænseflader (5).

kilde /etc/network/interfaces.d/*

# Den loopback netværksinterface
auto lo
iface lo inet loopback

# Den primære netværksgrænseflade
tillad-hotplug enp0s3
iface enp0s3 inet dhcp

# Den sekundære netværksgrænseflade
tillad-hotplug enp0s8
iface enp0s8 inet statisk
adresse 192.168.201.254
netmask 255.255.255.0

Her tildelte vi enp0s8-grænsefladen en statisk adresse 192.168.201.254 og en maske 255.255.255.0
Gem config Ctrl+X og genstart

root@debian9:~# reboot

2. Kontrol af grænseflader

root@debian9:~# ifconfig

ifconfig logenp0s3: flag=4163 mtu 1500
inet 192.168.23.11 netmaske 255.255.255.0 udsendelse 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 præfikslen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-pakker 61 bytes 7873 (7.6 KiB)
RX-fejl 0 faldt 0 overskridelser 0 frame 0
TX-pakker 65 bytes 10917 (10.6 KiB)
TX fejl 0 faldt 0 overskridelser 0 transportør 0 kollisioner 0

enp0s8: flag=4163 mtu 1500
inet 192.168.201.254 netmaske 255.255.255.0 udsendelse 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 præfikslen 64 scopeid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-pakker 0 bytes 0 (0.0 B)
RX-fejl 0 faldt 0 overskridelser 0 frame 0
TX-pakker 8 bytes 648 (648.0 B)
TX fejl 0 faldt 0 overskridelser 0 transportør 0 kollisioner 0

lo: flag=73 mtu 65536
inet 127.0.0.1 netmaske 255.0.0.0
inet6 ::1 præfikslen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-pakker 0 bytes 0 (0.0 B)
RX-fejl 0 faldt 0 overskridelser 0 frame 0
TX-pakker 0 bytes 0 (0.0 B)
TX fejl 0 faldt 0 overskridelser 0 transportør 0 kollisioner 0

3. Alt fungerede, nu skal du konfigurere 3proxy til gennemsigtig proxying.

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

Gennemsigtig proxy-konfigurationseksempel #1daemon
pidfil /home/joke/proxy/3proxy.pid
server 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"
drej 3
flush
auth unikt
dnspr
give lov til *
forældre 1000 sokker5 IP_ADDRESS_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. Kør nu 3proxy med ny config
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Føj til crontab igen
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

6. Lad os se, hvad vores proxy lytter til nu
root@debian9:~# netstat -nlp

netstat logAktive internetforbindelser (kun servere)
Proto Recv-Q Send-Q Lokal adresse Udenlandsk adresse Tilstand PID/programnavn
tcp 0 0 0.0.0.0:22 0.0.0.0:* LYT 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* LYT 354/3proxy
tcp6 0 0 :::22 :::* LYT 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. Nu er proxyen klar til at acceptere alle TCP-forbindelser på port 888, DNS på port 53, så de derefter kan omdirigeres til remote socks5 - proxy og DNS Google 8.8.8.8. Det er tilbage for os at konfigurere netfilteret (iptables) og DHCP-reglerne for udstedelse af adresser.

8. Installer iptables-persistent og dhcpd-pakken

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

9. Rediger dhcpd-startfilen
root@debian9:~# nano /etc/dhcp/dhcpd.conf

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

# indstillingsdefinitioner, der er fælles for alle understøttede netværk...
option domænenavn "example.org";
mulighed domænenavneservere ns1.example.org, ns2.example.org;

standard-lejetid 600;
max-leje-tid 7200;

ddns-update-stil ingen;

# Hvis denne DHCP-server er den officielle DHCP-server for den lokale
# netværk, bør det autoritative direktiv være ukommenteret.

autoritativ;

# En lidt anderledes konfiguration for et internt undernet.
undernet 192.168.201.0 netmaske 255.255.255.0 {
område 192.168.201.10 192.168.201.250;
option domænenavn-servere 192.168.201.254;
option routere 192.168.201.254;
option udsendelsesadresse 192.168.201.255;
standard-lejetid 600;
max-leje-tid 7200;
}

11. Genstart og tjek tjenesten på port 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp

netstat logAktive internetforbindelser (kun servere)
Proto Recv-Q Send-Q Lokal adresse Udenlandsk adresse Tilstand PID/programnavn
tcp 0 0 0.0.0.0:22 0.0.0.0:* LYT 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* LYT 310/3proxy
tcp6 0 0 :::22 :::* LYT 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
rå 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd

12. Det er tilbage at omdirigere alle tcp-anmodninger til port 888 og gemme reglen 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 at udvide kanalens båndbredde kan du bruge flere proxyservere på én gang. Det samlede beløb skal være 1000. Nye forbindelser etableres med en sandsynlighed på 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 til de angivne proxyservere.

Bemærk: hvis vi har en webproxy, så skal du i stedet for socks5 skrive connect, if socks4, så socks4 (socks4 UNDERSTØTTER IKKE LOGIN / ADGANGSKODEGODKENDELSE!)

Gennemsigtig proxy-konfigurationseksempel #2daemon
pidfil /home/joke/proxy/3proxy.pid
server 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"
drej 3
flush
auth unikt
dnspr
give lov til *

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

Opsætning og kørsel af NAT + Transparent Proxy-konfiguration

I denne konfiguration vil vi bruge den sædvanlige NAT-mekanisme med selektiv eller fuld gennemsigtig proxying af individuelle adresser eller undernet. Brugere af det interne netværk vil arbejde med visse tjenester/undernet uden selv at være klar over, at de arbejder gennem en proxy. Alle https-forbindelser fungerer fint, ingen certifikater skal genereres/udskiftes.

Lad os først beslutte, hvilke undernet/tjenester vi vil have proxy. Lad os antage, at eksterne proxyer er placeret, hvor en tjeneste som f.eks. pandora.com kører. Nu er det tilbage at bestemme dets undernet / adresser.

1. Ping

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

2. Vi indtaster Google BGP 208.85.40.20

Gå til webstedet bgp.he.net/net/208.85.40.0/24#_netinfo
Det kan ses, at det undernet, jeg leder efter, er AS40428 Pandora Media, Inc.

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

Åbningspræfikser v4

bgp.he.net/AS40428#_præfikser

Her er de nødvendige undernet!

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 at reducere antallet af undernet skal du udføre aggregering. Lad os gå til siden ip-calculator.ru/aggregate og kopier vores liste derhen. Som et resultat - 6 undernet 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. Ryd op i iptables regler

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

Aktiver fremadgående mekanisme og 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

For at videresendelsen skal være aktiveret permanent efter genstart, ændrer vi filen

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

Og afkommenter linjen

net.ipv4.ip_forward = 1

Ctrl+X for at gemme filen

5. Indpak pandora.com-undernet 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. Gem reglerne

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

Opsætning og kørsel af Transparent Proxy via routerkonfiguration

I denne konfiguration kan den transparente proxyserver være en separat pc eller en virtuel maskine bag en hjemme-/virksomhedsrouter. Det er nok at registrere statiske ruter på routeren eller enhederne, og hele undernettet vil bruge proxyen uden behov for yderligere indstillinger.

VIGTIG! Det er nødvendigt, at vores gateway modtager en statisk IP fra routeren, eller konfigureres til selve statisk.

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

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

/etc/network/interfaces fil# Denne fil beskriver de netværksgrænseflader tilgængelige på dit system
# Aktiveret og hvordan Them. For mere information, se grænseflader (5).

kilde /etc/network/interfaces.d/*

# Den loopback netværksinterface
auto lo
iface lo inet loopback

# Den primære netværksgrænseflade
tillad-hotplug enp0s3
iface enp0s3 inet statisk
adresse 192.168.23.2
netmask 255.255.255.0
gateway 192.168.23.254

# Den sekundære netværksgrænseflade
tillad-hotplug enp0s8
iface enp0s8 inet statisk
adresse 192.168.201.254
netmask 255.255.255.0

2. Tillad enheder fra undernettet 192.168.23.0/24 at bruge 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. Gem reglerne
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Lad os skrive undernet på routeren

Router netværksliste199.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

Brugte materialer/ressourcer

1. Officiel hjemmeside for 3proxy-programmet 3proxy.ru

2. Instruktioner til installation af 3proxy fra kilder www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

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

Kilde: www.habr.com

Tilføj en kommentar