Прозрачный Squid 3.5 с контролем без подмены сертификатов –

Прозрачный Squid 3.5 с контролем  без подмены сертификатов – Сертификаты

«прозрачный» squid с разграничением доступа

Прозрачный Squid 3.5 с контролем  без подмены сертификатов –

Как готовить кальмара, думаю что не я один сталкивался с задачей настройки Squid’а для разграничения доступа сотрудникам предприятия, но при этом он должен быть «прозрачным». Другими словами конфигурация показанная далее удовлетворяет трём условиям:

Хотелось бы уточнить по последнему пункту, так как шлюз «прозрачный», то использовать доменную авторизацию пользователей мы не можем, по данной причине выбрано разграничение именно по ip-адресам.

В качестве базовой конфигурации использовались материалы из статьи «Прозрачный» Squid с фильтрацией HTTPS ресурсов без подмены сертификатов (x86). Так как установка и настройка компонентов в данной статье описаны достаточно подробно, я пропущу данную информацию.

Программное обеспечение использованное мной для тестирование конфигурации:

Итак, файл

/etc/squid/squid.conf:

acl localnet src 192.168.0.0/16 # 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 Safe_ports port 901         # SWAT

acl CONNECT method CONNECT

#Добавление в acl трёх списков: запрещенные, разрешенные и группа расширенного доступа
acl denied_urls url_regex "/etc/squid/denied_urls"
acl allowed_urls url_regex "/etc/squid/allowed_urls"
acl extended_access_group src "/etc/squid/extended_access_group"

http_access deny !Safe_ports

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

#Ключевая строчка из-за которой долго ломали голову, так как без нее запрос сертификатов к сайтам 
# на https не осуществляется.
#Разрешаем осуществлять коннект к ресурсу, если https
http_access allow localnet CONNECT
#Запрещаем всем доступ на запрещенные сайты
http_access deny denied_urls
#Этим правилом разрешаем всем кто не в группе расширенного доступа ходить только на 
#разрешенные сайты
http_access deny !extended_access_group !allowed_urls

http_access allow localnet
http_access allow localhost
http_access deny all

#Обязательно один из портов должен быть в таком виде и являться заглушкой
http_port 3130
http_port 3128 intercept
https_port 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

#Правила доступа для ssl
acl allowed_urls_ssl ssl::server_name_regex "/etc/squid/allowed_urls"
acl denied_urls_ssl ssl::server_name_regex "/etc/squid/denied_urls"
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump terminate denied_urls_ssl
ssl_bump splice extended_access_group
ssl_bump terminate !allowed_urls_ssl
ssl_bump splice all
sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

#cache_dir ufs /var/cache/squid 100 16 256

coredump_dir /var/cache/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’а не забываем создать три файла в

/etc/squid/

.

denied_urls

и

allowed_urls

вида:

geektimes.ru
habrahabr.ru
toster.ru
windowsupdate.microsoft.com

И

extended_access_group

вида:

192.168.1.5     #Иванов И.И.
192.168.1.87    #Петров П.П.
192.168.1.108   #Сидоров С.С.

При обращении по http на запрещенный сайт выдаст стандартную заглушку Squid’а, а по https — «ERR_SSL_PROTOCOL_ERROR».

Спасибо за прочтение статьи.

Squid 3.5.9. ssl peek and splice без подмены сертификатов. имеются проблемы, есть идеи?

Всем привет. В SQUID 3.5 появилась возможность создавать прозрачное проксирование https, конкретно SSL Peek and Splice. Делал по такому рецепту

https://toster.ru/q/249885

, оно работает, но у меня Squid начинает падать и автоматом перезапускаться при открытии https-сайтов. Раз 5 перезапустится, потом перестает из-за превышения количества перезапусков за определенный период времени. Причем перезапускается без видимых причин. в cache.log только сказано, что все перезапущено. В /var/log/messages нашел следующие строки:

Sep 22 00:12:09 shluz kernel: [4162228.121400] squid[17766]: segfault at c ip b6c15079 sp bfcef3e8 error 4 in libssl.so.1.0.0[b6bef000 5f000]
Sep 22 00:12:20 shluz kernel: [4162239.217368] squid[17771]: segfault at c ip b6cb5079 sp bfd999e8 error 4 in libssl.so.1.0.0[b6c8f000 5f000]
Sep 22 00:12:24 shluz kernel: [4162243.251076] squid[17780]: segfault at c ip b6c95079 sp bfb847c8 error 4 in libssl.so.1.0.0[b6c6f000 5f000]
Sep 22 00:21:38 shluz kernel: [4162797.295524] squid[18008]: segfault at c ip b6c05079 sp bfcf4e98 error 4 in libssl.so.1.0.0[b6bdf000 5f000]
Sep 22 00:21:46 shluz kernel: [4162805.371557] squid[18158]: segfault at c ip b6c77079 sp bfa59178 error 4 in libssl.so.1.0.0[b6c51000 5f000]
Sep 22 00:26:08 shluz kernel: [4163067.693651] squid[18163]: segfault at c ip b6cc2079 sp bfae5a68 error 4 in libssl.so.1.0.0[b6c9c000 5f000]
Sep 22 00:26:16 shluz kernel: [4163075.766431] squid[18302]: segfault at c ip b6c3f079 sp bf9b5868 error 4 in libssl.so.1.0.0[b6c19000 5f000]
Sep 22 00:30:46 shluz kernel: [4163346.045829] squid[18311]: segfault at c ip b6bfa079 sp bffb1738 error 4 in libssl.so.1.0.0[b6bd4000 5f000]
Sep 22 00:30:54 shluz kernel: [4163354.119116] squid[18392]: segfault at c ip b6c9e079 sp bfddf3a8 error 4 in libssl.so.1.0.0[b6c78000 5f000]
Sep 22 00:35:12 shluz kernel: [4163612.399517] squid[18602]: segfault at c ip b6c63079 sp bff49708 error 4 in libssl.so.1.0.0[b6c3d000 5f000]
Sep 22 00:35:21 shluz kernel: [4163620.474409] squid[18643]: segfault at c ip b6c68079 sp bfb9a508 error 4 in libssl.so.1.0.0[b6c42000 5f000]
Sep 22 00:39:48 shluz kernel: [4163887.731443] squid[18648]: segfault at c ip b6c53079 sp bfc734f8 error 4 in libssl.so.1.0.0[b6c2d000 5f000]
Sep 22 00:39:56 shluz kernel: [4163895.805680] squid[18820]: segfault at c ip b6c9a079 sp bfd20238 error 4 in libssl.so.1.0.0[b6c74000 5f000]

Как видно, проблема в библиотеке libssl.so.1.0.0.
Система Debian Jessie х86, Squid 3.5.9, собранный с поддержкой ssl-bumping.

Какие мысли, господа?

На виртуальных машинах с ос «microsoft windows» разных выпусков

Сертификат загружается в общее хранилище сертификатов машины (не пользователя!) в раздел «Доверенные корневые…». Веб-браузер «Firefox» не использует общее хранилище сертификатов, поэтому сертификат следует добавлять в соответствующее хранилище этого приложения.

Про сертификаты:  Студопедия — Цена и доходность депозитных сертификатов и векселей

На виртуальных машинах с ос «red hat enterprise linux» 6-го и 7-го выпуска

На виртуальной машине включаем работу с сертификатами PEM:

update-ca-trust force-enable

Переписываем с РС сертификат прокси-сервера на виртуальную машину:

scp squid.crt root@192.168.120.66:/etc/pki/ca-trust/source/anchors/


На виртуальной машине обновляем сертификата:

update-ca-trust extract

На рс «raspberry pi» с ос «raspbian»

Обновление приложений прошло успешно без установки сертификата.

На самой рс

Для более основательных испытаний прозрачного прокси-сервера я решил использовать его и для всех приложений (за некоторыми исключениями, о чём дальше) на самой РС.

Добавим сертификат прокси-сервера в общее хранилище:

mkdir -p /usr/local/share/ca-certificates
cp /etc/squid/squid.pem /usr/local/share/ca-certificates/squid.crt

Обновим хранилище:

update-ca-certificates

Приложения — веб-браузеры «Firefox» и «Chromium» не используют общее хранилище сертификатов, поэтому его следует добавлять в соответствующие хранилища этих приложений.

Создадим конфигурационный файл /etc/env.d/38proxy с такими строками:

На смартфонах с ос «android»

Сертификат предварительно загружается на устройство, затем устанавливается с помощью приложения по управлению сертификатами. После этого у пользователя будет запрошено усиление безопасности входа в устройство (если это ещё не сделано) с помощью графического ключа или пароля.

Настройка межсетевого экрана

Настроим запуск на уровне выполнения «default» служб nftables и ulogd (последняя нужна для уведомления о пакетах):

rc-config add nftables default
rc-config add ulogd default

Поскольку в настройках межсетевого экрана будет присутствовать мост, добавим следующую строку в /etc/rc.conf:

rc_nftables_need="net.br0"

Для работы уведомления в /etc/sysctl.conf необходимо добавить следующую строку:

net.netfilter.nf_log.2 = nfnetlink_log


Чтобы конфигурационный файл находился в папке /etc/nftables, внесём такое изменение в /etc/conf.d/nftables:

NFTABLES_SAVE="/etc/nftables/rules-save"

Чтобы временные изменения не сохранялись в конфигурационном файле, внесём ещё одно изменение в /etc/conf.d/nftables:

SAVE_ON_STOP="no"

Опишу задачи, поставленные перед межсетевым экраном:

  1. Правила по умолчанию во всех цепочках таблицы ip filter должны пакеты удалять (даже в цепочке output!). Аналогично для таблиц netdev filter;
  2. Обмен любого вида, кроме IPv4 и относящегося к нему служебного обмена (например, ARP), пресекается насколько возможно раньше (ни IPv4, ни IPSec не используются);
  3. Многоадресные пакеты IPv4 также удаляются насколько возможно раньше;
  4. Для защиты Android-смартфона (при подключении к мосту с помощью приложения hostapd) широковещательный обмен, производимый виртуальными машинами работающими под управлением ОС «Microsoft Windows», не должен передаваться на беспроводной интерфейс.
  5. Пользоваться нашим Wi-Fi можно только устройствами с известными MAC-адресами.

Конфигурационный файл /etc/nftables/rules-save в итоге выглядит так (за вычетом большинства пояснений):

Тоже самое, но текстом
1	#!/sbin/nft -f
	# Задаём переменные, которые будут использоваться в правилах
2	define icmp_types = { destination-unreachable, time-exceeded, parameter-problem, echo-request, echo-reply }
3	define host = 192.168.120.1
4	define br = br0
5	define my_br_mac = XX:XX:XX:XX:XX:XX
6	define eth = enp0s25
7	define my_eth_mac = YY:YY:YY:YY:YY:YY
8	define wifi = wlp3s0
9	define my_wifi_mac = WW:WW:WW:WW:WW:WW
10	define my_phone = TT:TT:TT:TT:TT:TT
11	define virtual_machines = 192.168.120.0/24
12	define privileged_vm = { 192.168.120.22, 192.168.120.129 }
13	define dhcp_client = 192.168.120.224/27
14	define transmission_port = 51413
15	define no_track = { microsoft-ds, ms-wbt-server }
16	define vm_ssh = 192.168.120.70
17	define infowatch_pc = { 10.a.0.0/16, 10.h.0.0/16 }
18	define infowatch_my = 10.a.b.c
19	define squid_normal = 3128
20	define squid_transp = 3129
21	define squid_trassl = 3130
22	define sslvpn.infowatch.com = 46.148.194.86
23	define files.infowatch.ru = 178.16.25.15
24	define iwprint.infowatch.ru = 10.d.e.f
25	define s163.getcourses.ru = 95.213.153.163
26	define tls-v1-2.badssl.com = 104.154.89.105
27	flush ruleset
28	table ip raw {
29	  chain prerouting {
30	    type filter hook prerouting priority -300;
	    # Пытаемся облегчить работу межсетевого экрана тем, что соединения с самым большим объёмом пакетов отслеживаться не будут
31	    meta l4proto { tcp, udp } th dport $transmission_port notrack
32	    tcp sport $no_track ip saddr != $iwprint.infowatch.ru notrack
33	    ip saddr { $sslvpn.infowatch.com, $files.infowatch.ru } tcp sport https notrack
34	  }
35	}
36	table ip filter {
37	  chain input {
38	    type filter hook input priority 0; policy drop;
	    # Поскольку в этой цепочке правило по умолчанию удаляет пакеты, то необходимо разрешить все пакеты на интерфейс «loopback»
39	    iif lo accept
	    # Разрешаем пакеты ICMP только необходимых видов для обхода возможных уязвимостей, связанных с редкими и неиспользуемыми видами ICMP
40	    icmp type $icmp_types accept
	    # Удаляем битые пакеты
41	    ct state invalid counter drop
	    # Обход падения ядра, связанного с избирательным подтверждением (SACK) пакетов TCP. Падения эти уже устранены в свежих выпусках ядра, но данное правило оставлено на всякий случай
42	    tcp flags syn tcp option maxseg size < 999 counter drop
	    # Полностью разрешаем Bittorrent, поскольку мы исключили его из отслеживания в строке 31
43	    iif $eth meta l4proto { tcp, udp } th dport $transmission_port accept
	    # Удаляем пакеты, начинающие соединение, и заносим о них запись в дннвник, если они пришли с неотслеживаемых соединений
44	    tcp flags & (syn | ack) == syn ct state untracked log prefix "Untracked:" group 2 counter counter drop
	    # Разрешаем пакеты с портов, которые мы исключили из отслеживания в строке 32
45	    tcp sport $no_track accept
	    # Разрешаем пакеты с адресов, которые мы исключили из отслеживания в строке 33
46	    ip saddr { $sslvpn.infowatch.com, $files.infowatch.ru } tcp sport https accept
	    # Разрешаем пакеты от виртуальных машин, помеченные меткой 3128 (десятичное число)
47	    iif $br ip saddr $virtual_machines mark set 3128 counter accept
	    # Разрешаем виртуальным машинам подключаться к некоторым службам, в том числе к обычному (непрозрачному) порту прокси-сервера
48	    iif $br ip daddr $host ip saddr $virtual_machines tcp dport { domain, http, microsoft-ds, nfs, $squid_normal } accept
	    # Разрешаем все законные отслеженные соединения
49	    ct state { established, related } accept
	    # Разрешаем виртуальным машинам подключаться к некоторым службам, подразумевающим широковещательный обмен
50	    iif $br udp dport { domain, bootps, tftp, 4011 } counter accept
	    # Производим подсчёт удалённых пакетов, так как следующим правилом будет правило по умолчанию, удаляющее пакеты (см. строку 38)
51	    counter comment "Считаем выброшенные пакеты"
52	  }
53	  chain output {
54	    type filter hook output priority 100; policy drop;
	    # Поскольку в этой цепочке правило по умолчанию удаляет пакеты, то необходимо разрешить все пакеты со интерфейса «loopback»
55	    oif lo accept
	    # Разрешаем пакеты ICMP только необходимых видов для обхода возможных уязвимостей, связанных с редкими и неиспользуемыми видами ICMP
56	    icmp type $icmp_types counter accept
	    # Разрешаем службам отправлять пакеты виртуальным машинам с привилегированных портов (сравните со строками 48 и 50)
57	    oif { $eth, $wifi } udp dport . udp sport { bootps . bootpc } counter accept
58	    oif $br ip saddr $host ip daddr { $dhcp_client, 255.255.255.255 } udp sport . udp dport { bootps . bootpc } counter accept
59	    oif $br ip saddr $host ip daddr $virtual_machines udp sport { domain, tftp } counter accept
60	    oif $br ip saddr $host ip daddr $virtual_machines tcp sport { domain, http, microsoft-ds } accept
	    # Разрешаем прокси-серверу отправлять пакеты потребителям от имени страниц всемирной паутины с привилегированных портов. Если используется необычный порт для HTTPS вне привилегированного промежутка, то он подпадёт под следующее правило и его указывать здесь не нужно
61	    oif $br ip daddr $virtual_machines tcp sport { http, https, 1012 } counter accept
	    # Разрешаем отправку любых пакетов с портов, имеющих номера вне привилегированного промежутка, то есть выше 1024
62	    meta l4proto { tcp, udp } th sport >= 1025 accept
	    # Производим подсчёт удалённых пакетов, так как следующим правилом будет правило по умолчанию, удаляющее пакеты (см. строку 54)
63	    counter comment "Считаем выброшенные пакеты"
64	  }
65	  chain forward {
66	    type filter hook forward priority 0; policy drop;
	    # Помогаем виртуальным машинам с настройкой размера пакетов (MTU)
67	    tcp flags syn tcp option maxseg size set rt mtu counter
	    # Запрещаем виртуальным машинам обращаться к чужим службам разрешения имён
68	    iif $br ip daddr != $host meta l4proto { tcp, udp } th dport domain drop
	    # Разрешаем обмен с внешним миром (помимо прокси-сервера) только некоторым виртуальным машинам и всем, получившим временный адрес сетевого уровня, как правило, это будет смартфон. Эти правила не означают, что подключение ко всемирной паутине (порты 80 и 443) произойдёт для них без прокси-сервера, так как цепочка divert имеет более высокое первенство по сравнению с цепочкой forward (сравните строки 66 и 81). Кроме того, в строке 96 мы не преобразуем адрес сетевого уровня, если номер порта назначения равен 80 или 443
69	    iif $br ip saddr { $privileged_vm, $dhcp_client } accept
70	    oif $br ip daddr { $privileged_vm, $dhcp_client } accept
	    # Производим подсчёт удалённых пакетов, так как следующим правилом будет правило по умолчанию, удаляющее пакеты (см. строку 66)
71	    counter comment "Считаем выброшенные пакеты"
72	  }
	  # Создаём набор пар «адрес канального уровня • порт» для случаев использования соединениями HTTPS номеров портов, отличающихся от 443
73	  set nonstandard_https {
74	    type ipv4_addr . inet_service;
75	    elements = {
76	      $s163.getcourses.ru . 33443, # для страницы artlinerschool.ru
77	      $tls-v1-2.badssl.com . 1012, # для страницы badssl.com
78	  }
79	}
80	  chain divert {
81	    type filter hook prerouting priority -150; policy accept;
	    # Помечаем меткой 3128 (дес. ч.) все пакеты TCP, отправляющиеся из сокета, имеющего свойство прозрачности (свойство задаётся прокси-сервером)
82	    meta l4proto tcp socket transparent 1 mark set 3128 accept
	    # Помечаем меткой 3128 (дес. ч.) все пакеты TCP с портом назначения, имеющим номер 80. Одновременно заворачиваем их на прозрачного прокси-сервера
83	    ip daddr != { 127.0.0.1, $host } tcp dport http tproxy to 127.0.0.1:$squid_transp mark set 3128 counter accept
	    # Помечаем меткой 3128 (дес. ч.) все пакеты TCP с портом назначения, имеющим номер 443. Одновременно заворачиваем их на прозрачного прокси-сервера
84	    ip daddr != { 127.0.0.1, $host } tcp dport https tproxy to 127.0.0.1:$squid_trassl mark set 3128 counter accept
	    #  Помечаем меткой 3128 (дес. ч.) все пакеты TCP с адресами и портами назначения из набора nonstandard_https (см. строки 76 и 77 для примера). Одновременно заворачиваем их на прозрачного прокси-сервера
85	    ip daddr . tcp dport @nonstandard_https tproxy to 127.0.0.1:$squid_trassl mark set 3128 counter accept
86	  }
87	}
88	table ip nat {
89	  chain prerouting {
90	    type nat hook prerouting priority 0; policy accept;
	    # Разрешаем другим РС из рабочей сети подключаться к одной из виртуальных машин с помощью SSH
91	    iif $eth ip daddr $infowatch_my ip saddr $infowatch_pc tcp dport ssh counter dnat $vm_ssh
92	  }
93	  chain postrouting {
94	    type nat hook postrouting priority 100; policy accept;
	    # Преобразуем адреса сетевого уровня в пакетах, отправляемых вовне прокси-сервером, так как он отправляет их от лица виртуальных машин. Принадлежность прокси-серверу определяем с помощью свойств UID и GID сокета
95	    oif { $eth, $wifi } ip saddr $virtual_machines skuid . skgid { squid . squid } counter masquerade
	    # Преобразуем адреса сетевого уровня в пакетах, отправляемых вовне некоторыми виртуальными машинами, и всеми, получившими временный адрес сетевого уровня, (сравните со строками 69 и 70). При этом ведём им учёт, занося в общий журнал, с целью выявления необычных для соединений HTTPS портов. После выявления таковых заносим их вместе с адресами в набор nonstandard_https (см. строки 76 и 77 для примера).
96	    oif { $eth, $wifi } ip saddr { $privileged_vm, $dhcp_client } tcp dport != { http, https } log prefix "NAT:" group 2 counter masquerade
97	  }
98	}
	
99	table bridge filter {
  # Решаем задачу №5: Разрешаем передавать данные нашему Wi-Fi только известным устройствам
100	  chain input {
    type filter hook input priority -200; policy accept;
    iif $wifi ether saddr != $my_phone counter drop
  }
  # Решаем задачу №4: защита смартфона от всего, не связанного с IPv4, и от ненужных ему широковещательных рассылок
  chain forward {
101	    type filter hook forward priority -200; policy accept;
102	    oif $wifi ether type arp accept
103	    oif $wifi ip protocol { icmp, tcp, udp } ip daddr != 192.168.120.255 accept
104	    oif $wifi drop
105	  }
  # Решаем задачу №5: Разрешаем нашему Wi-Fi отдавать данные только известным устройствам
106	  chain output {
    type filter hook input priority 200; policy accept;
    oif $wifi ether daddr != $my_phone counter drop
  }
}
	# Решаем задачу №2: удаление на входах интерфейсов всего, не связанного с IPv4
107	table netdev filter {
108	  chain enp0s25 {
109	    type filter hook ingress device enp0s25 priority 0; policy drop;
110	    ether type arp accept
111	    ether daddr $my_eth_mac ip protocol { icmp, tcp, udp, gre } accept
112	  }
113	  chain wlp3s0 {
114	    type filter hook ingress device wlp3s0 priority 0; policy drop;
	    # Разрешаем ARP и EAPOL на случай, когда подключение к Интернету происходит через беспроводной интерфейс
115	    ether type { arp, 0x888e } accept
	    # Поскольку беспроводный интерфейс будет подключаться к мосту, здесь необходимо указать адреса канального уровня как самого интерфейса, так и моста
116	    ether daddr { $my_br_mac, $my_wifi_mac, ff:ff:ff:ff:ff:ff } ip protocol { icmp, tcp, udp, gre } accept
117	  }
118	}

Про сертификаты:  Купить Legrand 088092 коробка по лучшей цене в Москве

Настройка сети


Если служба net.lo не добавлена в уровень выполнения «boot», то её следует туда добавить:

rc-config add net.lo boot

Подобным же образом созданы и настроены на запуск для уровня выполнения «default» службы net.

br0

(мост для виртуальных машин и смартфона), net.

enp0s25

(проводной интерфейс) и net.

wlp3s0

(беспроводной интерфейс), например:

ln -s net.lo /etc/init.d/net.br0
rc-config add net.br0 default


Итоговый конфигурационный файл /etc/conf.d/net в нашем примере выглядит так (за вычетом не относящихся к нашей задаче настроек):

Выделенные строки добавляют новую таблицу маршрутизации, в данном примере под номером 3128, и ворота — по умолчанию для неё (интерфейс «loopback»), и правило — по которому пакеты, помеченные межсетевым экраном меткой номер 3128 (десятичные числа в обоих случаях), будут обслуживаться этим расписанием.

Чтобы направляемые пакеты не были отброшены из-за несоответствия адресов сетевого уровня (при прозрачном проксировании пакеты сохраняются в первозданном виде!) необходимо добавить в /etc/sysctl.conf следующие строки (или изменить уже имеющиеся):

Если нужно применить эти настройки до перезагрузки, то следует дополнительно задать их для обоих сетевых интерфейсов с доступом в Интернет:

sysctl net.ipv4.conf.enp0s25.rp_filter=0
sysctl net.ipv4.conf.wlp3s0.rp_filter=0

Настройка ядра

image


Для справки привожу выдержку из /usr/src/linux/.config:

CONFIG_NET=y
CONFIG_INET=y
<b>CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y</b>
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_LOG=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_TABLES=y
CONFIG_NF_TABLES_SET=y
CONFIG_NF_TABLES_NETDEV=y
CONFIG_NFT_CT=y
CONFIG_NFT_COUNTER=y
CONFIG_NFT_LOG=y
CONFIG_NFT_MASQ=y
CONFIG_NFT_NAT=y
<b>CONFIG_NFT_SOCKET=y
CONFIG_NFT_TPROXY=y</b>
CONFIG_NF_TABLES_BRIDGE=y

Прозрачный squid 3.5 с контролем без подмены сертификатов –

Необходимость что-то решать с доступом программ не умеющих работать с прокси, но при этом очень рьяно иснользующий https трафик, заставило установить второй squid на мой сервер. Теперь объясню почему не просто вторая копия сквида с другими настройками а именно друга версия программы. А проблема заключалась в том, что нужно было использовать SAMS и кучу ACL им создаваемых, которые блочат ненужные ресурсы, а также обязательная авторизация пользователя по имени — паролю. Так вот, с этими задачами замечательно справлялся и штатный squid 3.1.20, но он не мог обеспечить прозрачное проксирование с применением ssl-bump, так как оно появилось только в версии squid 3.5.8(если я не ошибаюсь). А для новыого squid 3.5.25 я так и не нашел рабочего редиректора для sams. Потому и пришлось городить такой огород.

Про сертификаты:  Полет на воздушном шаре в Москве от клуба "Аэронавт".

И так у нас есть уже настроенный squid  3.1.20 с прикрученным sams2 настроенный по этой статье:  https://my-sertif.ru/squid-sams-ubuntu-14-04/

Установим новый squid 3.5.25 при этом не удаляя старый.


Установка libressl

После установки необходимо настроить использование 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.5.4

Установим новый libecap по этой статье:

https://my-sertif.ru/?s=libecap

Приступим к установке squid 3.5.25


Не конфигурировался squid, видимо не хватало какихто библиотек, спорная команда, небыло времени разбираться…

apt-get install libsasl2-dev

завершилась ошибкой  но все заработало

apt-get install build-dep squid3


Конфигурируем и установим сквид. Команда громоздкая поэтому оформлю ее как текстовый блок:

./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/squid1

—srcdir=.
—disable-maintainer-mode

—disable-dependency-tracking

—disable-silent-rules

—datadir=/usr/share/squid1

—sysconfdir=/etc/squid1

—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,NCSA,NIS,POP3,RADIUS,SASL,SMB

—enable-auth-digest=file,

—enable-auth-negotiate=kerberos,wrapper

—enable-auth-ntlm=fake,smb_lm

—enable-external-acl-helpers=file_userip,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/squid1

—with-logdir=/var/log/squid1

—with-pidfile=/var/run/squid1.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’

make

make install

make install-pinger

cd /etc/squid1

openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem

nano /etc/systemd/system/squid1.service

nano /etc/squid1/squid.conf

Добавим в скрипт управления iptables следующие строки:

iptables -t nat -A PREROUTING -p tcp -m tcp -s 192.168.1.0/24 —dport 443 -j REDIRECT —to-ports 3129

iptables -t nat -A PREROUTING -p tcp -m tcp -s 192.168.1.0/24 —dport 80 -j REDIRECT —to-ports 3128

iptables -A FORWARD -m state —state NEW -s 192.168.1.202/32 -j ACCEPT

chown -R proxy:proxy /var/log/squid1

/usr/sbin/squid -z

systemctl start squid1

nano /etc/squid1/blocked_https.txt

chown proxy /etc/squid1/blocked_https.txt

Вывод

Новый брандмауэр в линуксе (nft) представляет собой прекрасный образчик свободного ПО, хорошо сочетающийся со Squid’ом, де-факто стандартом свободного прокси-сервера.

Оцените статью
Мой сертификат
Добавить комментарий