In dit artikel willen we de mogelijkheden van transparante proxyconfiguratie bespreken, die het mogelijk maakt om geheel onopgemerkt voor klanten al het of een deel van het verkeer via externe proxyservers om te leiden.
Toen ik deze taak begon, kwam ik erachter dat de implementatie ƩƩn belangrijk probleem heeft ā het HTTPS-protocol. In de goede oude tijd had je geen bijzondere problemen met transparante proxyconfiguratie van HTTP, maar bij proxying van HTTPS melden browsers dat er in het protocol is ingegrepen, en dan is het geluk voorbij.
In de gebruikelijke instructies voor de proxyserver Squid wordt zelfs voorgesteld om een eigen certificaat te genereren en dit aan de klanten te installeren, wat volslagen onzin is, minimaal irrationeel en eruitziet als een MITM-aanval. Ik weet dat Squid al iets dergelijks kan doen, maar in dit artikel gaat het om een beproefde en werkende methode met behulp van 3proxy van de gerespecteerde 3APA3A.
Vervolgens zullen we het proces van het bouwen van 3proxy uit de broncode in detail bekijken, de configuratie, het volledige en selectieve proxying met behulp van NAT, het verdelen van de bandbreedte over meerdere externe proxyservers, evenals het gebruik van een router en statische routes. We gebruiken Debian 9 x64 als besturingssysteem. Laten we beginnen!
Installatie van 3proxy en het starten van een gewone proxyserver
1. Installeer ifconfig (uit het pakket net-tools)
apt-get install net-tools
2. Installeer Midnight Commander
apt-get install mc
3. We hebben momenteel 2 interfaces:
enp0s3 ā extern, kijkt naar het internet
enp0s8 ā intern, moet naar het lokale netwerk kijken
In andere Debian-gebaseerde distributies worden de interfaces meestal eth0 en eth1 genoemd.
ifconfig -a
Interfacesenp0s3: flags=4163 mtu 1500
inet 192.168.23.11 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX-pakketten 6412 bytes 8676619 (8.2 MiB)
RX-fouten 0 gedropt 0 overruns 0 frame 0
TX-pakketten 1726 bytes 289128 (282.3 KiB)
TX-fouten 0 gedropt 0 overruns 0 carrier 0 collisions 0
enp0s8: flags=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-pakketten 0 bytes 0 (0.0 B)
RX-fouten 0 gedropt 0 overruns 0 frame 0
TX-pakketten 0 bytes 0 (0.0 B)
TX-fouten 0 gedropt 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-pakketten 0 bytes 0 (0.0 B)
RX-fouten 0 gedropt 0 overruns 0 frame 0
TX-pakketten 0 bytes 0 (0.0 B)
TX-fouten 0 gedropt 0 overruns 0 carrier 0 collisions 0
De interface enp0s8 wordt momenteel niet gebruikt; we zullen deze inschakelen wanneer we de proxy NAT-configuratie of NAT willen gebruiken. Pas dan is het logisch om hem een statisch ip toe te wijzen.
4. Laten we beginnen met de installatie van 3proxy
4.1 Installatie van basispakketten voor het compileren van 3proxy vanuit de bronbestanden
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Laten we een map maken om het archief met de bronbestanden te downloaden
root@debian9:~# mkdir -p /opt/proxy
4.3. Laten we naar deze map gaan
root@debian9:~# cd /opt/proxy
4.4. Nu downloaden we het nieuwste 3proxy-pakket. Ten tijde van het schrijven van dit artikel was de laatste stabiele versie 0.8.12 (18/04/2018). We zullen het downloaden van de officiƫle 3proxy-website
root@debian9:\/opt\/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. We pakken het gedownloade archief uit
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. We gaan naar de uitgepakte map om het programma te bouwen
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. Vervolgens moeten we een regel toevoegen aan het hoofdbestand, zodat onze server volledig anoniem is (dit werkt echt, alles is getest, de IP-adressen van de klanten worden verborgen)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
We voegen een regel toe
#define ANONYMOUS 1
We drukken op Ctrl+x en Enter om de wijzigingen op te slaan.
4.8. Laten we beginnen met het bouwen van het programma
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
Makelogmake[2]: Verlaat de map '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Verlaat de map '/opt/proxy/3proxy-0.8.12/src'
Er zijn geen fouten, we gaan verder.
4.9. We installeren het programma op het systeem
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. We gaan naar de hoofdmap en controleren waar het programma is geĆÆnstalleerd
root@debian9:~/opt/proxy/3proxy-0.8.12# cd ~/
root@debian9:~# whereis 3proxy
3proxy: /usr/local/bin/3proxy /usr/local/etc/3proxy
4.11. Laten we een map maken voor configuratiebestanden en logs in de thuismap van de gebruiker
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. We gaan naar de map waar de configuratie moet zijn
root@debian9:~# cd /home/joke/proxy/
4.13. We maken een leeg bestand en kopiƫren daar de configuratie naartoe
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.confdaemon
pidfile /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
nscache 65536
users tester: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"
rotate 3
auth strong
flush
allow tester
socks -p3128
proxy -p8080
Om op te slaan drukken we op Ctrl + Z
4.14. We maken een PID-bestand om fouten bij het opstarten te voorkomen.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
Om op te slaan drukken we op Ctrl + Z
4.15. We starten de proxyserver!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16. Laten we controleren of de server naar poorten luistert
root@debian9:~/home/joke/proxy# netstat -nlp
netstat logActieve Internetverbindingen (alleen servers)
Proto Recv-Q Send-Q Lokale Adres Buitenlandse Adres Status PID/Programmanaam
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 :::* LISTEN 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient
Zoals vermeld in de configuratie, luistert de webproxy op poort 8080, en de Socks5-proxy op 3128.
4.17. Om de proxyservice automatisch te starten na een herstart, moeten we deze aan cron toevoegen.
root@debian9:~/home/joke/proxy# crontab -e
We voegen een regel toe
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Druk op Enter, zodat cron het einde van de regel kan zien en sla het bestand op.
Er zou een bericht moeten zijn over de installatie van de nieuwe crontab.
crontab: nieuwe crontab installeren
4.18. Laten we het systeem opnieuw opstarten en proberen verbinding te maken via de browser met de proxy. We gebruiken de Firefox-browser (voor webproxy) en de FoxyProxy-extensie voor socks5 met authenticatie ter controle.
root@debian9:/home/joke/proxy# reboot
4.19. Na het controleren van de werking van de proxy na het opnieuw opstarten, kunnen we de logs bekijken. Hiermee is de configuratie van de proxyserver voltooid.
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/1.1
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
Configuratie en opstarten van de Transparent Proxy NAT
In deze configuratie zullen alle apparaten in het interne netwerk transparant via de externe proxyserver op internet werken. Absoluut alle tcp-verbindingen zullen worden doorgestuurd naar ƩƩn of meerdere (dit vergroot daadwerkelijk de bandbreedte, voorbeeld configuratie nr. 2!) proxyservers. De DNS-service zal gebruikmaken van de mogelijkheden van 3proxy (dnspr). UDP zal extern niet gaan omdat we momenteel geen forwardmechanisme gebruiken (standaard uitgeschakeld in de Linux-kernel).
1. Het is tijd om de interface enp0s8 in te schakelen
root@debian9:~# nano /etc/network/interfaces
/etc/network/interfaces file# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp0s3
iface enp0s3 inet dhcp
# The secondary network interface
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.201.254
netmask 255.255.255.0
Hier hebben we de interface enp0s8 een statisch adres 192.168.201.254 en een subnetmasker 255.255.255.0 toegewezen.
Sla de configuratie op met Ctrl+X en herstart.
root@debian9:~# opnieuw opstarten
2. Controleer de interfaces
root@debian9:~# ifconfig
ifconfig logenp0s3: flags=4163 mtu 1500
inet 192.168.23.11 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64 scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000 (Ethernet)
RX packets 61 bytes 7873 (7.6 KiB)
RX-fouten 0 gedropt 0 overruns 0 frame 0
TX packets 65 bytes 10917 (10.6 KiB)
TX-fouten 0 gedropt 0 overruns 0 carrier 0 collisions 0
enp0s8: flags=4163 mtu 1500
inet 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64 scopeid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX-pakketten 0 bytes 0 (0.0 B)
RX-fouten 0 gedropt 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX-fouten 0 gedropt 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX-pakketten 0 bytes 0 (0.0 B)
RX-fouten 0 gedropt 0 overruns 0 frame 0
TX-pakketten 0 bytes 0 (0.0 B)
TX-fouten 0 gedropt 0 overruns 0 carrier 0 collisions 0
3. Het is gelukt, nu moeten we 3proxy configureren voor transparante proxyverwerking.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Voorbeeldconfiguratie van de transparante proxyserver 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
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 3
flush
auth iponly
dnspr
allow *
parent 1000 socks5 EXTERNE_PROXY_IP 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. We gaan nu 3proxy starten met de nieuwe configuratie
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. Laten we opnieuw toevoegen aan crontab
root@debian9:~/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Laten we kijken wat onze proxy nu aan het luisteren is
root@debian9:~# netstat -nlp
netstat logActieve Internetverbindingen (alleen servers)
Proto Recv-Q Send-Q Lokale Adres Buitenlandse Adres Status PID/Programmanaam
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 :::* LISTEN 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 is de proxy klaar om elke TCP-verbinding op poort 888 en DNS op poort 53 te accepteren, en deze door te sturen naar de externe socks5-proxy en de Google DNS 8.8.8.8. We moeten de netfilter (iptables) regels en DHCP configureren voor het toewijzen van adressen.
8. Laten we het pakket iptables-persistent en dhcpd installeren.
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. We bewerken het opstartbestand van dhcpd.
root@debian9:~# nano /etc/dhcp/dhcpd.conf
dhcpd.conf# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networksā¦
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
# A slightly different configuration for an internal subnet.
subnet 192.168.201.0 netmask 255.255.255.0 {
range 192.168.201.10 192.168.201.250;
option domain-name-servers 192.168.201.254;
option routers 192.168.201.254;
option broadcast-address 192.168.201.255;
default-lease-time 600;
max-lease-time 7200;
}
11. Herstarten en de service op poort 67 controleren.
root@debian9:~# opnieuw opstarten
root@debian9:~# netstat -nlp
netstat logActieve Internetverbindingen (alleen servers)
Proto Recv-Q Send-Q Lokale Adres Buitenlandse Adres Status PID/Programmanaam
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 :::* LISTEN 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
raw 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd
12. We moeten alle TCP-verzoeken naar poort 888 omleiden en de regel in iptables opslaan.
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. Voor het uitbreiden van de bandbreedte kunnen we meerdere proxyservers gebruiken. De totale waarde moet 1000 zijn. Nieuwe verbindingen worden met een kans van 0.2, 0.2, 0.2, 0.2, 0.1, 0.1 naar de opgegeven proxyservers tot stand gebracht.
Opmerking: als we een webproxy hebben, moet in plaats van socks5 connect worden geschreven, als het socks4 is, dan socks4 (socks4 ONDERSTEUNT GEEN AUTHENTICATIE MET GEBRUIKERSNAAM/WACHTWOORD!)
Voorbeeldconfiguratie voor transparante proxyserver 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
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 3
flush
auth iponly
dnspr
allow *
parent 200 socks5 IP_ADRES_VAN_BUITEN_PROXY#1 3128 tester 1234
parent 200 socks5 IP_ADRES_VAN_BUITEN_PROXY#2 3128 tester 1234
parent 200 socks5 IP_ADRES_VAN_BUITEN_PROXY#3 3128 tester 1234
parent 200 socks5 IP_ADRES_VAN_BUITEN_PROXY#4 3128 tester 1234
parent 100 socks5 IP_ADRES_VAN_BUITEN_PROXY#5 3128 tester 1234
parent 100 socks5 IP_ADRES_VAN_BUITEN_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
Configuratie en opstarten van NAT + Transparante Proxy
In deze configuratie zullen we het gewone NAT-mechanisme gebruiken met selectieve of volledige transparante proxy voor bepaalde adressen of subnetten. Gebruikers van het interne netwerk werken met bepaalde diensten/subnetten zonder zich te beseffen dat ze via een proxy werken. Alle HTTPS-verbindingen werken prima, er hoeven geen certificaten te worden gegenereerd of vervangen.
Laten we eerst bepalen welke subnets/diensten we willen proxeren. Stel dat de externe proxyservers zich bevinden waar een dienst zoals pandora.com werkt. Nu moeten we zijn subnets/adressen bepalen.
1. Pingen
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes aan data.
2. Zoek op Google BGP 208.85.40.20
Ga naar de website
We zien dat het gevraagde subnet AS40428 Pandora Media, Inc is.
Open de v4-prefixen
Hier zijn de gevraagde subnets!
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. Om het aantal subnets te verminderen, moeten we aggregatie uitvoeren. Ga naar de website en kopieer daar onze lijst naartoe. Het resultaat ā 6 subnets in plaats van 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. Maak de iptables-regels schoon
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Schakel de forward- en NAT-mechanismen in
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
Om ervoor te zorgen dat forward voortdurend ingeschakeld is na herstart, moeten we het bestand wijzigen
root@debian9:~# nano /etc/sysctl.conf
En we uncommenten de regel
net.ipv4.ip_forward = 1
Ctrl+X om het bestand op te slaan
5. Verpak de subnets van pandora.com in 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. We zullen de regels opslaan
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configuratie en opstart van de Transparent Proxy via router
In deze configuratie kan de transparante proxyserver een aparte pc of virtuele machine zijn achter de thuis/corporate router. Het is voldoende om statische routes op de router of apparaten in te voeren en het hele subnet zal de proxy gebruiken zonder enige aanvullende configuraties.
BELANGRIJK! Het is noodzakelijk dat onze gateway een statisch IP van de router ontvangt, of zelf op statisch is ingesteld.
1. Stel het statische adres van de gateway in (adapter enp0s3)
root@debian9:~# nano /etc/network/interfaces
/etc/network/interfaces file# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp0s3
iface enp0s3 inet static
address 192.168.23.2
netmask 255.255.255.0
gateway 192.168.23.254
# The secondary network interface
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.201.254
netmask 255.255.255.0
2. Sta apparaten uit het subnet 192.168.23.0/24 toe om proxyservices te gebruiken
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. We zullen de regels opslaan
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Voer de subnets in op de router
Router netlijst199.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
Gebruikte materialen/bronnen
1. Officiƫle website van het programma 3proxy
2. Installatiehandleiding voor 3proxy vanaf de bron
3. Ontwikkelaarsbranch van 3proxy op GitHub
Bron: habr.com
