I denne artikel vil jeg gerne afdĂŠkke mulighederne for gennemsigtig proxy, som gĂžr det muligt helt usynligt for kunderne at omdirigere al eller en del af trafikken gennem eksterne proxy-servere.
Da jeg begyndte at tackle denne opgave, stĂždt jeg pĂ„ en vĂŠsentlig udfordring â HTTPS-protokollen. I de gode gamle dage var der ikke rigtig problemer med gennemsigtig proxy til HTTP, men nĂ„r man proxy HTTPS, advarer browsere om indgreb i protokollen, og sĂ„ stopper det sjove.
I de udbredte instruktioner til proxy-serveren Squid anbefales det endda at generere sit eget certifikat og installere det for kunderne, hvilket er komplet tÄbeligt, i det mindste irrationelt og ligner en MITM-angreb. Jeg ved, at Squid allerede kan gÞre noget lignende, men denne artikel handler om en pÄlidelig og fungerende metode ved hjÊlp af 3proxy fra den respekterede 3APA3A.
Vi vil nu gennemgÄ processen med at bygge 3proxy fra kildekoden, dets konfiguration, fuld og selektiv proxy ved hjÊlp af NAT, kanalfordeling til flere eksterne proxy-servere samt brugen af routere og statiske ruter. Som operativsystem bruger vi Debian 9 x64. Lad os komme i gang!
Installation af 3proxy og opstart af en almindelig proxy-server
1. Installerer ifconfig (fra net-tools-pakken)
apt-get install net-tools
2. Installerer Midnight Commander
apt-get install mc
3. Vi har nu 2 interfaces:
enp0s3 â ekstern, kigger ud mod internettet
enp0s8 â intern, skal kaste sig mod det lokale netvĂŠrk
I andre Debian-baserede distributioner kaldes interfaces normalt eth0 og eth1.
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 pakker 6412 bytes 8676619 (8.2 MiB)
RX fejl 0 droppet 0 overruns 0 ramme 0
TX pakker 1726 bytes 289128 (282.3 KiB)
TX fejl 0 droppet 0 overruns 0 bĂŠrer 0 kollisioner 0
enp0s8: flags=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX pakker 0 bytes 0 (0.0 B)
RX fejl 0 droppet 0 overruns 0 ramme 0
TX pakker 0 bytes 0 (0.0 B)
TX fejl 0 droppet 0 overruns 0 bĂŠrer 0 kollisioner 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 pakker 0 bytes 0 (0.0 B)
RX fejl 0 droppet 0 overruns 0 ramme 0
TX pakker 0 bytes 0 (0.0 B)
TX fejl 0 droppet 0 overruns 0 bĂŠrer 0 kollisioner 0
Interfacet enp0s8 er i Þjeblikket ikke i brug; vi vil aktivere det, nÄr vi Þnsker at bruge Proxy NAT-konfigurationen eller NAT. Det vil vÊre logisk at tildele det en statisk IP.
4. Lad os gÄ i gang med installationen af 3proxy
4.1 Installation af grundlĂŠggende pakker til at kompilere 3proxy fra kildekoden
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. Lad os oprette en mappe til at downloade arkivet med kildekoderne
root@debian9:~# mkdir -p /opt/proxy
4.3. Lad os gÄ ind i denne mappe
root@debian9:~# cd /opt/proxy
4.4. Nu downloader vi den nyeste pakke af 3proxy. 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. Lad os udpakkes det downloadede arkiv
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. Vi gÄr ind i den udpakkede mappe for at bygge programmet
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. DernÊst skal vi tilfÞje en linje i headerfilen, sÄ vores server er helt anonym (det fungerer i virkeligheden, alt er testet, klienternes IP-adresser skjules)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
Vi tilfĂžjer linjen
#define ANONYMOUS 1
Tryk pÄ Ctrl+x og Enter for at gemme Êndringerne.
4.8. Lad os begynde at bygge programmet
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
Makelogmake[2]: Forlader biblioteket '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Forlader biblioteket '/opt/proxy/3proxy-0.8.12/src'
Der er ingen fejl, vi fortsĂŠtter.
4.9. Lad os installere programmet i systemet
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. Vi gÄr til roden af systemet og tjekker, hvor programmet er blevet 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. Vi gÄr ind i mappen, hvor konfigurationsfilen skal vÊre
root@debian9:~# cd /home/joke/proxy/
4.13. Opret en tom fil og kopier konfigurationen derind
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
For at gemme tryk pÄ Ctrl + Z
4.14. Lad os oprette en pid-fil for at undgÄ fejl ved opstart.
root@debian9:/home/joke/proxy# cat > 3proxy.pid
For at gemme tryk pÄ Ctrl + Z
4.15. Starter proxyserveren!
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 Status PID/Program navn
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
Som angivet i konfigurationsfilen lytter web-proxyen pÄ port 8080, Socks5-proxyen pÄ 3128.
4.17. For at autostarte proxyservicen efter genstart skal vi tilfĂžje den til cron.
root@debian9:~/hjem/joke/proxy# crontab -e
Vi tilfĂžjer linjen
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
Tryk pÄ Enter, sÄ cron kan se slutlinjesymbolet og gemme filen.
Der skal vĂŠre en meddelelse om installation af ny crontab.
crontab: installing new crontab
4.18. Genstart systemet, og lad os prĂžve at tilslutte til proxien gennem browseren. Vi bruger Firefox (til webproxy) og tilfĂžjelsen FoxyProxy til socks5 med autentificering.
root@debian9:~/home/joke/proxy# reboot
4.19. Efter at have kontrolleret proxien efter genstarten, kan vi se loggene. Nu er konfigurationen af proxyserveren afsluttet.
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
Konfiguration og opstart af Transparent Proxy NAT
I denne konfiguration vil alle enheder i det interne netvÊrk arbejde gennem en ekstern proxyserver. Alle tcp-forbindelser vil blive omdirigeret til en eller flere (som reelt udvider bÄndbredden, eksempel pÄ konfiguration nr. 2!) proxyservere. DNS-tjenesten vil bruge mulighederne fra 3proxy (dnspr). UDP vil ikke "gÄ ud", da vi stadig ikke bruger forward-mekanismen (som som standard er deaktiveret i Linux-kernen).
1. Det er tid til at aktivere grĂŠnsefladen enp0s8
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
Her har vi tildelt grĂŠnsefladen enp0s8 den statiske adresse 192.168.201.254 og masken 255.255.255.0
Gem konfigurationen med Ctrl+X og genstart
root@debian9:~# genstart
2. Tjek grĂŠnsefladerne
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 fejl 0 droppet 0 overruns 0 ramme 0
TX packets 65 bytes 10917 (10.6 KiB)
TX fejl 0 droppet 0 overruns 0 bĂŠrer 0 kollisioner 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 pakker 0 bytes 0 (0.0 B)
RX fejl 0 droppet 0 overruns 0 ramme 0
TX packets 8 bytes 648 (648.0 B)
TX fejl 0 droppet 0 overruns 0 bĂŠrer 0 kollisioner 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 pakker 0 bytes 0 (0.0 B)
RX fejl 0 droppet 0 overruns 0 ramme 0
TX pakker 0 bytes 0 (0.0 B)
TX fejl 0 droppet 0 overruns 0 bĂŠrer 0 kollisioner 0
3. Det lykkedes, nu skal vi konfigurere 3proxy til transparent proxyering.
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
Eksempel pÄ konfiguration af den transparente 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 EKSTERN_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. Nu starter vi 3proxy med den nye konfiguration
root@debian9:~/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5. TilfĂžj igen til crontab
root@debian9:~/hjem/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. Lad os se, hvad vores proxy lytter pÄ nu
root@debian9:~# netstat -nlp
netstat logAktive internetforbindelser (kun servere)
Proto Recv-Q Send-Q Lokal adresse Udenlandsk adresse Status PID/Program navn
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 er proxyen klar til at modtage enhver TCP-forbindelse pĂ„ port 888, DNS pĂ„ port 53, for derefter at omdirigere dem til den eksterne socks5 â proxy og Googles DNS 8.8.8.8. Vi skal kun konfigurere netfilter (iptables) reglerne og DHCP til at tildele adresser.
8. Vi installerer pakken iptables-persistent og dhcpd
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9. Vi retter opstartsfils lĂžsningen for 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. Genstart og kontroller tjenesten pÄ port 67
root@debian9:~# genstart
root@debian9:~# netstat -nlp
netstat logAktive internetforbindelser (kun servere)
Proto Recv-Q Send-Q Lokal adresse Udenlandsk adresse Status PID/Program navn
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. Det er nĂždvendigt 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 bÄndbredden kan man bruge flere proxy-servere samtidig. Den samlede sum 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 proxy-servere.
BemĂŠrk: hvis vi har web-proxy skal der skrives connect i stedet for socks5, hvis socks4, sĂ„ socks4 (socks4 UNDERSTĂTTER IKKE AUTORISERING BRUGERNAVN/ADGANGSKODE!)
Eksempel pÄ konfiguration af den gennemsigtige proxy-server 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 EKSTERNE_PROXY_IP_1 3128 tester 1234
parent 200 socks5 EKSTERNE_PROXY_IP_2 3128 tester 1234
parent 200 socks5 EKSTERNE_PROXY_IP_3 3128 tester 1234
parent 200 socks5 EKSTERNE_PROXY_IP_4 3128 tester 1234
parent 100 socks5 EKSTERNE_PROXY_IP_5 3128 tester 1234
parent 100 socks5 EKSTERNE_PROXY_IP_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 almindelige NAT-mekanisme med selektiv eller fuld gennemsigtig proxy til bestemte adresser eller subnet. Brugere i det interne netvĂŠrk vil interagere med bestemte tjenester/subnet uden nogensinde at ane, at de arbejder gennem proxyen. Alle https-forbindelser fungerer perfekt, ingen certifikater skal genereres/udskiftes.
For starters, let's determine which subnets/services we want to proxy. Let's assume that the external proxy servers are located where a service like pandora.com operates. Now we just need to identify its subnets/addresses.
1. Ping
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bytes of data.
2. Search for BGP 208.85.40.20 on Google
GĂ„ til webstedet
It is clear that the sought subnet belongs to AS40428 Pandora Media, Inc
Open the v4 prefixes
Here are the sought 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. To reduce the number of subnets, we need to perform aggregation. Go to the site and copy our list there. As a result, we end up with 6 subnets instead of 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. Clear the iptables rules
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
Enable the forwarding and NAT mechanisms
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
To ensure the forwarding remains enabled after a reboot, we will change the file
root@debian9:~# nano /etc/sysctl.conf
And uncomment the line
net.ipv4.ip_forward = 1
Ctrl+X to save the file
5. Wrap the pandora.com subnets in the 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. Save the rules
root@debian9:~# iptables-save > /etc/iptables/rules.v4
Configuring and launching the Transparent Proxy via router
In this configuration, the transparent proxy can be a separate PC or a virtual machine behind a home/corporate router. It is enough to set up static routes on the router or devices, and the entire subnet will use the proxy without any additional settings.
IMPORTANT! It is essential that our gateway receives a static IP from the router, or is set up for static itself.
1. Set a static address for the gateway (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. Allow devices from the subnet 192.168.23.0/24 to use proxying
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. Save the rules
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. Define the subnets on the router
Router network list199.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
Used materials/resources
1. Official website of the 3proxy program
2. Installation instructions for 3proxy from source
3. Developer branch of 3proxy on GitHub
Kilde: habr.com
