GrundlĂŠggende om gennemsigtig proxy med 3proxy og iptables/netfilter eller hvordan man 'sender alt gennem en proxy'

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 bgp.he.net/net/208.85.40.0/24#_netinfo
It is clear that the sought subnet belongs to AS40428 Pandora Media, Inc

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

Open the v4 prefixes

bgp.he.net/AS40428#_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 ip-calculator.ru/aggregate 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 3proxy.ru

2. Installation instructions for 3proxy from source www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Developer branch of 3proxy on GitHub github.com/z3APA3A/3proxy/issues/274

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster