Grunderna i transparent proxy med 3proxy och iptables/netfilter eller hur man "lägger allt genom en proxy"

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 bgp.he.net/net/208.85.40.0/24#_netinfo
Det kan ses att subnätet jag letar efter är AS40428 Pandora Media, Inc

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

Öppna v4-prefix

bgp.he.net/AS40428#_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 ip-calculator.ru/aggregate och kopiera vår lista dit. Som ett resultat - 6 subnät istället för 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. 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 3proxy.ru

2. Instruktioner för att installera 3proxy från källan www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

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

Källa: will.com

Lägg en kommentar