I den här artikeln skulle jag vilja avslöja möjligheterna med transparent proxy, som låter dig omdirigera hela eller delar av trafiken genom externa proxyservrar helt obemärkt av klienter.
När jag började lösa detta problem stod jag inför det faktum att implementeringen hade ett betydande problem - HTTPS-protokollet. På den gamla goda tiden fanns det inga speciella problem med transparent HTTP-proxy, men med HTTPS-proxy rapporterar webbläsare störningar på protokollet och det är där lyckan slutar.
I de vanliga instruktionerna för Squid-proxyservern föreslår de till och med att du genererar ditt eget certifikat och installerar det på klienter, vilket åtminstone är totalt nonsens, irrationellt och ser ut som en MITM-attack. Jag vet att Squid redan kan göra något liknande, men den här artikeln handlar om en beprövad och fungerande metod med 3proxy från den respekterade 3APA3A.
Därefter kommer vi att titta i detalj på processen att bygga 3proxy från källan, dess konfiguration, fullständig och selektiv proxy med NAT, kanaldistribution till flera externa proxyservrar, samt användningen av en router och statiska rutter. Vi använder Debian 9 x64 som operativsystem. Börja!
Installerar 3proxy och kör en vanlig proxyserver
1. Installera ifconfig (från paketet net-tools)
apt-get install net-tools
2. Installera Midnight Commander
apt-get install mc
3. Vi har nu två gränssnitt:
enp0s3 - extern, tittar på Internet
enp0s8 - intern, måste titta in i det lokala nätverket
På andra Debian-baserade distributioner kallas gränssnitten vanligtvis eth0 och eth1.
ifconfig -a
Gränssnittenp0s3: flaggor=4163 mtu 1500
inet 192.168.23.11 nätmask 255.255.255.0 sändning 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 eter 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-paket 6412 byte 8676619 (8.2 MiB)
RX-fel 0 tappade 0 överskrider 0 bildruta 0
TX-paket 1726 byte 289128 (282.3 KiB)
TX-fel 0 tappade 0 överskridanden 0 transportör 0 kollisioner 0
enp0s8: flaggor=4098 mtu 1500
eter 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-paket 0 byte 0 (0.0 B)
RX-fel 0 tappade 0 överskrider 0 bildruta 0
TX-paket 0 byte 0 (0.0 B)
TX-fel 0 tappade 0 överskridanden 0 transportör 0 kollisioner 0
lo: flaggor=73 mtu 65536
inet 127.0.0.1 nätmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-paket 0 byte 0 (0.0 B)
RX-fel 0 tappade 0 överskrider 0 bildruta 0
TX-paket 0 byte 0 (0.0 B)
TX-fel 0 tappade 0 överskridanden 0 transportör 0 kollisioner 0
Gränssnittet enp0s8 används inte för närvarande, vi kommer att aktivera det när vi vill använda Proxy NAT eller NAT-konfiguration. Det är då det vore logiskt att tilldela den en statisk IP.
4. Låt oss börja installera 3proxy
4.1 Installera grundläggande paket för att kompilera 3proxy från källor
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Låt oss skapa en mapp för nedladdning av arkivet med källor
root@debian9:~# mkdir -p /opt/proxy
4.3. Låt oss gå till den här mappen
root@debian9:~# cd /opt/proxy
4.4. Låt oss nu ladda ner det senaste 3proxy-paketet. I skrivande stund var den senaste stabila versionen 0.8.12 (18-04-2018) Ladda ner den från den officiella 3proxy-webbplatsen
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. Låt oss packa upp det nedladdade arkivet
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Gå till den uppackade katalogen för att bygga programmet
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. Därefter måste vi lägga till en rad i rubrikfilen så att vår server är helt anonym (det fungerar verkligen, allt kontrolleras, klientens IP-adresser är dolda)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Lägg till en rad
#define ANONYMOUS 1
Tryck på Ctrl+x och Enter för att spara ändringarna.
4.8. Låt oss börja sätta ihop programmet
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
Makelogmake[2]: Lämnar katalogen '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Lämnar katalogen '/opt/proxy/3proxy-0.8.12/src'
Inga fel, låt oss fortsätta.
4.9. Installera programmet på systemet
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Gå till rotkatalogen och kontrollera var programmet installerades
root@debian9:/opt/proxy/3proxy-0.8.12# cd ~/
root@debian9:~# whereis 3proxy
3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy
4.11. Låt oss skapa en mapp för konfigurationsfiler och loggar i användarens hemkatalog
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. Gå till katalogen där konfigurationen ska vara
root@debian9:~# cd /home/joke/proxy/
4.13. Skapa en tom fil och kopiera konfigurationen dit
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.confdaemon
pidfil /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
användartestare: 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"
rotera 3
auth stark
flush
tillåt testare
strumpor -p3128
proxy -p8080
För att spara, tryck på Ctrl + Z
4.14. Låt oss skapa en pid-fil så att det inte finns några fel under uppstart.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
För att spara, tryck på Ctrl + Z
4.15. Låt oss starta proxyservern!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. Låt oss se om servern lyssnar på portar
root@debian9:~/home/joke/proxy# netstat -nlp
netstat loggAktiva internetanslutningar (endast servrar)
Proto Recv-Q Send-Q Lokal adress Utländsk adress Ange PID/programnamn
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 :::* LYSSNA 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhklient
Som det skrevs i konfigurationen lyssnar vår webbproxy på port 8080, Socks5 proxy lyssnar på port 3128.
4.17. För att autostarta proxytjänsten efter en omstart måste du lägga till den i cron.
root@debian9:/home/joke/proxy# crontab -e
Lägg till en rad
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Vi trycker på Enter, eftersom cron ska se slutet av radens tecken och sparar filen.
Det bör finnas ett meddelande om att installera en ny crontab.
crontab: installerar ny crontab
4.18. Låt oss starta om systemet och försöka ansluta via webbläsaren till proxyn. För att kontrollera använder vi webbläsaren Firefox (för en webbproxy) och tillägget FoxyProxy för socks5 med autentisering.
root@debian9:/home/joke/proxy# reboot
4.19. Efter att ha kontrollerat proxyns funktion efter en omstart kan du se loggarna. Detta slutför proxyserverinstallationen.
3 proxylogg1542573996.018 PROXY.8080 00000 testare 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com:443_HTTP
1542574289.634 SOCK5.3128 00000 testare 192.168.23.10:51193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443
Konfigurera och köra Transparent Proxy NAT-konfiguration
I den här konfigurationen kommer alla enheter i det interna nätverket att fungera transparent på Internet via en fjärrproxyserver. Absolut alla TCP-anslutningar kommer att omdirigeras till en eller flera (expanderar verkligen kanalbredden, konfigurationsexempel nr 2!) proxyservrar. DNS-tjänsten kommer att använda 3proxy (dnspr)-funktioner. UDP kommer inte att "gå" utåt, eftersom vi ännu inte använder framåtmekanismen (inaktiverad som standard i Linux-kärnan).
1. Det är dags att aktivera enp0s8-gränssnittet
root@debian9:~# nano /etc/network/interfaces
/etc/network/interfaces-filen# Den här filen beskriver nätverksgränssnitt som finns på datorn
# Aktiveras och hur dem. För mer information, se gränssnitt (5).
källa /etc/network/interfaces.d/*
# Den loopback nätverksgränssnitt
auto lo
iface Lo inet loopback
# Det primära nätverksgränssnittet
tillåt-hotplug enp0s3
iface enp0s3 inet dhcp
# Det sekundära nätverksgränssnittet
tillåt-hotplug enp0s8
iface enp0s8 inet statisk
adress 192.168.201.254
nätmask 255.255.255.0
Här tilldelade vi enp0s8-gränssnittet en statisk adress 192.168.201.254 och en mask 255.255.255.0
Spara konfigurationen Ctrl+X och starta om
root@debian9:~# reboot
2. Kontrollera gränssnitten
root@debian9:~# ifconfig
ifconfig-loggenp0s3: flaggor=4163 mtu 1500
inet 192.168.23.11 nätmask 255.255.255.0 sändning 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 eter 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-paket 61 byte 7873 (7.6 KiB)
RX-fel 0 tappade 0 överskrider 0 bildruta 0
TX-paket 65 byte 10917 (10.6 KiB)
TX-fel 0 tappade 0 överskridanden 0 transportör 0 kollisioner 0
enp0s8: flaggor=4163 mtu 1500
inet 192.168.201.254 nätmask 255.255.255.0 sändning 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 scopeid 0x20 eter 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-paket 0 byte 0 (0.0 B)
RX-fel 0 tappade 0 överskrider 0 bildruta 0
TX-paket 8 byte 648 (648.0 B)
TX-fel 0 tappade 0 överskridanden 0 transportör 0 kollisioner 0
lo: flaggor=73 mtu 65536
inet 127.0.0.1 nätmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-paket 0 byte 0 (0.0 B)
RX-fel 0 tappade 0 överskrider 0 bildruta 0
TX-paket 0 byte 0 (0.0 B)
TX-fel 0 tappade 0 överskridanden 0 transportör 0 kollisioner 0
3. Allt löste sig, nu måste du konfigurera 3proxy för transparent proxy.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Exempelkonfiguration av transparent proxyserver nr 1daemon
pidfil /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"
rotera 3
flush
auth iponly
dnspr
tillåt *
parent 1000 socks5 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. Nu startar vi 3proxy med den nya konfigurationen
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Lägg till i crontab igen
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Låt oss se vad vår proxy lyssnar på nu
root@debian9:~# netstat -nlp
netstat loggAktiva internetanslutningar (endast servrar)
Proto Recv-Q Send-Q Lokal adress Utländsk adress Ange PID/programnamn
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 :::* LYSSNA 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. Nu är proxyn redo att acceptera alla TCP-anslutningar på port 888, DNS på port 53, så att de sedan kan omdirigeras till fjärrproxyn socks5 och DNS Google 8.8.8.8. Allt vi behöver göra är att konfigurera nätfilter (iptables) och DHCP-regler för att utfärda adresser.
8. Installera paketet iptables-persistent och dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Redigera dhcpd-startfilen
root@debian9:~# nano /etc/dhcp/dhcpd.conf
dhcpd.conf#dhcpd.conf
#
# Exempel på konfigurationsfil för ISC dhcpd
#
# alternativdefinitioner som är gemensamma för alla nätverk som stöds...
option domännamn "example.org";
option domännamn-servrar ns1.example.org, ns2.example.org;
standard-hyres-tid 600;
max-arrendetid 7200;
ddns-update-style ingen;
# Om denna DHCP-server är den officiella DHCP-servern för den lokala
# nätverk, bör det auktoritativa direktivet vara okommenterat.
auktoritativ;
# En något annorlunda konfiguration för ett internt subnät.
undernät 192.168.201.0 nätmask 255.255.255.0 {
intervall 192.168.201.10 192.168.201.250;
option domännamn-servrar 192.168.201.254;
option routrar 192.168.201.254;
alternativ sändningsadress 192.168.201.255;
standard-hyres-tid 600;
max-arrendetid 7200;
}
11. Starta om och kontrollera tjänsten på port 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp
netstat loggAktiva internetanslutningar (endast servrar)
Proto Recv-Q Send-Q Lokal adress Utländsk adress Ange PID/programnamn
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 :::* LYSSNA 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. Allt som återstår är att omdirigera alla tcp-förfrågningar till port 888 och spara regeln 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. För att utöka kanalbandbredden kan du använda flera proxyservrar samtidigt. Summan måste vara 1000. Nya anslutningar upprättas med en sannolikhet på 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 till de angivna proxyservrarna.
Obs: om vi har en webbproxy måste vi istället för socks5 skriva connect, if socks4, sedan socks4 (socks4 STÖDER INTE INLOGGNING/LÖSENORD AUTORISERING!)
Exempelkonfiguration av transparent proxyserver nr 2daemon
pidfil /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"
rotera 3
flush
auth iponly
dnspr
tillåt *
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 testare 1234
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 testare 1234
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 testare 1234
parent 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 testare 1234
parent 100 socks5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 testare 1234
parent 100 socks5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 testare 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
Konfigurera och köra NAT + Transparent Proxy-konfiguration
I den här konfigurationen kommer vi att använda den vanliga NAT-mekanismen med selektiv eller fullständig genomskinlig proxy av enskilda adresser eller subnät. Interna nätverksanvändare kommer att arbeta med vissa tjänster/undernät utan att ens inse att de arbetar via en proxy. Alla https-anslutningar fungerar bra, inga certifikat behöver genereras/bytas ut.
Låt oss först bestämma vilka undernät/tjänster vi vill ge proxy. Låt oss anta att externa proxyservrar finns där en tjänst som pandora.com verkar. Nu återstår att bestämma dess undernät/adresser.
1. Ping
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) byte med data.
2. Skriv BGP 208.85.40.20 i Google
Gå till webbplatsen
Det kan ses att subnätet jag letar efter är AS40428 Pandora Media, Inc
Öppna v4-prefix
Här är de nödvändiga subnäten!
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. För att minska antalet undernät måste du utföra aggregering. Gå till webbplatsen
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. Tydliga iptables-regler
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Aktivera framåt- och 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
För att säkerställa att vidarebefordran är aktiverad permanent efter en omstart, låt oss ändra filen
root@debian9:~# nano /etc/sysctl.conf
Och avkommentera raden
net.ipv4.ip_forward = 1
Ctrl+X för att spara filen
5. Vi lindar pandora.com-undernät 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. Låt oss hålla reglerna
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Konfigurera och köra Transparent Proxy via routerkonfiguration
I denna konfiguration kan den transparenta proxyservern vara en separat PC eller en virtuell maskin bakom en hem-/företagsrouter. Det räcker med att registrera statiska rutter på routern eller enheterna och hela undernätet kommer att använda en proxy utan att behöva några ytterligare inställningar.
VIKTIG! Det är nödvändigt att vår gateway tar emot en statisk IP från routern, eller är konfigurerad att vara statisk själv.
1. Konfigurera en statisk gateway-adress (enp0s3-adapter)
root@debian9:~# nano /etc/network/interfaces
/etc/network/interfaces-filen# Den här filen beskriver nätverksgränssnitt som finns på datorn
# Aktiveras och hur dem. För mer information, se gränssnitt (5).
källa /etc/network/interfaces.d/*
# Den loopback nätverksgränssnitt
auto lo
iface Lo inet loopback
# Det primära nätverksgränssnittet
tillåt-hotplug enp0s3
iface enp0s3 inet statisk
adress 192.168.23.2
nätmask 255.255.255.0
Gateway 192.168.23.254
# Det sekundära nätverksgränssnittet
tillåt-hotplug enp0s8
iface enp0s8 inet statisk
adress 192.168.201.254
nätmask 255.255.255.0
2. Tillåt enheter från undernätet 192.168.23.0/24 att använda 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. Låt oss hålla reglerna
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Låt oss registrera subnät på routern
Routernätverkslista199.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
Material/resurser som används
1. Officiell webbplats för 3proxy-programmet
2. Instruktioner för att installera 3proxy från källan
3. 3proxy-utvecklingsgren på GitHub
Källa: will.com