DataLife Engine / Поднимаем прозрачный прокси Squid на Ubuntu 22.04

Поднимаем прозрачный прокси Squid на Ubuntu 22.04


На Хабре у меня уже есть статья на тему поднятия прозрачного прокси Squid на FreeBSD 13.0 с фильтрацией ресурсов и без подмены сертификатов. Решил актуализировать статью под ОС Ubuntu 22.04.

Топология



Почему не обычный DNAT


Важно: Роутер не должен делать dst-nat на IP Squid, так как это ломает работу intercept режима. Начиная с Squid 3.2, DNAT должен происходить только на самой машине со Squid, иначе Squid не сможет восстановить оригинальный адрес назначения через getsockopt(SO_ORIGINAL_DST). Информация живёт в conntrack таблице того устройства, которое делало NAT и недоступна с другой машины.

Рабочая схема это Policy-Based Routing (PBR) на MikroTik: пакет доставляется на Squid с оригинальным IP:port назначения (без подмены) и Squid на своей стороне делает REDIRECT.

1. Установка Squid
apt update
apt install -y squid-openssl

Важно: в Ubuntu/Debian обычный пакет squid собран без поддержки OpenSSL т.е. в нём нет SSL-bump и бинарника security_file_certgen. Для peek-and-splice нужен именно пакет squid-openssl.

2. Включаем пересылку пакетов
sysctl -w net.ipv4.ip_forward=1

3. Сертификат для SSL-bump (peek-and-splice)
Даже в режиме peek-and-splice нужен сертификат для этапа bump, он не подставляется клиенту, но нужен внутри Squid.

mkdir -p /etc/squid/ssl_cert
cd /etc/squid/ssl_cert
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
  -keyout squidCA.pem -out squidCA.pem \
  -subj "/CN=proxy.local"

Инициализация базы для сертификатов
mkdir /var/lib/squid
/usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 4MB
chown -R proxy:proxy /var/lib/squid/ssl_db

4. Список запрещённых доменов
cat > /etc/squid/blocked_urls.acl << 'EOF'
.youtube.com
.instagram.com
.tiktok.com
EOF

5. Конфиг /etc/squid/squid.conf
# Hostname
visible_hostname proxy.local

# DNS
dns_nameservers 1.1.1.1 8.8.8.8

# Локальная сеть — ЗАМЕНИТЕ на вашу подсеть
acl localnet src 192.168.1.0/24

# Список блокировок
acl blocked_urls url_regex -i "/etc/squid/blocked_urls.acl"
acl blocked_https ssl::server_name "/etc/squid/blocked_urls.acl"

# Порты

http_port 127.0.0.1:3128

http_port 3129 intercept
https_port 3130 intercept ssl-bump \
    cert=/etc/squid/ssl_cert/squidCA.pem \
    generate-host-certificates=off

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

acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump terminate blocked_https
ssl_bump splice all

# Разрешённые порты
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access deny to_localhost

# Блокировка доменов
http_access deny blocked_urls

# Разрешить локальной сети
http_access allow localnet
http_access allow localhost
http_access deny all

coredump_dir /var/spool/squid
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

Проверка конфига
squid -k parse

Запуск Squid
systemctl enable --now squid

6. Настройка Policy-Based Routing (PBR) в MikroTik RouterOS 7 (доставка пакетов на Squid)
На MikroTik: не dst-nat, а разметка + отдельная таблица маршрутизации, которая доставляет пакеты клиентов (порты 80/443) на интерфейс Squid с сохранением оригинального IP:port назначения.

/routing table
add name=to-squid fib

/ip firewall mangle
add chain=prerouting action=mark-routing new-routing-mark=to-squid \
    protocol=tcp dst-port=80,443 in-interface=<LAN-интерфейс> passthrough=no

/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.2 routing-table=to-squid distance=1

7. Редирект трафика на Squid
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
Вчера, 11:25
Вернуться назад