Исходные данные:
Старенький Proliant ML350 G4 с четырьмя сетевыми картами на борту, три провайдера интернет и локальная сеть с кучей подсетей по VPN.
Настройка сетевых интерфейсов.
Посмотрим названия и информацию про наши сетевые карты:
Настраиваем интерфейсы по этой ссылке https://onedayadmin.sytes.net/ubuntu-18-network-configuration/ . Шлюз при этом не указываем ни одному интерфейсу, за это у нас отвечает скрипт.
Для использования канала нескольких провайдеров одновременно настроим правильно маршрутизацию, чтобы сервер отправлял ответ именно с того интерфейс на который был получен запрос.
nano /root/scripts/routing.sh
Установка и настройка squid
apt-get install squid
Авторизация будет по NCSA поэтому ставим apache2-utils для создания учеток.
apt install apache2-utils
touch /etc/squid/ncsa.users
tpasswd /etc/squid/ncsa.users user1
вводим и подтверждаем пароль
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/ncsa.users
auth_param basic children 5
auth_param basic realm Atlant Squid!
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
acl internet_users proxy_auth REQUIRED
1 - ncsa авторизация, брать логины пароли из
/etc/squid/ncsa.users
2 - запустить со старту 5 процессов для авторизации(одновременно 5 соединений).
3 - Название нашего прокси сервера.
4 - Время хранения/кэширования успешных авторизаций.
5 - Настройка, определяющая чувствительность имен пользователей к регистру.
6 - Создадим ACL в который попадут пользователи которые успешно пройдут авторизацию через NCSA.
acl SSL_ports port 443
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 20 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 631 # cups
acl Safe_ports port 873 # rsync
acl CONNECT method CONNECT
1 - Создадим ACL по имени SSL_ports в который попадут соединения устанавливаемые на перечисленные порты.
2 - Создадим ACL по имени Safe_ports в который попадут соединения устанавливаемые на перечисленные порты. В дальнейшем мы запретим соединения на все порты кроме этих.
3 - Метод CONNECT запрашивает соединение с сервером. Чаще всего соединение идет на защищенные порты (443). Создадим список, который в дальнейшем используем для запрета в нашей сети использовать метод CONNECT на порты кроме тех что в 1 пункте.
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow internet_users
http_access allow localhost
http_access deny all
1 - Описано выше в пункте 2
2 - Описано выше в пункте 3
3 - Откроем доступ к прокси по протоколу cache_mgr с локалхоста.
4 - Запретим все остальные подключения по протоколу cache_mgr.
5 - Разрешим доступ пользователям которые авторизовались.
6 - Разрешим подключения с локалхост.
7 - Запретим всем все.
http_port 3128
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
1 - Порт на котором принимает подключения сквид.
2... - Задают параметры кэширования.
- refresh_pattern regex min percent max options
regex - Регулярное выражение. Описывает адреса, к которым применимо это правило.
min - Минимальное время, в течении которого объект в кэше считается новым.
percent - Процент от возраста объекта с явным указание срока актуальности, в течении которого объект считается новым.
max - Указывает верхний предел времени, в течении которого объекты без явного указания времени актуальности считаются новыми.
cache_mem 128 MB
maximum_object_size_in_memory 64 KB
cache_dir ufs /var/spool/squid 2048 16 256
maximum_object_size 20480 KB
access_log /var/log/squid/access.log squid
1 - Сколько памяти максимум сквид возьмет под кэш.
2 - Этот тэг задает размер объекта который может хранится в памяти.
3- ufs- определяет формат кэша: (unix file system), 2048 - размер после которого кэш будет очищаться, 16 и 256 - Количество каталогов 1 и 2 уровней.
4 - Максимальный размер объекта, который может быть помещен в кэш.
5 - Путь к файлу лога.
На этом минимальные настройки squid закончены.
- Настроим ограничение скорости squid-ом
Создадим группы пользователей с разными ограничениями по скорости. Пользователи должны быть уже созданы через htpasswd.
Для этого создадим три файла с именами пользователей внутри.
mkdir /etc/squid/group
nano /etc/squid/group/9-1Mbit.txt
nano /etc/squid/group/4-1Mbit.txt
В конец секции acl добавим
acl 72Mbit proxy_auth "/etc/squid/group/72Mbit.txt"
acl 16Mbit proxy_auth "/etc/squid/16Mbit.txt"
acl 512Kbit proxy_auth "/etc/squid/512Kbit.txt"
После секции htaccess создадим 3 пула 2го класса с разными скоростями.
delay_pools 3
delay_class 1 2
delay_access 1 allow 72Mbit
delay_access 1 deny all
delay_parameters 1 9000000/10000000 9000000/1000000
delay_class 2 2
delay_access 2 allow 16Mbit
delay_access 2 deny all
delay_parameters 2 6000000/10000000 2000000/1000000
delay_class 3 2
delay_access 3 allow 512Kbit
delay_access 3 deny all
delay_parameters 3 4000000/10000000 64000/1000000
1 - Количество пулов
2 - Создать первый класс второго уровня
3 - Загоним в первый пул всех, кто удовлетворяет условиям acl по имени 72Mbit
4 - Запретим всем остальным первый пул.
5 - Для первого пула зададим скорость 72 Mбит/с (= 72 Mбит/с / 8 = 9 MБайт/с = 9000000 Байт/с) и размер пула в 10 Мбайт, для хостов скорость те же 72 Mбит/с с размером пула 1Mбит/с.
И т.д. по аналогии.
Настроим фильтрацию нежелательных сайтов, заблокируем соц. сети, ютуб, ну и кучу всякой ерунды.
После acl Safe_ports добавим ACL в который будут попадать доменные имена которые указаны в файле. А в секцию http_access deny допишем запрет на эти домены.
.ok.ru
.odnoklassniki.ru
.vk.com
http_access deny social_ban
Заблокируем ссылки в которых содержаться словосочетания из файла
acl word_ban url_regex -i "/etc/squid/word_ban.txt"
http_access deny word_ban
Добавим в squid acl со списком сайтов на которых были найдены malware, этот список распространяется тут: https://lists.malwarepatrol.net/cgi/getfile?receipt=f1381257018&product=8&list=squid
#!/bin/sh
# If you don't want to log wget debug output remove "$debug" in line (51) "fetchcmd"
Setings
# Malware patrol URL with unique ID
# Change ID after receipt in link (..getfile?receipt=f138125701..)
link='https://lists.malwarepatrol.net/cgi/getfile?receipt=f1381257018&product=8&list=squid'
# HTTP USER
user='--http-user=sethuper'
# HTTP PASSWORD
pass='--http-passwd=apollo13'
# Checking certificate
cert='--no-check-certificate'
# File location for Squid
target='/etc/squid/malware_block_list'
# Reload Squid
reloadcmd='squid -k reconfigure'
# Temporary file
tmp="/tmp/.malware_block_list.$$"
# Wget debud
debug="-nv -a /var/log/squid/malware_block_list.log"
# Command for download malware list
fetchcmd="wget -q $link -O $tmp $user $pass $debug"
# Log file
logs='/var/log/squid/malware_block_list.log'
execution
echo "$(date -R) Downloading new malware_block_list" >> "$logs"
# Downloading new malware_block_list from Malware Patrol
$fetchcmd
# Checking temporary file – "OK" – before overwrite old malware list
if [ ! -s $tmp ]
then
echo "$(date -R) The temporary file '$tmp' does not exist or is empty;
resignation" >> "$logs"
exit
fi
# moving malware_black_list to directory /etc/squid3/
cp $tmp $target
# removing temporary file
rm $tmp
# restart Squid
$reloadcmd
chmod +x /scripts/malware_list.sh
/scripts/malware_list.sh
nano /etc/squid/squid.conf
acl malware_block_list url_regex -i "/etc/squid/malware_block_list"
http_access deny malware_block_list
SQStat
Для просмотра статистики squid в онлайн режиме будем использовать sqstat. Данный проект живет здесь: http://samm.kiev.ua/sqstat
apt install apache2
apt-get install squid-cgi
apt install php libapache2-mod-php
nano /etc/apache2/mods-enabled/dir.conf
Приводим к такому виду:
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
systemctl restart apache2
nano /var/www/html/info.php
<?php
phpinfo();
?>
http://your_server_ip/info.php
Сейчас необходимо поправить /etc/squid/cachemgr.conf
Вместо * можете поставить адрес сетевой которую прослушивает squid
Скачаем текущую версию sqstat и распакуем её
wget http://samm.kiev.ua/sqstat/sqstat-1.20.zip
unzip sqstat-1.20.zip
Создадим каталог sqstat в корневой директории web сервера, и скопируем туда распакованные файлы sqstat
mkdir /var/www/squid-stat
cp -R sqstat-1.20/* /var/www/squid-stat/
Перейдем в каталог /var/www/squid-stat/ и скопируем конфигурационный файл для sqstat
cd /var/www/squid-stat/
cp config.inc.php.defaults config.inc.php
<?php
/* global settings */
$use_js=true; // use javascript for the HTML toolkits
// Maximum URL length to display in URI table column
DEFINE("SQSTAT_SHOWLEN",60);
/* proxy settings */
/* Squid proxy server ip address or host name */
$squidhost[0]="127.0.0.1";
/* Squid proxy server port */
$squidport[0]=3128;
/* cachemgr_passwd in squid.conf. Leave blank to disable authorisation */
$cachemgr_passwd[0]="YouPassword";
/* Resolve user IP addresses or print them as numbers only [true|false] */
$resolveip[0]=false;
/* uncomment next line if you want to use hosts-like file.
See hosts.txt.dist. */
// $hosts_file[0]="hosts.txt"
/* Group users by hostname - "host" or by User - "username". Username work only
with squid 2.6+ */
$group_by[0]="host";
/* you can specify more than one proxy in the configuration file, e.g.: */
// $squidhost[1]="192.168.0.2";
// $squidport[1]=3129;
// $cachemgr_passwd[1]="secret";
// $resolveip[1]=true;
// $hosts_file[1]="otherhosts.txt"
?>
Добавим в /etc/squid/squid.conf строчку с паролем cachemgr, идентичным указанному в /var/www/squid-stat/config.inc.php а также проверим наличие acl и пары http_access
cachemgr_passwd YuoPassword all
acl manager proto cache_object
http_access allow manager localhost
http_access deny manager
Создадим Virtualhost в Apache.
<VirtualHost 192.168.1.11:80>
ServerName gateway.my.local
ServerAdmin webmaster@localhost
DocumentRoot /var/www/squid-stat/
<Location "/">
DirectoryIndex sqstat.php
Require ip 192.168.1.20 192.168.1.11
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
1 - на каком интерфейсе и порту слушать
2 - доменное имя обращение к которому принимать
3 - наша почта
4 - корневая директория сайта
5 - зададим индекс для корневой директории, и ограничим к ней доступ (Location)
6 - логи
a2ensite sqstat
service apache2 restart
Если открыть в браузере страницу http://your_proxy_ip/, выйдет ошибка
SqStat error
Error (1): Cannot get data. Server answered: HTTP/1.1 200 OK
Для исправления ошибки, создадим патч файл.
107c107
< if($raw[0]!="HTTP/1.0 200 OK"){
---
> if($raw[0]!="HTTP/1.1 200 OK"){
131,132c131,132
< if(substr($v,0,5)=="peer:") $parsed["con"][$connection]["peer"]=substr($v,6);
< if(substr($v,0,3)=="me:") $parsed["con"][$connection]["me"]=substr($v,4);
---
if(substr($v,0,7)=="remote:") $parsed["con"][$connection]["remote"]=substr($v,8);
if(substr($v,0,6)=="local:") $parsed["con"][$connection]["local"]=substr($v,7);
178c178
< $ip=substr($v["peer"],0,strpos($v["peer"],":"));
---
> $ip=substr($v["remote"],0,strpos($v["remote"],":"));
189c189
< $ip=ip2long(substr($v["peer"],0,strpos($v["peer"],":")));
> $ip=ip2long(substr($v["remote"],0,strpos($v["remote"],":")));
cd /var/www/squid-stat/
cp sqstat.class.php sqstat.class.php.default
patch sqstat.class.php sqstat_squid32.patch
patching file sqstat.class.php
Теперь, чтобы вместо ip или dns записей отображались имена пользователей, создаём в папке соскриптами /var/www/squid-stat/ файл hosts.txt в котором прописываем IP адреса и имена пользователей в подобном виде.
192.168.1.2 Пользователь 1
192.168.1.3 Пользователь 2
192.168.1.4 Пользователь 3
Добавим строку
nano /var/www/squid-stat/config.inc.php
$hosts_file[0]="hosts.txt";
https://4skill.ru/squid-sqstat/
SARG - Squid Analysis Report Generator
Для генерирования отчетов статистики squid в читабельном виде будем использовать SARG.
apt-get install sarg
cp /etc/sarg/sarg.conf /etc/sarg/sarg.conf_old
grep -v '^#' /etc/sarg/sarg.conf_old | sed '/^$/d' > /etc/sarg/sarg.conf
nano /etc/sarg/sarg.conf
Добавим:
graphs yes # Добавляем данную строчку в файл для построения графиков
graph_days_bytes_bar_color orange # Добавляем данную строчку в файл для построения графиков в цвете
Проверим:
output_dir /var/www/sarg
charset Latin1 Задаем кодировку Latin1 или UTF-8
resolve_ip yes
user_ip no
nano /etc/apache2/sites-available/sarg.conf
<VirtualHost 192.168.1.11:80>
ServerName sarg.my.local
ServerAdmin webmaster@localhost
DocumentRoot /var/www/sarg/
<Location "/">
Require ip 192.168.1.20 192.168.1.11
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
a2ensite sarg
Добавим в DNS или в файл hosts описание доменного имени sarg.my.local
Проверяем, клиент должен коректно распознавать sagr.my.lan
По адресу в браузере http://sarg.my.local/ должна отобразиться страничка sarg с отчетами.
Screen Squid
Этот проект мне понравился более всего, статистику смотреть через него просто удовольствие. Множество отчетов, хранит данные в mysql, одним словом - то, что доктор прописал. Требования - MySQL, Perl, LAMP
Про MySQL https://onedayadmin.sytes.net/mysql-in-ubuntu-14-04/
Скачиваем и разархивируем последний стэйбл по этой ссылке: https://sourceforge.net/projects/screen-squid/files/stable/
cd /tmp
tar -zxvf screensquid_v1_12.tar.gz
mkdir /var/www/squid-screen
cp -rf /tmp/rurls/* /var/www/squid-screen
apt-get install mysql-server php-mysql libdbd-mysql-perl
Для нормальной работы MySQL правим /etc/mysql/conf.d/mysql.cnf
[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"
Создадим пользователя, базу, и назначим права.
mysql -p
create database squidscreen DEFAULT CHARACTER SET utf8;
CREATE USER 'squid'@'localhost' IDENTIFIED BY 'You_Password';
grant all privileges on squidscreen.* to 'squid'@'localhost';
FLUSH PRIVILEGES;
use squidscreen;
SOURCE /var/www/squid-screen/createdb/createdb.sql;
quit;
nano /var/www/squid-screen/config.php
<?php
$srvname[0]="ProxyAtlant"; #nickname of server
$db[0] = "squid";
$user[0] = "squid";
$pass[0] ="Yuo_Password";
$address[0] ="localhost"; //mysql db
$cfgsquidhost[0]="localhost";
$cfgsquidport[0] = 3128;
$cfgcachemgr_passwd[0]="Pass_cachemgr";
.......
$cfgcachemgr_passwd
[0]=
"{пароль из директивы cachemgr_passwd squid.conf}"
;
my $host = "localhost"; # host s DB
my $port = "3306"; # port DB
my $user = "squid"; # username k DB
my $pass = "YouPassword"; # pasword k DB
my $db = "squid"; # name DB
my $count_lines_for_one_insert=100;
my $filetoparse="/var/log/squid/access.log";
my $filetolog="/var/log/squid/ssquid.log";
#Включить удаление старых данных из базы
my $enabledelete=1;
#Период, старше которого данные будут удаляться. Указывается в днях.
my $deleteperiod=60; #days
....
Создадим Virtualhost в Apache.
<VirtualHost 192.168.1.11:80>
ServerName squidscreen.my.local
ServerAdmin webmaster@localhost
DocumentRoot /var/www/squid-screen/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
http_access allow manager localhost
Настройка skype на стороне клиентской машины.
Для того чтобы скайп смог работать через наш шлюз нам придется помечать пакеты на стороне клиентской машины. Для этого используем технологию QoS, подробнее можно ознакомиться тут: https://www.atraining.ru/qos-windows-nt/
1. Так как машина-клиент не состоит в домене, то для того, чтобы включить маркировку пакетов, нам нужно применить некий костыль. Все действия для windows 7.
Открываем реестр от админа - regedit
Добавим раздел QoS по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\QoS
Теперь заходим в этот раздел и создаем там строковый параметр под названием Do not use NLA и значением 1
Должно получиться:
Type: REG_SZ
Name: Do not use NLA
Value: 1
Открываем оснастку Групповые Политики c правами админа.
gpedit.msc
Конфигурация компьютера -> Конфигурация Windows -> QoS на основе политики. И создаем две политики.
ПК по QoS на основе политики -> Дополнительные параметры QoS... -> Переопределение разметки DSCP -> Ставим галочку Контролировать запросы на маркировку DSCP от приложений и служб, Ставим галочку Пропускать запросы на DSCP от приложений и служб. Задавать значение DSCP для приложений могут только политики QoS.
ПК по QoS на основе политики -> Создать новую политику -> Имя политики - Skype, Укажите значение DSCP - 1 -> Только к приложениям с именем используемого файла - Skype.exe -> К любому исходному IP-адресу, К любому конечному IP-адресу -> выберите протокол, к которому применяется политика QoS - tcp/udp, Любой исходный порт, Любой порт назначения.
ПК по QoS на основе политики -> Создать новую политику -> Имя политики - SkypeBrowserHost, Укажите значение DSCP - 1 -> Только к приложениям с именем используемого файла - SkypeBrowserHost.exe -> К любому исходному IP-адресу, К любому конечному IP-адресу -> выберите протокол, к которому применяется политика QoS - tcp/udp, Любой исходный порт, Любой порт назначения.
Заходим в свойства сетевого подключения, проверяем галочку планировщик пакетов QoS, Настроить -> дополнительно -> Приоритет и виртуальная ЛС - приоритет включен.
Настройка skype на стороне шлюза.
Так как трафик от клиентов идет уже с марками, теперь iptables может конкретно этот трафик использовать в правилах.
iptables -I FORWARD 2 -s 192.168.1.0/24 -m tos --tos 4 -j ACCEPT
В GP указывается DSCP, а iptables оперирует ToS`ом. В двух словах, эти значения отличаются ровно в 4 раза, и значение ToS может принимать значение от 1 до 16. Чтобы получить tos умножаем значение DSCP на 4 и получаем 4.
iptables запишет tos как 0х04, т.е. в hex формате.
tcpdump -i eth0 -v host 192.168.1.71
получим что-то типа
00:00:00.000001 IP (tos 0x04, ttl 128, id 13954, offset 0, flags [none], proto UDP (17), length 62)
192.168.0.71.20344 > 65.55.223.43.40012: UDP, length 34
Но этим настройки не ограничиваются, теперь нужно натренировать squid пропускать без авторизации соединения на несколько доменов.
.microsoft.com
.skypeassets.com
.skype.net
.live.com
Добавим в начало ACL и в начало htaccess соотвественно
acl skype_domain dstdomain "/etc/squid/skype_domain.txt"
acl skype_user src "/etc/squid/skype_user.txt"
http_access allow skype_domain skype_user
Добавим фильтрацию http трафика с помощью clamav. Для обработки https нужен прозрачный режим поэтому ограничимся хотя бы http.
apt-get install clamav clamav-daemon
freshclam
apt-get install havp
nano /etc/havp/havp.config
lscpu
# Only for courses
SERVERNUMBER 4
usermod clamav -G havp
service havp restart
service clamav-daemon restart
netstat -an
Должен быть открыт 127.0.0.1:8080
nano /etc/squid/squid.conf
Добавим в секцию описывающую кэш строки:
cache_peer 127.0.0.1 parent 8080 0 no-query no-digest no-netdb-exchange default
cache_peer_access 127.0.0.1 allow all
acl Scan_HTTP proto HTTP
never_direct allow Scan_HTTP
service squid restart
Выпускать определенные ip только через один интерфейс
$iptables -t mangle -A PREROUTING -p tcp -s 192.168.21.43 -j MARK --set-mark 0x2
ip rule add fwmark 0x2/0x2 lookup ens5
Очистка журнала (логов) ОС, чтобы логи не заняли все свободное место.