Základy transparentního proxy s použitím 3proxy a iptables/netfilter nebo jak „prohnat vše přes proxy“

V tomto článku chceme odhalit možnosti transparentního proxy, které umožňují zcela nepozorovaně pro klienty přesměrovávat veškerý nebo část provozu přes externí proxy servery.

Když jsem začínal řešit tento úkol, narazil jsem na jednu zásadní problém — protokol HTTPS. V starých dobrých časech nebyly s transparentním proxy HTTP žádné zvláštní problémy, ale při proxy HTTPS prohlížeče hlásí zásah do protokolu a tím končí veškeré štěstí.

V běžných instrukcích pro proxy server Squid dokonce doporučují vygenerovat vlastní certifikát a nainstalovat jej klientům, což je naprosto nesmyslné a vypadá to jako útok typu MITM. Vím, že Squid už něco takového umí, ale tento článek se zabývá ověřeným a funkčním způsobem s použitím 3proxy od uznávaného 3APA3A.

Dále podrobně prozkoumáme proces sestavení 3proxy z zdrojových kódů, jeho nastavení, plné a selektivní proxy s použitím NAT, rozdělení kanálu na několik externích proxy serverů, a také použití routeru a statických tras. Jako OS používáme Debian 9 x64. Začínáme!

Instalace 3proxy a spuštění běžného proxy serveru

1. Nainstalujte ifconfig (z balíku net-tools)
apt-get install net-tools
2. Nainstalujte Midnight Commander
apt-get install mc
3. Aktuálně máme 2 rozhraní:
enp0s3 — externí, směřuje do internetu
enp0s8 — interní, měl by směřovat do místní sítě
V ostatních distribucích založených na Debiane se rozhraní obvykle nazývají eth0 a eth1.
ifconfig -a

Interfacesenp0s3: flags=4163UP,BROADCAST,RUNNING,MULTICAST 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 6412 bytes 8676619 (8.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1726 bytes 289128 (282.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

enp0s8: flags=4098BROADCAST,MULTICAST mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73UP,LOOPBACK,RUNNING mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Rozhraní enp0s8 v současné době není používáno, aktivujeme ho, když budeme chtít použít konfiguraci Proxy NAT nebo NAT. Tehdy bude logické přiřadit mu statický ip.

4. Přejdeme k instalaci 3proxy

4.1 Instalace základních balíčků pro kompilaci 3proxy ze zdrojových kódů

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

4.2. Vytvoříme adresář pro stažení archivu se zdrojovými kódy

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

4.3. Přejdeme do tohoto adresáře

root@debian9:~# cd /opt/proxy

4.4. Nyní stáhneme nejnovější balíček 3proxy. K datu psaní článku byla poslední stabilní verzí verze 0.8.12 (18/04/2018). Stáhneme ji z oficiálních stránek 3proxy

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

4.5. Rozbalíme stažený archiv

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

4.6. Přejdeme do rozbaleného adresáře pro sestavení programu

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

4.7. Dále je potřeba přidat řádek do hlavičkového souboru, aby náš server byl zcela anonymní (skutečně funguje, vše bylo ověřeno, IP klientů jsou skryté)

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

Přidáme řádek

#define ANONYMOUS 1

Stiskneme Ctrl+x a Enter pro uložení změn.

4.8. Přejdeme k sestavení programu

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

Makelogmake[2]: Opouští adresář '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Opouští adresář '/opt/proxy/3proxy-0.8.12/src'

Žádné chyby, pokračujeme.

4.9. Nainstalujeme program do systému

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

4.10. Přejdeme do kořenového adresáře a zkontrolujeme, kam se program nainstaloval

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

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

4.11. Vytvoříme adresář pro konfigurační soubory a logy v domovském adresáři uživatele

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

4.12. Přejdeme do adresáře, kde by měl být konfigurační soubor

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

4.13. Vytvoříme prázdný soubor a zkopírujeme tam konfiguraci

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

Pro uložení stiskneme Ctrl + Z

4.14. Vytvoříme pid – soubor, aby nedocházelo k chybám při spuštění.

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

Pro uložení stiskneme Ctrl + Z

4.15. Spouštíme proxy server!

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

4.16. Podíváme se, zda server naslouchá na portech

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

netstat logAktivní internetová spojení (jen servery)
Proto Recv-Q Send-Q Lokální adresa Vzdálená adresa Stav PID/Název programu
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

Jak bylo uvedeno v konfigu, webový proxy naslouchá na portu 8080, Socks5 proxy na portu 3128.

4.17. Pro automatické spuštění proxy služby po restartu je potřeba ji přidat do cron.

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

Přidáme řádek

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

Stiskneme Enter, protože cron musí vidět znak konce řádku a uložíme soubor.

Mělo by se zobrazit hlášení o instalaci nového crontabu.

crontab: instalace nového crontabu

4.18. Restartujeme systém a pokusíme se připojit přes prohlížeč k proxy. K ověření použijeme prohlížeč Firefox (pro webovou proxy) a doplněk FoxyProxy pro socks5 s autentizací.

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

4.19. Po kontrole funkce proxy po restartu se můžeme podívat na logy. Tímto je nastavení proxy serveru dokončeno.

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

Nastavení a spuštění konfiguračního Transparent Proxy NAT

V této konfiguraci budou všechna zařízení vnitřní sítě transparentně pracovat na internetu přes vzdálený proxy server. Všechna tcp spojení budou přesměrována na jeden nebo více (skutečně rozšiřuje šířku kanálu, příklad konfigurace č. 2!) proxy serverů. Služba DNS bude využívat schopnosti 3proxy (dnspr). UDP ven „chodit“ nebude, protože zatím nevyužíváme mechanismus forward (ve výchozím stavu je deaktivován v jádře Linuxu).

1. Je čas zapnout rozhraní 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

Zde jsme přiřadili rozhraní enp0s8 statickou adresu 192.168.201.254 a masku 255.255.255.0.
Uložíme konfiguraci Ctrl+X a restartujeme.

root@debian9:~# restart

2. Kontrolujeme rozhraní

root@debian9:~# ifconfig

ifconfig logenp0s3: flags=4163UP,BROADCAST,RUNNING,MULTICAST 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 errors 0 dropped 0 overruns 0 frame 0
TX packets 65 bytes 10917 (10.6 KiB)
TX errors 0 dropped 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 packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73UP,LOOPBACK,RUNNING mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

3. Všechno funguje, nyní je třeba nastavit 3proxy pro transparentní proxy.

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

Příklad konfigurace transparentního proxy serveru č. 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 IP_ADRESA_VNEJSIHO_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. Nyní spouštíme 3proxy s novou konfigurací
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Znovu přidáme do crontabu
root@debian9:~/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

6. Podíváme se, co nyní naslouchá náš proxy
root@debian9:~# netstat -nlp

netstat logAktivní internetová spojení (jen servery)
Proto Recv-Q Send-Q Lokální adresa Vzdálená adresa Stav PID/Název programu
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. Nyní je proxy připraven přijímat jakékoli TCP spojení na portu 888, DNS na portu 53, aby je pak přesměroval na vzdálený socks5 proxy a DNS Google 8.8.8.8. Zbývá nám nastavit pravidla netfilter (iptables) a DHCP pro přidělování adres.

8. Nainstalujeme balíček iptables-persistent a dhcpd

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

9. Upravený soubor pro spuštění 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. Restartujeme a kontrolujeme službu na portu 67
root@debian9:~# restart
root@debian9:~# netstat -nlp

netstat logAktivní internetová spojení (jen servery)
Proto Recv-Q Send-Q Lokální adresa Vzdálená adresa Stav PID/Název programu
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. Zbývá přesměrovat všechny tcp požadavky na port 888 a uložit pravidlo do 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. Pro rozšíření šířky pásma lze použít hned několik proxy serverů. Celková suma by měla být 1000. Nová spojení se vytvářejí se pravděpodobností 0.2, 0.2, 0.2, 0.2, 0.1, 0.1 na uvedené proxy servery.

Poznámka: pokud máme web-proxy, místo socks5 je třeba napsat connect, pokud socks4, tak socks4 (socks4 NENÍ PODPOROVÁNA AUTORIZACE UŽIVATELSKÉHO JMÉNA/HESLA!)

Příklad konfigurace transparentního proxy serveru č. 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_ADRESA_VNEJSIHO_PROXYČÍSLO1 3128 tester 1234
parent 200 socks5 IP_ADRESA_VNEJSIHO_PROXYČÍSLO2 3128 tester 1234
parent 200 socks5 IP_ADRESA_VNEJSIHO_PROXYČÍSLO3 3128 tester 1234
parent 200 socks5 IP_ADRESA_VNEJSIHO_PROXYČÍSLO4 3128 tester 1234
parent 100 socks5 IP_ADRESA_VNEJSIHO_PROXYČÍSLO5 3128 tester 1234
parent 100 socks5 IP_ADRESA_VNEJSIHO_PROXYČÍSLO6 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

Nastavení a spuštění konfigurace NAT + Transparentní Proxy

V této konfiguraci budeme používat běžný mechanismus NAT s výběrovým nebo úplným transparentním proxy zpracováním jednotlivých adres nebo podsítí. Uživatelé interní sítě budou pracovat s určitými službami/podsítmi, aniž by tušili, že pracují přes proxy. Všechny https spojení fungují skvěle, žádné certifikáty generovat/anulovat není třeba.

Nejprve si ujasníme, které podsítě/služby chceme procházet. Předpokládejme, že externí proxy servery se nacházejí tam, kde funguje služba, jako je pandora.com. Nyní je potřeba určit její podsítě/adresy.

1. Pinging

root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) bajtů dat.

2. Hledáme na Googlu BGP 208.85.40.20

Přejdeme na stránku bgp.he.net/net/208.85.40.0/24#_netinfo
Je vidět, že hledaná podsíť je AS40428 Pandora Media, Inc

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

Otevíráme prefixy v4

bgp.he.net/AS40428#_prefixes

A tady jsou hledané podsítě!

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. Pro snížení počtu podsítí je potřeba provést agregaci. Přejdeme na stránku ip-calculator.ru/aggregate a zkopírujeme tam náš seznam. Výsledkem je — 6 podsítí místo 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. Vyčistíme pravidla iptables

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

Povolíme mechanismus forward a 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

Aby byl forwarding trvale povolen po restartu, upravíme soubor

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

A odkomentujeme řádek

net.ipv4.ip_forward = 1

Ctrl+X pro uložení souboru

5. Zabalíme podsítě pandora.com do 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. Uložíme pravidla

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

Nastavení a spuštění konfigurace Transparent Proxy přes router

V této konfiguraci může být transparentní proxy server samostatný PC nebo virtuální stroj za domácím/korporátním routerem. Stačí nastavit statické trasy na routeru nebo zařízeních a celý podsíť bude používat proxy bez potřeby dalších nastavení.

DŮLEŽITÉ! Musí být zajištěno, že náš gateway obdrží statickou IP od routeru, nebo je nastaveno na statiku samotné.

1. Nastavíme statickou adresu gateway (adaptér 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. Umožníme zařízením v podsíti 192.168.23.0/24 používat 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. Uložíme pravidla
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Zapíšeme podsítě na routeru

Seznam sítí routeru199.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

Použité materiály/zdroje

1. Oficiální web programu 3proxy 3proxy.ru

2. Návod na instalaci 3proxy z zdrojového kódu www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Vývojářská větev 3proxy na GitHubu github.com/z3APA3A/3proxy/issues/274

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster