Основи на прозрачното проксиране с използването на 3proxy и iptables/netfilter или как да "пуснете всичко през проксито"

В тази статия бихме искали да разкрием възможностите на прозрачното проксиране, което позволява напълно незабелязано за клиентите да пренасочва целия или част от трафика през външни прокси-сървъри.

Когато започнах да решавам тази задача, се сблъсках с един съществения проблем — протокола HTTPS. В стари добри времена нямаше особени проблеми с прозрачното проксиране на HTTP, но при проксирането на HTTPS браузерите съобщават за намеса в протокола и на този етап забавлението свършва.

В разпространените инструкции на прокси-сървъра Squid дори предлагат да се генерира собствен сертификат и да се инсталира на клиентите, което е напълно нелепо и изглежда като MITM атака. Знам, че Squid вече може да прави нещо подобно, но в тази статия става дума за проверен и работещ начин с използването на 3proxy от уважавания 3APA3A.

По-нататък ще разгледаме подробно процеса на компилация на 3proxy от източниците, неговата настройка, пълно и изборно проксиране с използването на NAT, разпределение на канала към няколко външни прокси-сървъра, а също и използването на рутер и статични маршрути. В качеството на ОС ще ползваме Debian 9 x64. Да започваме!

Инсталация на 3proxy и стартиране на обикновен прокси-сървър

1. Инсталираме ifconfig (от пакета net-tools)
apt-get install net-tools
2. Инсталираме Midnight Commander
apt-get install mc
3. В момента имаме 2 интерфейса:
enp0s3 — външен, гледа към интернет
enp0s8 — вътрешен, трябва да гледа към локалната мрежа
В други дистрибуции, базирани на Debian, интерфейсите обикновено се наричат eth0 и eth1.
ifconfig -a

Интерфейсиenp0s3: 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 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=4098 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=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 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

Интерфейсът enp0s8 в момента не се използва, ще го включим, когато решим да използваме конфигурацията Proxy NAT или NAT. Точно тогава ще е логично да му присвоим статичен IP.

4. Да започнем с инсталацията на 3proxy

4.1 Инсталиране на основни пакети за компилиране на 3proxy от изходния код

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

4.2. Създаваме папка за изтегляне на архива с изходния код

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

4.3. Преминаваме в тази папка

root@debian9:~# cd /opt/proxy

4.4. Сега ще изтеглим последния пакет на 3proxy. Към момента на написване на статията последната стабилна версия беше 0.8.12 (18/04/2018). Ще я изтеглим от официалния сайт на 3proxy.

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

4.5. Разархивираме изтегления архив

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

4.6. Преминаваме в разархивираната директория за компилиране на програмата

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

4.7. Следва да добавим ред в заглавния файл, за да направим нашия сървър напълно анонимен (сработва, всичко е проверено, IP адресите на клиентите са скрити)

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

Добавяме реда

#define ANONYMOUS 1

Натискаме Ctrl+x и Enter, за да запазим промените.

4.8. Да пристъпим към компилиране на програмата

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

Makelogmake[2]: Излизане от директорията ‘/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin’
make[1]: Излизане от директорията ‘/opt/proxy/3proxy-0.8.12/src’

Няма грешки, продължаваме.

4.9. Инсталираме програмата в системата

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

4.10. Преминаваме в кореновата директория и проверяваме къде е инсталирана програмата

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

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

4.11. Създаваме папка за конфигурационни файлове и логове в домашната директория на потребителя

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

4.12. Преминаваме в директорията, където трябва да бъде конфигурацията

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

4.13. Създаваме празен файл и копираме конфигурацията там

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

За да запазим, натискаме Ctrl + Z

4.14. Създаваме pid файл, за да избегнем грешки при стартиране.

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

За да запазим, натискаме Ctrl + Z

4.15. Стартираме прокси сървъра!

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

4.16. Нека видим дали сървърът слуша портовете

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

netstat logАктивни интернет връзки (само сървъри)
Proto Recv-Q Send-Q Локален адрес Чужд адрес Състояние PID/Име на програмата
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

Както беше посочено в конфигурацията, уеб проксито слуша на порт 8080, Socks5 проксито — 3128.

4.17. За автоматично стартиране на услугата за прокси след рестартиране, трябва да я добавим в cron.

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

Добавяме реда

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

Натискаме Enter, така че cron да види символа за край на реда и запазваме файла.

Трябва да има съобщение за инсталиране на нов crontab.

crontab: инсталиране на нов crontab

4.18. Рестартираме системата и опитваме да се свържем през браузър с прокси. За проверка използваме браузъра Firefox (за уеб-прокси) и добавката FoxyProxy за socks5 с удостоверяване.

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

4.19. След проверка на работата на проксито след рестартиране, можем да прегледаме логовете. На това настройката на прокси сървъра е завършена.

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

Настройка и стартиране на конфигурация за Transparent Proxy NAT

В тази конфигурация всички устройства от вътрешната мрежа ще работят прозрачно в интернет през отдалечен прокси. Абсолютно всички tcp-соединения ще бъдат пренасочвани към един или няколко (реално разширяващи ширината на канала, пример на конфигурация №2!) проксита. DNS услугата ще използва функциите на 3proxy (dnspr). UDP няма да излиза, тъй като все още не използваме механизма forward (по подразбиране е деактивиран в ядрото на Linux).

1. Време е да активираме интерфейса 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

Тук назначихме на интерфейса enp0s8 статичен адрес 192.168.201.254 и маска 255.255.255.0
Запазваме конфигурацията с Ctrl+X и рестартираме

root@debian9:~# рестартиране

2. Проверяваме интерфейсите

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 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=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 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. Всичко е наред, сега трябва да настроим 3proxy за прозрачно проксиране.

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

Примерна конфигурация на прозрачно прокси сървър №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_АДРЕС_ВНЕШЕН_ПРОКСИ 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. Сега стартираме 3proxy с новата конфигурация
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

5. Отново добавяме в crontab
root@debian9:~/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf

6. Ще видим какво слуша сега нашия прокси
root@debian9:~# netstat -nlp

netstat logАктивни интернет връзки (само сървъри)
Proto Recv-Q Send-Q Локален адрес Чужд адрес Състояние PID/Име на програмата
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. Сега проксито е готово да приема всякакви TCP-съединения на порт 888, DNS на порт 53, за да ги пренасочи към отдалечен socks5 - прокси и DNS на Google 8.8.8.8. Остава само да настроим правилата за netfilter (iptables) и DHCP за раздаване на адреси.

8. Нека инсталираме пакета iptables-persistent и dhcpd

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

9. Редактираме файла за стартиране на 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. Рестартираме и проверяваме услугата на порт 67
root@debian9:~# рестартиране
root@debian9:~# netstat -nlp

netstat logАктивни интернет връзки (само сървъри)
Proto Recv-Q Send-Q Локален адрес Чужд адрес Състояние PID/Име на програмата
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. Остава да пренасочим всички tcp заявки на порт 888 и да запазим правилото в 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. За разширение на пропускателната способност може да се използват няколко прокси-сервера. Общата сума трябва да бъде 1000. Новите съединения се установяват със вероятност 0.2, 0.2, 0.2, 0.2, 0.1, 0.1 към посочените прокси-сървъри.

Забележка: Ако имаме уеб-прокси, вместо socks5, трябва да се напише connect, а ако е socks4, то socks4 (socks4 НЕ ПОДДЪРЖА АВТОРИЗАЦИЯ С ЛОГИН/ПАРОЛА!)

Примерна конфигурация на прозрачен прокси-сървър №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_АДРЕС_ВНЕШЕН_ПРОКСИ№1 3128 tester 1234
parent 200 socks5 IP_АДРЕС_ВНЕШЕН_ПРОКСИ№2 3128 tester 1234
parent 200 socks5 IP_АДРЕС_ВНЕШЕН_ПРОКСИ№3 3128 tester 1234
parent 200 socks5 IP_АДРЕС_ВНЕШЕН_ПРОКСИ№4 3128 tester 1234
parent 100 socks5 IP_АДРЕС_ВНЕШЕН_ПРОКСИ№5 3128 tester 1234
parent 100 socks5 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

Настройка и стартиране на конфигурация NAT + Прозрачен прокси

В тази конфигурация ще използваме обикновен механизъм NAT с изборно или пълно прозрачно проксирене на отделни адреси или подсетак. Потребителите на вътрешната мрежа ще работят с определени служби/подсетак, дори и да не подозират, че работят през прокси. Всички https съединения работят без проблем, не е необходимо да се генерират/заменят сертификати.

Първо, нека да определим какви подсетки/услуги искаме да проксираме. Да предположим, че външните прокси сървъри се намират там, където работи такъв услуга, като pandora.com. Сега остава да определим неговите подсетки/адреси.

1. Пингуйте

root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) байта данни.

2. Търсете в Google BGP 208.85.40.20

Преминаваме на сайта bgp.he.net/net/208.85.40.0/24#_netinfo
Ясно е, че търсената подсетка е AS40428 Pandora Media, Inc

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

Отваряме префиксите v4

bgp.he.net/AS40428#_prefixes

Ето и търсените подсетки!

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. За да намалим броя на подсетките, трябва да изпълним агрегация. Преминаваме на сайта ip-calculator.ru/aggregate и копираме нашия списък там. В резултат — 6 подсетки вместо 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. Изчистваме правилата на iptables

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

Активираме механизма forward и 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

За да остане forward активиран постоянно след рестартиране, променяме файла

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

И разкоментираме реда

net.ipv4.ip_forward = 1

Ctrl+X за запазване на файла

5. Обгъваме подсетките на pandora.com в прокси

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. Запазваме правилата

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

Настройка и стартиране на конфигурацията Transparent Proxy чрез рутер

В тази конфигурация прозрачният прокси сървър може да бъде отделен компютър или виртуална машина зад домашния/корпоративния рутер. Достатъчно е да запишете статични маршрути на рутера или устройствата и всяка подсетка ще използва прокси без необходимост от допълнителни настройки.

ВАЖНО! Трябва нашият шлюз да получава статичен IP от рутера или да бъде настроен на статичен.

1. Настройваме статичен адрес за шлюза (адаптер 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. Позволяваме на устройствата от подсетката 192.168.23.0/24 да използват прокси

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. Запазваме правилата
root@debian9:~# iptables-save > /etc/iptables/rules.v4

4. Записваме подсетките на рутера

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

Използвани материали/ресурси

1. Официалният сайт на програмата 3proxy 3proxy.ru

2. Инструкция за инсталиране на 3proxy от изходен код www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. Клон на разработчика на 3proxy в GitHub github.com/z3APA3A/3proxy/issues/274

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster