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

Автор: | 14.02.2017

Хочу поделится информацией о настройке прозрачного 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

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

FreeBSD: Прозрачный прокси SQUID HTTP + HTTPS: 20 комментариев

  1. Михаил

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

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

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

  2. Witali

    После подмены openssl орёт make:

    You have security/libressl installed but do not have
    DEFAULT_VERSIONS+=ssl=libressl set in your make.conf

    Послушаться его или проигнорить?

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

      Чёрт его знает. У меня такого не вылазило

  3. Lanc

    Прошу помощи. Делал все как написано в статье но прокси так и не работает. В качестве фаера ipfw.

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

      При make config
      параметр TP_IPFW был выбран?

        1. Artym

          Здравствуйте Lanc!
          Чем закончилось все дело? Завелось?

  4. Алексей

    Добрый день подскажите, а какая разрядность была у вас?Я пытаюсь собрать 11.0 но уже не поддерживается версия 3.5.25 и не завелось, на 11.2. не могу собрать из портов но там 3.5.27 уже.

      1. Алексей

        Добрый день а сможете куда то на файлобменик скинуть образ установочный именно ваш?alex827@ukr.net

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

          Добрый, к сожалению нет, я это делал ради эксперимента, системы той уже нет. Если будет время на след неделе попробую ещё раз

        2. Александр

          Добрый день, Алексей. Вам удалось решить проблему?

  5. Алексей

    Добрый день, а не сможете хотя б завтра попробовать,пожалуста я просто делал когда то, это было http, и не прозрачный а сейчас мне позарез нужно такое поднять на еще и прозрачный, и в компании хочу развернуть и у клиента как раз был случай торговли корпоративной информацией, и мне нужно все концы утечек по максимуму отсекать.

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

    Я уже даже позабыл про эту штуку… Ща устанавливаю свежую FreeBSD, буду пробовать по новой. Посмотрим что выйдет. Потом отпишу

  7. Егор

    Вроде всё по инструкции делал:
    Squid Cache: Version 4.5
    12.0-RELEASE FreeBSD
    Конфиг немного пришлось изменить (в части https_port 3129) выглядит так:
    https_port 3129 intercept ssl-bump cert=/usr/local/etc/squid/squidCA.pem cafile=/usr/local/etc/squid/squidCA.pem key=/usr/local/etc/squid/squidCA.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB sslflags=NO_SESSION_REUSE
    В таком виде конфиг успешно парсится, squid запускается но через пару сек падает с сообщением:
    Squid Parent: squid-1 process 1669 exited with status 1
    Squid Parent: squid-1 process 1669 will not be restarted for 3600 seconds due to repeated, frequent failures
    Exiting due to repeated, frequent failures

    Хз в чём дело 🙁

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

    Пытался я сам повторить, нифига оно не работает уже. Нужны те же версии что и были первоначально. Копать глубже не стал, нету времени уже с этим разбираться

  9. Андрей

    А ограничения скорости для HTTPS можно каким-то образом сделать? А то у меня даже в непрозрачном режиме ограничивается скорость только по HTTP.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *