FreeBSD: Прозрачный прокси SQUID HTTP + HTTPS

Хочу поделится информацией о настройке прозрачного HTTP и HTTPS прокси сервера Squid на FreeBSD. Установка Squid будет происходить из портов, т.к. нам нужно включить некоторые функции при сборке. Как оказалось сложного в этом ничего нет. Нужно всего лишь заменить OpenSSL на LibreSSL. Я всю установку производил на чистую систему FreeBSD 11.0. Поэтому сразу загружаем порты. Так же хочу заметить, что в портах версия SQUID, на момент написания статьи, была 3.5.24, как поведёт себя на других версиях я не знаю.


cd /usr/ports
portsnap fetch
portsnap extract

Процесс на обычных HDD довольно долгий, стоит подождать пока всё распакуется. Затем нужно установить LibreSSL, для облегчения работы так же поставил mc и wget, я это делал с помощью pkg

pkg install libressl mc wget

После установки делаем подмену OpenSSL

mv /usr/bin/openssl /usr/bin/openssl.old
cd /usr/bin
ln -s /usr/local/bin/openssl

затем переходим в директорию с портом Squid

cd /usr/ports/www/squid

и вводим

make config

Выставляем параметры так как указаны на скриншоте ниже

Естественно настраивается оно под свои нужды, но нам главное чтобы были выбраны параметры:

ECAP
SSL
SSL_CRTD
TP_PF

Нажимаем ОК и вводим

make install clean

Произойдёт сборка и установка Squid. У меня не вызвало никаких ошибок и т.д. собралось всё сразу.

Пропишем

squid_enable="YES"
в файл /etc/rc.conf

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

kldload pf

Переходим к конфигу SQUID, находится он

/usr/local/etc/squid/squid.conf

И приводим в его в такое состояние:

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 192.168.1.0/24 # RFC1918 possible internal network

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

visible_hostname squid.local
dns_nameservers 192.168.1.200

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128

http_port 3128 intercept options=NO_SSLv3:NO_SSLv2
http_port 3130 options=NO_SSLv3:NO_SSLv2
https_port 3129 intercept ssl-bump connection-auth=off cert=/usr/local/etc/squid/squidCA.pem

always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

acl blocked ssl::server_name  "/usr/local/etc/squid/blocked_https.txt"
acl step1 at_step SslBump1
ssl_bump peek step1

ssl_bump terminate blocked
ssl_bump splice all

sslcrtd_program /usr/local/libexec/squid/ssl_crtd -s /var/log/squid/ssl_db -M 4MB

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/squid/cache 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/squid/cache

#
# Add any of your own refresh_pattern entries above these.
#
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

Напишу сразу, информацию черпал отсюда, там автор статьи расписал подробнее, что для чего.

Затем создаём файл blocked_https.txt, он нам нужен для блокировки нежелательных HTTPS сайтов. И пишем туда доменные имена в формате:

.site.name
.example.com

Точка в начале доменного имени означает и все поддомены.

Дальше нам необходимо создать сертификат

cd /usr/local/etc/squid/
openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem

Затем делаем инициализацию кэша.

squid -z

И переходим к настройке PF. Открываем pf.conf

mcedit /etc/pf.conf

и вписываем туда правила

rdr pass inet proto tcp from 192.168.1.0/24 to any port 80 -> 127.0.0.1 port 3128
rdr pass inet proto tcp from 192.168.1.0/24 to any port 443 -> 127.0.0.1 port 3129
Этими правилами мы перенаправляем трафик HTTP и HTTPS из нашей локальной сети на сервер SQUID для дальнейшей обработки, тем самым делая прозрачность. Запускаем pf
pfctl -e
pfctl -f /etc/pf.conf
 Дальше у меня при запуске и обращении к SQUID начала возникать ошибка
PF open failed: (13) Permission denied
kid1| ERROR: NAT/TPROXY lookup failed to locate original IPs
Вылечилось следующим, открываем devfs.conf
mcedit /etc/devfs.conf
И прописываем в самом конце файла следующее:
own     pf      root:squid
perm    pf      0640
Дальше перезапускаем devfs
/etc/rc.d/devfs restart

И наконец-то запускаем SQUID:

service squid start

Все довольны и счастливы! Спасибо за внимание 🙂

Всего комментариев: 2 Комментировать

  1. Михаил /

    Привет. А если все тоже настроить только в режиме tproxy, будет работать?
    Нужно разделение юзеров между несколькими провайдерами.

    1. Vladimir / Автор записи

      Привет. Не пробовал, не скажу, если будет время попробую

Оставить ответ