На Хабре у меня уже есть статья на тему поднятия прозрачного прокси Squid на FreeBSD 13.0 с фильтрацией ресурсов и без подмены сертификатов. Решил актуализировать статью под ОС Ubuntu 22.04.
Топология
- MikroTik — основной шлюз/роутер сети (LAN 192.168.1.0/24), отвечает за выход в интернет.
- Squid — отдельная машина в той же сети, один интерфейс, например 192.168.1.2,
шлюз по умолчанию это MikroTik (192.168.1.1). - Цель: фильтрация по списку доменов, без подмены сертификатов (peek-and-splice).
Почему не обычный 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=13. Сертификат для 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_db4. Список запрещённых доменов
cat > /etc/squid/blocked_urls.acl << 'EOF'
.youtube.com
.instagram.com
.tiktok.com
EOF5. Конфиг /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 squid6. Настройка 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=17. Редирект трафика на 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