- «прозрачный» squid с разграничением доступа
- Squid 3.5.9. ssl peek and splice без подмены сертификатов. имеются проблемы, есть идеи?
- На виртуальных машинах с ос «microsoft windows» разных выпусков
- На виртуальных машинах с ос «red hat enterprise linux» 6-го и 7-го выпуска
- На рс «raspberry pi» с ос «raspbian»
- На самой рс
- На смартфонах с ос «android»
- Настройка межсетевого экрана
- Настройка сети
- Настройка ядра
- Прозрачный squid 3.5 с контролем без подмены сертификатов –
- Вывод
«прозрачный» squid с разграничением доступа

Как готовить кальмара, думаю что не я один сталкивался с задачей настройки 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"
Опишу задачи, поставленные перед межсетевым экраном:
- Правила по умолчанию во всех цепочках таблицы ip filter должны пакеты удалять (даже в цепочке output!). Аналогично для таблиц netdev filter;
- Обмен любого вида, кроме IPv4 и относящегося к нему служебного обмена (например, ARP), пресекается насколько возможно раньше (ни IPv4, ни IPSec не используются);
- Многоадресные пакеты IPv4 также удаляются насколько возможно раньше;
- Для защиты Android-смартфона (при подключении к мосту с помощью приложения hostapd) широковещательный обмен, производимый виртуальными машинами работающими под управлением ОС «Microsoft Windows», не должен передаваться на беспроводной интерфейс.
- Пользоваться нашим 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 }
Настройка сети
Если служба 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
Настройка ядра
Для справки привожу выдержку из /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’ом, де-факто стандартом свободного прокси-сервера.