Základy transparentního proxyingu pomocí 3proxy a iptables / netfilter aneb jak „všechno dát přes proxy“

V tomto článku bych rád poodhalil možnosti transparentního proxyingu, který umožňuje zcela nepozorovaně klienty přesměrovat veškerý provoz nebo jeho část přes externí proxy servery.

Když jsem tento problém začal řešit, narazil jsem na to, že jeho implementace má jeden podstatný problém – protokol HTTPS. Za starých dobrých časů nebyly žádné zvláštní problémy s transparentním HTTP proxy, ale s HTTPS proxy hlásí prohlížeče rušení protokolu a tím štěstí končí.

V běžném návodu pro proxy server Squid dokonce nabízejí vygenerování vlastního certifikátu a jeho instalaci na klienty, což je naprostý nesmysl přinejmenším iracionální a vypadá to jako MITM útok. Vím, že Squid už něco podobného umí, ale tento článek je o osvědčené a fungující metodě pomocí 3proxy od respektovaného 3APA3A.

Dále se blíže podíváme na proces budování 3proxy ze zdrojů, jeho konfiguraci, plnou a selektivní proxy pomocí NAT, distribuci kanálu na několik externích proxy serverů a také použití routeru a statických rout. Jako OS používáme Debian 9 x64. Začít!

Instalace 3proxy a spuštění normálního proxy

1. Nainstalujte ifconfig (z balíčku net-tools)
apt-get install net-tools
2. Nainstalujte Midnigth Commander
apt-get install mc
3. Nyní máme 2 rozhraní:
enp0s3 - externí, dívá se na internet
enp0s8 - interní, musí se podívat do místní sítě
V jiných distribucích založených na Debianu se rozhraní obvykle nazývají eth0 a eth1.
ifconfig -a

rozhraníenp0s3: příznaky=4163 mtu 1500
inet 192.168.23.11 maska ​​sítě 255.255.255.0 vysílání 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 pakety 6412 bajtů 8676619 (8.2 MiB)
Chyby RX 0 zahozené 0 překročení 0 snímek 0
TX pakety 1726 bajtů 289128 (282.3 kB)
Chyby TX 0 zahozené 0 překročení 0 přenašeč 0 kolize 0

enp0s8: příznaky=4098 mtu 1500
ether 08:00:27:79:a7:e3 txqueuelen 1000 (Ethernet)
RX pakety 0 bajtů 0 (0.0 B)
Chyby RX 0 zahozené 0 překročení 0 snímek 0
TX pakety 0 bajtů 0 (0.0 B)
Chyby TX 0 zahozené 0 překročení 0 přenašeč 0 kolize 0

lo: příznaky=73 mtu 65536
inet 127.0.0.1 maska ​​sítě 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX pakety 0 bajtů 0 (0.0 B)
Chyby RX 0 zahozené 0 překročení 0 snímek 0
TX pakety 0 bajtů 0 (0.0 B)
Chyby TX 0 zahozené 0 překročení 0 přenašeč 0 kolize 0

Rozhraní enp0s8 se momentálně nepoužívá, povolíme ho, když budeme chtít použít konfiguraci NAT nebo NAT Proxy. Pak by bylo logické přiřadit mu statickou ip.

4. Začněme instalovat 3proxy

4.1 Instalace základních balíčků pro kompilaci 3proxy ze zdroje

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

4.2. Vytvořte složku pro stažení archivu se zdroji

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

4.3. Pojďme do této složky

root@debian9:~# cd /opt/proxy

4.4. Nyní si stáhneme nejnovější balíček 3proxy. V době psaní tohoto článku byla nejnovější stabilní verze 0.8.12 (18) Stáhněte si ji z oficiálních stránek 04proxy

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

4.5. Rozbalte stažený archiv

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

4.6. Přejděte do rozbaleného adresáře a vytvořte program

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 byl náš server zcela anonymní (skutečně funguje, vše je zkontrolováno, IP adresy klientů jsou skryté)

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

Přidejte řádek

#define ANONYMOUS 1

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

4.8. Pojďme sestavit program

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

makelogmake[2]: Opuštění adresáře '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Opuštění adresáře '/opt/proxy/3proxy-0.8.12/src'

Žádné chyby, pokračujte.

4.9. Nainstalujte program do systému

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

4.10. Přejděte do kořenového adresáře a zkontrolujte, kde byl program nainstalován

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 složku pro konfigurační soubory a protokoly v domovském adresáři uživatele

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

4.12. Přejděte do adresáře, kde by měl být config

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

4.13. Vytvořte prázdný soubor a zkopírujte tam konfiguraci

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

3proxy.confdémon
pidfile /home/joke/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
uživatelský tester:CL:1234
časové limity 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"
otočit 3
auth silný
proud
povolit tester
ponožky -p3128
proxy -p8080

Pro uložení stiskněte Ctrl + Z

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

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

Pro uložení stiskněte Ctrl + Z

4.15. Spusťte proxy server!

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

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

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

log netstatAktivní připojení k internetu (pouze servery)
Proto Recv-Q Send-Q Místní adresa Cizí 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 :::* POSLECH 338/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 352/dhklient

Jak bylo napsáno v konfiguraci, web proxy poslouchá na portu 8080, proxy Socks5 - 3128.

4.17. Chcete-li po restartu automaticky spustit službu proxy, musíte ji přidat do cronu.

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

Přidejte řádek

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

Stiskneme Enter, protože cron by měl vidět znak konce řádku a soubor uložit.

Měla by se objevit zpráva o instalaci nového crontab.

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žíváme prohlížeč Firefox (pro webovou proxy) a doplněk FoxyProxy pro socks5 s autentizací.

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

4.19. Po kontrole práce proxy po restartu můžete vidět protokoly. Tím je nastavení proxy serveru dokončeno.

3 protokol proxy1542573996.018 PROXY.8080 00000 tester 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com:443_
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í konfigurace Transparent Proxy NAT

V této konfiguraci budou všechna zařízení v interní síti transparentně fungovat na internetu přes vzdálený proxy server. Absolutně všechna připojení tcp budou přesměrována na jeden nebo několik (skutečně rozšiřuje šířku kanálu, příklad konfigurace č. 2!) proxy serverů. Služba DNS bude používat funkce 3proxy (dnspr). UDP „nepůjde“ ven, protože zatím nepoužíváme dopředný mechanismus (ve výchozím nastavení v jádře Linuxu zakázán).

1. Je čas povolit rozhraní enp0s8

root@debian9:~# nano /etc/network/interfaces

/etc/network/interfaces# Tento soubor popisuje síťová rozhraní jsou k dispozici na vašem systému
# Activated a jak na ně. Pro více informací viz rozhraní (5).

zdroj /etc/network/interfaces.d/*

# Síťové rozhraní loopback
auto lo
iface lo inet loopback

# Primární síťové rozhraní
allow-hotplug enp0s3
iface enp0s3 inet dhcp

# Sekundární síťové rozhraní
allow-hotplug enp0s8
iface enp0s8 inet statický
adresu 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žte konfiguraci Ctrl+X a restartujte

root@debian9:~# reboot

2. Kontrola rozhraní

root@debian9:~# ifconfig

protokol ifconfigenp0s3: příznaky=4163 mtu 1500
inet 192.168.23.11 maska ​​sítě 255.255.255.0 vysílání 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 pakety 61 bajtů 7873 (7.6 KiB)
Chyby RX 0 zahozené 0 překročení 0 snímek 0
TX pakety 65 bajtů 10917 (10.6 kB)
Chyby TX 0 zahozené 0 překročení 0 přenašeč 0 kolize 0

enp0s8: příznaky=4163 mtu 1500
inet 192.168.201.254 maska ​​sítě 255.255.255.0 vysílání 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 pakety 0 bajtů 0 (0.0 B)
Chyby RX 0 zahozené 0 překročení 0 snímek 0
TX pakety 8 bajtů 648 (648.0 B)
Chyby TX 0 zahozené 0 překročení 0 přenašeč 0 kolize 0

lo: příznaky=73 mtu 65536
inet 127.0.0.1 maska ​​sítě 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback)
RX pakety 0 bajtů 0 (0.0 B)
Chyby RX 0 zahozené 0 překročení 0 snímek 0
TX pakety 0 bajtů 0 (0.0 B)
Chyby TX 0 zahozené 0 překročení 0 přenašeč 0 kolize 0

3. Vše fungovalo, nyní je třeba nakonfigurovat 3proxy pro transparentní proxy.

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

Příklad konfigurace transparentního proxy č. 1démon
pidfile /home/joke/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
časové limity 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"
otočit 3
proud
autentizovat jedinečně
dnspr
dovolit *
rodič 1000 ponožek5 IP_ADDRESS_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. Nyní spusťte 3proxy s novou konfigurací
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

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

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

log netstatAktivní připojení k internetu (pouze servery)
Proto Recv-Q Send-Q Místní adresa Cizí 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 :::* POSLECH 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. Nyní je proxy připraven přijímat jakákoli TCP spojení na portu 888, DNS na portu 53, aby je přesměroval na vzdálené socks5 - proxy a DNS Google 8.8.8.8. Zbývá nám nakonfigurovat netfilter (iptables) a pravidla DHCP pro vydávání adres.

8. Nainstalujte balík iptables-persistent a dhcpd

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

9. Upravte spouštěcí soubor dhcpd
root@debian9:~# nano /etc/dhcp/dhcpd.conf

dhcpd.conf#dhcpd.conf
#
# Ukázkový konfigurační soubor pro ISC dhcpd
#

# definice možností společné pro všechny podporované sítě…
volba název-domény "example.org";
volba servery doménových jmen ns1.example.org, ns2.example.org;

výchozí doba nájmu 600;
maximální doba pronájmu 7200;

ddns-update-style žádný;

# Pokud je tento server DHCP oficiálním serverem DHCP pro místní
# network, autoritativní směrnice by měla být bez komentáře.

autoritativní;

# Mírně odlišná konfigurace pro vnitřní podsíť.
podsíť 192.168.201.0 maska ​​sítě 255.255.255.0 {
rozsah 192.168.201.10 192.168.201.250;
volba servery doménových jmen 192.168.201.254;
volitelné routery 192.168.201.254;
možnost broadcast-address 192.168.201.255;
výchozí doba nájmu 600;
maximální doba pronájmu 7200;
}

11. Restartujte a zkontrolujte službu na portu 67
root@debian9:~# reboot
root@debian9:~# netstat -nlp

log netstatAktivní připojení k internetu (pouze servery)
Proto Recv-Q Send-Q Místní adresa Cizí 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 :::* POSLECH 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
nezpracovaný 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 pravidlo uložit 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. Chcete-li rozšířit šířku pásma kanálu, můžete použít několik proxy serverů najednou. Celková částka by měla být 1000. Nová připojení jsou navázána s pravděpodobností 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 k zadaným proxy serverům.

Poznámka: pokud máme web proxy, tak místo socks5 je potřeba napsat connect, pokud socks4, tak socks4 (socks4 NEPODPORUJE AUTORIZACI PŘIHLÁŠENÍ / HESLA!)

Příklad konfigurace transparentního proxy č. 2démon
pidfile /home/joke/proxy/3proxy.pid
server 8.8.8.8
nscache 65536
maxconn 500
časové limity 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"
otočit 3
proud
autentizovat jedinečně
dnspr
dovolit *

rodič 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 tester 1234
rodič 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 tester 1234
rodič 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 tester 1234
rodič 200 socks5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 tester 1234
rodič 100 socks5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 tester 1234
rodič 100 socks5 IP_ADDRESS_EXTERNAL_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

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

V této konfiguraci použijeme obvyklý mechanismus NAT se selektivním nebo plně transparentním proxyováním jednotlivých adres nebo podsítí. Uživatelé vnitřní sítě budou pracovat s určitými službami / podsítěmi, aniž by si uvědomovali, že pracují přes proxy. Všechna připojení https fungují dobře, není třeba generovat / nahrazovat žádné certifikáty.

Nejprve se rozhodneme, které podsítě / služby chceme proxy. Předpokládejme, že externí proxy jsou umístěny tam, kde běží služba jako pandora.com. Nyní zbývá určit jeho podsítě / adresy.

1. Ping

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

2. Do Google zadáme BGP 208.85.40.20

Jděte na webové stránky bgp.he.net/net/208.85.40.0/24#_netinfo
Je vidět, že podsíť, kterou hledám, je AS40428 Pandora Media, Inc.

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

Otevírací předpony v4

bgp.he.net/AS40428#_prefixes

Zde jsou požadované 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. Chcete-li snížit počet podsítí, musíte provést agregaci. Pojďme na web ip-calculator.ru/aggregate a zkopírujte 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ěte pravidla iptables

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

Povolte dopředný mechanismus 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 bylo přeposílání povoleno trvale po restartu, změníme soubor

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

A odkomentujte řádek

net.ipv4.ip_forward = 1

Ctrl+X pro uložení souboru

5. Zabalte 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žte pravidla

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

Nastavení a spuštění Transparent Proxy přes konfiguraci routeru

V této konfiguraci může být transparentním proxy serverem samostatné PC nebo virtuální stroj za domácím/podnikovým routerem. Stačí zaregistrovat statické cesty na routeru nebo zařízeních a celá podsíť bude využívat proxy bez nutnosti dalšího nastavování.

DŮLEŽITÉ! Je nutné, aby naše brána přijímala statickou IP od routeru, nebo aby byla sama nakonfigurována na statickou.

1. Nastavte statickou adresu brány (adaptér enp0s3)

root@debian9:~# nano /etc/network/interfaces

/etc/network/interfaces# Tento soubor popisuje síťová rozhraní jsou k dispozici na vašem systému
# Activated a jak na ně. Pro více informací viz rozhraní (5).

zdroj /etc/network/interfaces.d/*

# Síťové rozhraní loopback
auto lo
iface lo inet loopback

# Primární síťové rozhraní
allow-hotplug enp0s3
iface enp0s3 inet statický
adresu 192.168.23.2
netmask 255.255.255.0
brána 192.168.23.254

# Sekundární síťové rozhraní
allow-hotplug enp0s8
iface enp0s8 inet statický
adresu 192.168.201.254
netmask 255.255.255.0

2. Umožněte zařízením z podsítě 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žte pravidla
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Napíšeme podsítě na router

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í stránky programu 3proxy 3proxy.ru

2. Pokyny pro instalaci 3proxy ze zdrojů www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

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

Zdroj: www.habr.com

Přidat komentář