«Прозрачный» Squid с фильтрацией HTTPS ресурсов без подмены сертификатов
Данная инструкция позволяет скомпилировать как х86, так и х64 версии Squid'a и создать соответствующие пакеты. Инструкция будет разбита на несколько пунктов и подпунктов. Если интересно, идем под кат:
1. Подготовка.
1.1 Для начала, подготовимся к сборке пакетов:
apt-get install git fakeroot checkinstall build-essential devscripts patch apt-cache policy squid3 apt-get build-dep squid3 apt-get build-dep libecap2 apt-get install libssl-dev libgnutls28-dev
Не забудьте перейти в ту папку, где вы будете собирать исходники, чтобы не загадить себе Хоум.
1.2 Далее скачаем Libressl:
wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.1.6.tar.gz tar -xzvf libressl-2.1.6.tar.gz cd libressl-2.1.6
1.3 А теперь собираем:
./configure make checkinstall --pkgname libressl --pkgversion 2.1.6
2. Теперь можно установить Libressl:
dpkg -i libressl_2.1.6-1_amd64.deb ldconfig
2.1 После установки необходимо настроить использование LibreSSL по-умолчанию:
mv /usr/bin/openssl /usr/bin/openssl-1 update-alternatives --install /usr/bin/openssl openssl /usr/bin/openssl-1 10 update-alternatives --install /usr/bin/openssl openssl /usr/local/bin/openssl 50 update-alternatives --config openssl
* Проверим, получилось ли поставить Libressl:
openssl version LibreSSL 2.1.6
Если выхлоп консоли похожий, то все получилось. Идем дальше.
3. На очереди Libecap.
3.1 Необходимо отредактировать sources.list, включив туда исходники из ветки testing (это необходимо, так как нам нужно компилировать новый libecap, который в свою очередь необходим для сборки Squid):
deb-src http://ftp.de.debian.org/debian/ testing main contrib non-free
3.2 Обновим кеш пакетов:
apt-get update
3.3 А теперь скачаем из Testing нужные исходники:
apt-get source libecap3/testing
3.4 Далее соберем libecap:
cd libecap-1.0.1/ dpkg-buildpackage -us -uc -nc -d
3.5 Удалим старье, и установим новье:
apt-get purge libecap2 libecap3_1.0.1-2_amd64.deb libecap3-dev_1.0.1-2_amd64.deb
4. Подобрались к компиляции самого Squid'a.
4.1 Качаем последний самый работающий снэпшот Squid'a:
wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.8.tar.gz
4.2 Распакуем:
tar -xf squid-3.5.8.tar.gz cd squid-3.5.8
4.3 Качаем патч для bio.cc, и патчим:
wget -O bug-4330-put_cipher_by_char-t1.patch http://bugs.squid-cache.org/attachment.cgi?id=3216 patch -p0 -i bug-4330-put_cipher_by_char-t1.patch » patching file src/ssl/bio.cc
5. А этот этап один из самых ответственных. Необходимо сконфигурировать Squid с нужными опциями. В предыдущей статье использовался файл debian/rules, но компилировать Squid в этой инструкции мы будем с помощью make, и создавать пакеты будем с помощью checkinstall. Поэтому опций будет побольше. И вот какие:
./configure --build=x86_64-linux-gnu \ --prefix=/usr \ --includedir=${prefix}/include \ --mandir=${prefix}/share/man \ --infodir=${prefix}/share/info \ --sysconfdir=/etc \ --localstatedir=/var \ --libexecdir=${prefix}/lib/squid \ --srcdir=. \ --disable-maintainer-mode \ --disable-dependency-tracking \ --disable-silent-rules \ --datadir=/usr/share/squid \ --sysconfdir=/etc/squid \ --mandir=/usr/share/man \ --enable-inline \ --disable-arch-native \ --enable-async-io=8 \ --enable-storeio=ufs,aufs,diskd,rock \ --enable-removal-policies=lru,heap \ --enable-delay-pools \ --enable-cache-digests \ --enable-icap-client \ --enable-follow-x-forwarded-for \ --enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB \ --enable-auth-digest=file,LDAP \ --enable-auth-negotiate=kerberos,wrapper \ --enable-auth-ntlm=fake,smb_lm \ --enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group \ --enable-url-rewrite-helpers=fake \ --enable-eui \ --enable-esi \ --enable-icmp \ --enable-zph-qos \ --enable-ecap \ --disable-translation \ --with-swapdir=/var/spool/squid \ --with-logdir=/var/log/squid \ --with-pidfile=/var/run/squid.pid \ --with-filedescriptors=65536 \ --with-large-files \ --with-default-user=proxy \ --enable-ssl \ --enable-ssl-crtd \ --with-openssl \ --enable-linux-netfilter \ 'CFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wall' \ 'LDFLAGS=-fPIE -pie -Wl,-z,relro -Wl,-z,now' \ 'CPPFLAGS=-D_FORTIFY_SOURCE=2' \ 'CXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security'
* Будьте предельно внимательны. Нас больше интересуют, как и в предыдущей статье, три опции: --enable-ssl, --enable-ssl-crtd, --with-openssl. Остальные опции можете изменять в соответствие с вашими предпочтениями (если хотите их менять, обязательно прочитайте документацию по конфигурированию).
6. Теперь мы добрались до компилирования. 6.1 Компилируем.
make
6.2 Неоднозначный этап. Необходимо создать директории /usr/share/squid/ и /usr/share/squid/icons, иначе следующий этап не выполнится из-за отсутствия этих папок (почему checkinstall их сам не создает, я не разбирался, к сожалению):
mkdir -p /usr/share/squid/icons
6.3 А теперь создаем установочные пакеты:
checkinstall --pkgname squid --pkgversion 3.5.8
7. Мы подходим к финалу. Устанавливаем Squid:
dpkg -i squid_3.5.8-1_amd64.deb
8. Пробуем запустить squid:
systemctl start squid
* И видим большую ФИГУ! Надо же… Пробуем по-старинке:
service squid start
* И тоже видим большую ФИГУ. Почему? Потому что checkinstall не включил в пакет файлы сервиса Squid. Не беда.
8.1 Создадим сами нужный сервис systemd:
touch /etc/systemd/system/squid.service nano /etc/systemd/system/squid.service
* Со следующим содержимым:
## Copyright (C) 1996-2015 The Squid Software Foundation and contributors ## ## Squid software is distributed under GPLv2+ license and includes ## contributions from numerous individuals and organizations. ## Please see the COPYING and CONTRIBUTORS files for details. ## [Unit] Description=Squid Web Proxy Server After=network.target [Service] Type=simple ExecStart=/usr/sbin/squid -sYC -N ExecReload=/bin/kill -HUP $MAINPID KillMode=process [Install] WantedBy=multi-user.target
8.2 Включим созданный сервис
systemctl enable squid
9. Да, вы правы, это еще не все. Так как мы компилировали полностью оригинальные исходники (за исключением патча на bio.cc), конфигурационные файлы у нас установились вида squid.conf.default, mime.conf.default и т.п. Конечно же, Squid о них и не слышал. Переименуем их в Squid'очитаемый вид:
cp /etc/squid/squid.conf.default /etc/squid/squid.conf cp /etc/squid/mime.conf.default /etc/squid/mime.conf cp /etc/squid/cachemgr.conf.default /etc/squid/cachemgr.conf cp /etc/squid/errorpage.css.default /etc/squid/errorpage.css
10. И это еще не все=) Необходимо вручную создать папку для логов Squid'a и назначить ей соответствующие права:
mkdir /var/log/squid chown proxy /var/log/squid
11. И вот он — финальный этап. Запуск Squid'a и проверка статуса сервиса!
systemctl start squid
systemctl status -l squid ● squid.service - Squid Web Proxy Server Loaded: loaded (/etc/systemd/system/squid.service; enabled) Active: active (running) since Пт 2015-12-04 23:32:04 YEKT; 2min 41s ago Main PID: 590 (squid) CGroup: /system.slice/squid.service ├─590 /usr/sbin/squid -sYC -N └─591 (logfile-daemon) /var/log/squid/access.log дек 04 23:32:04 squidX64 squid[590]: Max Swap size: 0 KB дек 04 23:32:04 squidX64 squid[590]: Using Least Load store dir selection дек 04 23:32:04 squidX64 squid[590]: Current Directory is / дек 04 23:32:04 squidX64 squid[590]: Finished loading MIME types and icons. дек 04 23:32:04 squidX64 squid[590]: HTCP Disabled. дек 04 23:32:04 squidX64 squid[590]: Pinger socket opened on FD 16 дек 04 23:32:04 squidX64 squid[590]: Squid plugin modules loaded: 0 дек 04 23:32:04 squidX64 squid[590]: Adaptation support is off. дек 04 23:32:04 squidX64 squid[590]: Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 14 flags=9 дек 04 23:32:05 squidX64 squid[590]: storeLateRelease: released 0 objects
* Если выхлоп консоли выглядит похоже, а точнее в нем нет ошибок и обязательно присутствует строка «Active: active (running)», то вы успешно установили себе Squid с поддержкой прозрачного проксирования HTTPS! Поздравляю!
* Для запуска в Debian через /etc/init.d - за основу взят родной скрипт:
#! /bin/sh # # squid Startup script for the SQUID HTTP proxy-cache. # # Version: @(#)squid.rc 1.0 07-Jul-2006 luigi@debian.org # # pidfile: /var/run/squid.pid # ### BEGIN INIT INFO # Provides: squid # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Squid HTTP Proxy version 3.x ### END INIT INFO NAME=squid DESC="Squid HTTP Proxy" DAEMON=/usr/sbin/squid PIDFILE=/var/run/$NAME.pid CONFIG=/etc/squid/squid.conf SQUID_ARGS="-YC -f $CONFIG" [ ! -f /etc/default/squid ] || . /etc/default/squid . /lib/lsb/init-functions PATH=/bin:/usr/bin:/sbin:/usr/sbin [ -x $DAEMON ] || exit 0 ulimit -n 65535 find_cache_dir () { w=" " # space tab res=`$DAEMON -k parse -f $CONFIG 2>&1 | grep "Processing:" | sed s/.*Processing:\ // | sed -ne ' s/^['"$w"']*'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p; t end; d; :end q'` [ -n "$res" ] || res=$2 echo "$res" } grepconf () { w=" " # space tab res=`$DAEMON -k parse -f $CONFIG 2>&1 | grep "Processing:" | sed s/.*Processing:\ // | sed -ne ' s/^['"$w"']*'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p; t end; d; :end q'` [ -n "$res" ] || res=$2 echo "$res" } create_run_dir () { run_dir=/var/run/squid usr=`grepconf cache_effective_user proxy` grp=`grepconf cache_effective_group proxy` if [ "$(dpkg-statoverride --list $run_dir)" = "" ] && [ ! -e $run_dir ] ; then mkdir -p $run_dir chown $usr:$grp $run_dir [ -x /sbin/restorecon ] && restorecon $run_dir fi } start () { cache_dir=`find_cache_dir cache_dir` cache_type=`grepconf cache_dir` run_dir=/var/run/squid # # Create run dir (needed for several workers on SMP) # create_run_dir # # Create spool dirs if they don't exist. # if test -d "$cache_dir" -a ! -d "$cache_dir/00" then log_warning_msg "Creating $DESC cache structure" $DAEMON -z -f $CONFIG [ -x /sbin/restorecon ] && restorecon -R $cache_dir fi umask 027 ulimit -n 65535 cd $run_dir start-stop-daemon --quiet --start \ --pidfile $PIDFILE \ --exec $DAEMON -- $SQUID_ARGS < /dev/null return $? } stop () { PID=`cat $PIDFILE 2>/dev/null` start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON # # Now we have to wait until squid has _really_ stopped. # sleep 2 if test -n "$PID" && kill -0 $PID 2>/dev/null then log_action_begin_msg " Waiting" cnt=0 while kill -0 $PID 2>/dev/null do cnt=`expr $cnt + 1` if [ $cnt -gt 24 ] then log_action_end_msg 1 return 1 fi sleep 5 log_action_cont_msg "" done log_action_end_msg 0 return 0 else return 0 fi } cfg_pidfile=`grepconf pid_filename` if test "${cfg_pidfile:-none}" != "none" -a "$cfg_pidfile" != "$PIDFILE" then log_warning_msg "squid.conf pid_filename overrides init script" PIDFILE="$cfg_pidfile" fi case "$1" in start) res=`$DAEMON -k parse -f $CONFIG 2>&1 | grep -o "FATAL: .*"` if test -n "$res"; then log_failure_msg "$res" exit 3 else log_daemon_msg "Starting $DESC" "$NAME" if start ; then log_end_msg $? else log_end_msg $? fi fi ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" if stop ; then log_end_msg $? else log_end_msg $? fi ;; reload|force-reload) res=`$DAEMON -k parse -f $CONFIG 2>&1 | grep -o "FATAL: .*"` if test -n "$res"; then log_failure_msg "$res" exit 3 else log_action_msg "Reloading $DESC configuration files" start-stop-daemon --stop --signal 1 \ --pidfile $PIDFILE --quiet --exec $DAEMON log_action_end_msg 0 fi ;; restart) res=`$DAEMON -k parse -f $CONFIG 2>&1 | grep -o "FATAL: .*"` if test -n "$res"; then log_failure_msg "$res" exit 3 else log_daemon_msg "Restarting $DESC" "$NAME" stop if start ; then log_end_msg $? else log_end_msg $? fi fi ;; status) status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit 3 ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart|status}" exit 3 ;; esac exit 0
- - > который необходимо поместить в /etc/init.d/squid
и сделать:
update-rc.d squid default
теперь можно и запустить:
/etc/init.d/squid start
- -> для systemd необходимо исправить:
## Copyright (C) 1996-2015 The Squid Software Foundation and contributors ## ## Squid software is distributed under GPLv2+ license and includes ## contributions from numerous individuals and organizations. ## Please see the COPYING and CONTRIBUTORS files for details. ## [Unit] Description=Squid Web Proxy Server After=network.target [Service] Type=simple #ExecStart=/usr/sbin/squid -sYC -N ExecStart=/etc/init.d/squid start #ExecReload=/bin/kill -HUP ExecReload=/etc/init.d/squid restart KillMode=process [Install] WantedBy=multi-user.target
- и обновить правило:
systemctl daemon-reload
- Теперь перезапуск возможен и через systemctl и через /etc/init.d
* Если не хочется ничего компилировать, то можете скачать архив с готовыми deb пакетами (x64 версия!). Если будете устанавливать из готовых пакетов, то вам нужны будут шаги: 2, 3(б), 7, 8, 9, 10, 11.
* Также хочу отметить, что checkinstall позволяет создавать пакеты rpm, и вы можете этим воспользоваться. Единственное, нужно все пакеты собирать с помощью checkinstall, но я думаю, проблем с этим не будет, так как основное и самое сложное уже собрано именно checkinstall'ом.
- Пример рабочего /etc/squid/squid.conf
acl localnet src 192.168.5.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 dns_nameservers 127.0.0.1 http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localnet http_access allow localhost http_access deny all #прозрачный порт указывается опцией intercept http_port 192.168.5.1:3128 intercept http_port 192.168.5.1:3130 https_port 192.168.5.1:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidCA.pem always_direct allow all sslproxy_cert_error allow all sslproxy_flags DONT_VERIFY_PEER #укажем правило со списком блокируемых ресурсов (в файле домены вида .domain.com) #acl blocked ssl::server_name "/etc/squid/blacklist_https.conf" acl step1 at_step SslBump1 ssl_bump peek step1 #терминируем соединение, если клиент заходит на запрещенный ресурс #ssl_bump terminate blocked deny_users #ssl_bump bump all ssl_bump splice all sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB 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 cache_dir aufs /var/spool/squid 512 49 256 maximum_object_size 61440 KB minimum_object_size 3 KB cache_swap_low 90 cache_swap_high 95 maximum_object_size_in_memory 256 KB memory_replacement_policy lru logfile_rotate 4
12. Не забываем создать ssl сертификат для squid:
cd /etc/squid openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem
13. Далее завернем файрволом нужные порты на Squid:
-A PREROUTING -i enp2s0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 -A PREROUTING -i enp2s0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129
ИСТОЧНИКИ: