Debian squid transparent proxy настройка iptables

Обновлено: 06.07.2024

Запуск прозрачного прокси-сервера в сети можно использовать для более сложной фильтрации содержимого веб-страниц в таких местах, как школа или библиотека (где в некоторых странах фильтрация требуется по закону) или для защиты детей в домашних условиях.

Это руководство поможет включить прозрачный прокси-сервер так, чтобы маршрутизатор (на примере Linksys WRT54G) автоматически перенаправлял весь трафик на прокси-сервер.

Contents

[edit] Настройка на компьютере

[edit] Squid версий до 2.6

Сначала установите Squid на Unix-сервер. После этого нужно настроить Squid выполнять функции прозрачного прокси-сервера следующими настройками:

[edit] Squid версии 2.6 или новее

С установленным Squid на устройстве Unix или Linux, задайте следующую настройку:

подставив IP-адрес маршрутизатора и порт по желанию, убедившись, что они соответствуют переменным в верхней части скрипта настройки маршрутизатора, представленного ниже.

Пакет Squid3 (squid3_3.0.PRE5-5) из Debian Etch не работает с таким прозрачным прокси. Попробуйте использовать Squid3 из Debian Lenny или откатиться на Squid-2.6 в Etch.

[edit] Настройка на маршрутизаторе

Вам нужно будет использовать iptables, чтобы сообщить маршрутизатору, куда направлять трафик. Если вы еще плохо разбираетесь в iptables, кто-то уже сделал всю работу и написал сценарий оболочки, который сделает всё за вас. Обязательно отредактируйте переменные вверху.

Эти сценарии необходимо сохранить в сценарии брандмауэра. В веб-интерфейсе перейдите на вкладку Administration → Commands и вставьте отредактированный скрипт в поле ввода, затем нажмите кнопку Save Firewall.

[edit] Прокси-сервер в локальной сети

Измените переменные PROXY_IP и PROXY_PORT, чтобы они соответствовали IP-адресу вашего прокси-сервера и порту TCP.


Если вам необходимо разрешить какому-либо устройству обходить прозрачный прокси-сервер (например, игровой системе или медиа-ресиверу), добавьте следующую команду, которая позволяет конкретному IP-адресу обходить прокси-сервер. Вы можете использовать её, чтобы добавить столько исключений, сколько захотите. Приемники DirecTV, которые транслируют видео по запросу (Video On Demand), должны быть добавлены в исключения, чтобы обходить прокси-серве.

[edit] Прокси-сервер в локальной сети: альтернативное решение

Решение, описанное в предыдущем разделе, перенаправляет пакеты на прокси-сервер, используя преобразование сетевых адресов NAT. В результате пакеты, поступающие на прокси-сервер, имеют IP-адрес источника маршрутизатора, а не исходного клиента. В результате невозможно увидеть IP-адрес исходного клиента в журналах прокси-сервера, а также невозможно применить правила доступа в прокси-сервере на основе IP-адреса исходного клиента.

Измените переменную PROXY_IP, чтобы она соответствовала IP-адресу прокси-сервера.

Если вам необходимо разрешить какому-либо устройству обходить прозрачный прокси-сервер (например, игровой системе или медиа-ресиверу), добавьте следующую команду, которая позволяет конкретному IP-адресу обходить прокси-сервер. Вы можете использовать её, чтобы добавить столько исключений, сколько захотите. Приемники DirecTV, которые транслируют видео по запросу (Video On Demand), должны быть добавлены в исключения, чтобы обходить прокси-серве.

Изменения, приведенные выше, будут направлять пакеты на IP-адрес прокси-сервера, но, поскольку пакеты не были изменены, они всё равно будут поступать на прокси-сервер через порт 80. Вам всё равно придется перенаправлять пакеты на правильный порт прокси-сервера по мере их поступления. Добавьте следующее правило в iptable на вашем прокси-сервере (обратите внимание, что на прокси-сервере потребуются дополнительные шаги, чтобы сделать эти изменение постоянным, но они здесь не рассматриваются).

Замените PROXY_PORT на правильный порт для вашего прокси, который будет 3128 из предыдущего примера.

[edit] Прокси-сервер в другой сети с использованием Chillispot

Приведенные выше сценарии используются, когда прокси-сервер находится в той же сети. Для тех, кому нужен прозрачный прокси-сервер с включенной функцией DD-WRT Chillispot когда прокси-сервер находится в другой сети, я изменил сценарий Вариант 1 выше для этих нужд. Отредактируйте выделенные жирным шрифтом переменные в соответствии с вашей конфигурацией.

[edit] Обратный прокси-сервер

Squid также можно использовать в качестве «обратного прокси-сервера» ("reverse proxy") или «веб-ускорителя» ("web accelerator"), если за ним находятся веб-серверы, на которых работают приложения с интенсивным использованием баз данных, такие как вики, хостинг для блогов или форумов.

Для Squid 2.4 и более ранних версий это называется режимом «ускорение одного хоста» ("accelerate single host"). Для версии 2.6 команды в squid.cfg выглядят так:

Squid осуществляет повышение скорости, сохраняя копии веб-страниц в файловой системе и передавая сохраненные копии пользователям вместо того, чтобы запрашивать их у веб-сервера, многократно генерируя динамический контент. Как таковой, он подходит в первую очередь для использования на устройствах с достаточным объемом жесткого диска (см. Хранилище USB) и может не подходить для небольших серверов с ограниченным пространством хранения.

Поскольку конфигурация Squid «обратный прокси-сервер» используется большими вики-сайтами, такими как Википедия, MediaWiki и Мета-ви́ки, предложил некоторую информацию об использовании Squid таким образом.

В данной статье хотелось бы раскрыть возможности прозрачного проксирования, которое позволяет абсолютно незаметно для клиентов перенаправлять весь либо часть трафика через внешние прокси-серверы.

В распространенных инструкциях к прокси-серверу Squid предлагают даже сгенерировать собственный сертификат и установить его клиентам, что полный бред как минимум нерационально и выглядит как MITM — атака. Я знаю, что Squid уже что-то подобное умеет делать, но речь в этой статье о проверенном и рабочем способе с использованием 3proxy от уважаемого 3APA3A.

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

Установка 3proxy и запуск обычного прокси-сервера

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

enp0s3: flags=4163<UP,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=4098<BROADCAST,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=73<UP,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

Интерфейс enp0s8 на данный момент не используется, мы его включим, когда захотим использовать конфигурацию Proxy NAT или NAT. Именно тогда логичным будет назначить ему статический ip.

4. Приступим к установке 3proxy

4.1 Установка базовых пакетов для компиляции 3proxy из исходников

4.2. Создадим папку для скачивания архива с исходниками

4.3. Перейдем в эту папку

4.4. Теперь загрузим последний пакет 3proxy. На момент написания статьи последней стабильной версией была 0.8.12 (18/04/2018) Скачаем её с официального сайта 3proxy

4.5. Распакуем скачанный архив

4.6. Переходим в распакованный каталог для сборки программы

4.7. Далее нужно добавить строчку в файл заголовка, чтобы наш сервер был полностью анонимным (реально работает, всё проверено, ip клиентов скрываются)

4.8. Приступим к сборке программы

make[2]: Leaving directory '/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin'
make[1]: Leaving directory '/opt/proxy/3proxy-0.8.12/src'

Ошибок нет, продолжаем.

4.9. Установим программу в систему

4.10. Переходим в корневой каталог и проверяем, куда установилась программа

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

4.12. Переходим в каталог, где должен быть конфиг

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

daemon
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 — файл, чтобы не было ошибок при запуске.

Для сохранения нажимаем Ctrl + Z

4.15. Запускаем прокси сервер!

4.16. Посмотрим, слушает ли сервер порты

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
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.

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

Нажимаем Enter, так как cron должен видеть символ конца строки и сохраняем файл.

crontab: installing new crontab

4.18. Перезагрузим систему и попробуем подключиться через браузер к прокси. Для проверки используем браузер Firefox (для веб-прокси) и дополнение FoxyProxy для socks5 с аутентификацией.

4.19. Проверив работу прокси после перезагрузки, можно посмотреть логи. На этом настройка прокси-сервера завершена.

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

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

1. Настало время включить интерфейс enp0s8

Тут мы назначили интерфейсу enp0s8 статический адрес 192.168.201.254 и маску 255.255.255.0
Сохраняем конфиг Ctrl+X и перезагружаемся

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

enp0s3: flags=4163<UP,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<UP,BROADCAST,RUNNING,MULTICAST> 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<UP,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. Всё получилось, теперь необходимо настроить 3proxy для прозрачного проксирования.

Пример конфигурации прозрачного прокси-сервера №1 daemon
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

6. Посмотрим, что теперь слушает наш прокси
root@debian9:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
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

8. Установим пакет iptables-persistent и dhcpd

9. Правим файл запуска dhcpd
root@debian9:

default-lease-time 600;
max-lease-time 7200;


11. Перезагружаемся и проверяем службу на порту 67
root@debian9:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
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

13. Для расширения полосы канала можно использовать сразу несколько прокси-серверов. Общая сумма должна быть 1000. Новые соединения устанавливаются с вероятностью 0.2, 0.2, 0.2, 0.2, 0,1, 0,1 к указанным прокси-серверам.

Примечание: если у нас web-прокси то вместо socks5 нужно писать connect, если socks4, то socks4 (socks4 НЕ ПОДДЕРЖИВАЕТ АВТОРИЗАЦИЮ ЛОГИН/ПАРОЛЬ!)

Пример конфигурации прозрачного прокси-сервера №2

daemon
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 + Transparent Proxy

2. Набираем в гугле BGP 208.85.40.20

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

Вот и искомые подсети!

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

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

Включаем механизм forward и NAT

Чтобы forward был включен постоянно после перезагрузки изменим файл

И раскомментируем строку

Ctrl+X для сохранения файла

6. Сохраним правила

Настройка и запуск конфигурации Transparent Proxy via router

В данной конфигурации прозрачный прокси-сервер может быть отдельным ПК или виртуальной машиной за домашним/корпоративным роутером. Достаточно прописать статические маршруты на роутере или устройствах и вся подсеть будет использовать прокси без необходимости каких-либо дополнительных настроек.

ВАЖНО! Необходимо, чтобы наш шлюз получал статический IP от роутера, либо был настроен на статику сам.

1. Настраиваем статический адрес шлюза (адаптер enp0s3)

2. Разрешаем устройствам из подсети 192.168.23.0/24 использовать проксирование

Для чистоты эксперимента будем считать что eth0 смотрит к провайдеру и получает от него настройки по DHCP, а eth1 смотрит в нашу локальную сеть и имеет классический адресс вида 192.168.100.1.

1) Настроим нашу сеть вот так:

$ cat /etc/network/interfaces

2) Установим и натсроим DHCP сервер вот так:

Отмечу, что сразу после установки он у нас не запустится, поэтому сразу приводим /etc/dhcp/dhcpd.conf к разумному виду

subnet 192.168.100.0 netmask 255.255.255.0 range dynamic-bootp 192.168.100.10 192.168.100.99;
option broadcast-address 192.168.100.255;
option routers 192.168.100.1;
>

Из конфига видно что клиенты будут получать адреса от *.10 до *.99.

3) Для нормальной работы нам обязательно потребуется сервер имен.

4) Теперь пришло время поднять и настроить Squid как кэширующий прозрачный прокси сервер

Стоит заметить, что можно работать со стандартным конфигом, но это будет не так как нам требуется и уж совсем не Debian way.
Поэтому приводим конфиг к такому виду:

$ cat /etc/squid3/squid.conf

hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid3
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

shutdown_lifetime 5.00 second
cache_dir ufs /var/cache/squid 2048 16 256
maximum_object_size 10024.00 bytes

chmod 755 -R /var/cache/squid

И спокойно перезапускаем наш Squid.

/etc/init.d/squid3 restart

После перезапуска должен пересоздаться кэш.

5) Очень важно правильно настроить iptables.

На этом шаге я предлагаю Вам создать скрипт настройки, так как он пригодится как универсальное средство.

Мы обозначили переменные (для удобства), 3 правила для таблицы NAT и 1 для FORWARD.
Порты 443,21,22 пускаем в обход прокси сервера.
Помимо настроек iptables, в этом скрипте, мы включаем форвардинг пакетов.

6) Настроим автозагрузку натсроек iptables.

Сохраням настройки iptables.

Добавляем команду авотзапуска в /etc/rc.local (мне нравится Perl но тут кому как).

Также не забываем про форвардинг пакетов

В целом настройка прозрачного прокси сервера закончена, но чтобы логи были читаемы, нам наобходимо отключить поддержку ipv6 (из за того что ipv6 у нас не настроен на адаптере будет много warnings).

7) Отключаем IPv6

Предлагаю опять же сделать скрипт чтобы не запутаться.

В общих чертах что в этом скриптике происходит:
Сперва отключаем пожжержку ipv6 в модулях ядра.
Далее указываем маркер в /proc на не использование ipv6.
И в 67 строке /boot/grub/grub.cfg дописываем параметр ipv6.disable=1.

Такая канитель с tee и sed нужна для того чтобы сохранить настройки /boot/grub/grub.cfg, так как там устройства обозначаются не по /dev/sd* и по UUID.

Хотя все всегда можно дописать ручками.

Скрипт все время допиливается. В ближайшее время будет добавлена поддержка havp (проверка трафика антивирусом на лету до вхождения в squid) с кастомными темплейтами. Соответственно постараюсь максимально изложить мат. часть в необходимой для понимания мере.

Как это работает?

Установка Squid и OpenSSL в Gentoo

Для работы с SSL сертификатами в системе должен быть установлен пакет openssl, если еще нет, установите:

sudo emerge -av openssl

Если вы работаете в Gentoo, то теперь squid нужно собрать с поддержкой SSL и динамической генерации сертификатов, а это соответственно опции: --enable-ssl и --enable-ssl-crtd, поэтому:

net-proxy/squid ssl-crtd ssl

Затем осталось установить Squid:

sudo emerge -pv squid

Установка Squid и OpenSSL в Ubuntu

sudo apt install openssl

С Squid дела обстоят сложнее. Версия, которая есть в репозиториях не поддерживает работу с SSL. Поэтому придется собрать её вручную. Для этого сначала установите зависимости, необходимые для сборки:

sudo apt build-dep squid

Затем установите библиотеку для SSL:

sudo apt install libssl-dev

Создайте папку для сборки в домашней директории и перейдите в неё:

Скачайте в эту папку исходники Squid:

sudo apt source squid

В текущей папке появится ещё одна папка с исходниками, перейдите в неё.


Затем надо отредактировать файл debian/rules и добавить в него следующие флаги компиляции:

sudo vi debian/rules

--enable-ssl \
--enable-ssl-crtd \
--with-openssl


Эти опции надо вставить в переменную BUILD_CXX, она там одна такая. Затем останется только собрать и установить полученный пакет:

sudo debuild -d -uc -us

sudo dpkg -i ../squid*.deb

После установки вы можете убедится, что ваша версия Squid теперь поддерживает SSL выполнив:

squid -v | grep ssl


Настройка Squid

Сначала создадим папку для хранения сертификатов, например в /etc/squid/ssl:

Теперь генерируем корневой сертификат собственного CA (Центра сертификации) на основе которого будут подписываться сертификаты для сайтов:

sudo openssl genrsa -out /etc/squid/ssl/squid.key
sudo openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr
sudo openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem


Генерируем корневой сертификат который затем нужно будет добавить в браузер:

sudo openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der

Далее надо дать права на папку с сертификатами для Squid:

chown -R proxy:proxy /etc/squid/ssl

В файл конфигурации надо добавить такие настройки:

sudo vi /etc/squid/squid.conf

Дальше нужно пересоздать базу данных сертификатов:

rm -rf /var/lib/ssl_db

/usr/lib/squid/security_file_certgen -c -s /var/lib/ssl_db -M 4MB

chown -R proxy:proxy /var/lib/ssl_db

Сервис Squid должен обязательно иметь права на директорию /var/lib/ssl_db. Следующим шагом включаем ip_forwarding для разрешения проходящего трафика через узел:

echo 1 >> /proc/sys/net/ipv4/ip_forward

Затем можно перезапускать Squid:

sudo systemctl restart squid

Настройка iptables

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130

Если вы хотите тестировать прокси с локальным трафиком, то надо перенаправлять на Squid весь трафик, кроме трафика от Squid, это можно сделать такими правилами:

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 80 -j REDIRECT --to-port 3129

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 443 -j REDIRECT --to-port 3130

Настройка браузера

Сейчас большинство сайтов используют технологию HSTS для предотвращения MiTM атак, поэтому если вы хотите настроить Squid для фильтрации трафика в своей организации, вам следует добавить сертификат .der сгенерированный на предыдущем шаге в браузер. Рассмотрим на примере Firefox. Откройте Настройки -> Защита и приватность -> Просмотр сертификатов -> Центры сертификации:

Затем нажмите кнопку Импортировать и выберите файл squid.der, находящейся в директории /etc/squid/ssl. Отметьте галочки, что следует доверять этому сертификату.

Фильтрация трафика

Теперь откройте какой-либо сайт. Если всё сделано верно, то сайт откроется, но сертификат будет не его, а ваш:


tail -f /var/log/squid/access.log


Завершение

Иногда важно отдохнуть, расслабиться, посмотреть на природу. На десерт сегодня, красивое видео - путь на вершину:

Читайте также: