Интернет-шлюз на Oracle Linux 8.4 (NAT, Squid, QoS, DHCPD, DNSMASQ, SquidAnalyzer)

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

С переходом провайдеров на без лимитные тарифы — доступ к интернету без ограничений по объему загружаемых данных, потребность в таких серверах начала снижаться.

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

Так же повсеместное внедрение шифрования (HTTPS) в последние годы сделало процесс фильтрации и получение полной статистики несколько затруднительным.

Схема сети

proxy.mailns.local – шлюз на Oracle Linux 8.4, который предоставляет доступ за пределы внутренней сети. У него два интерфейса, первый enp0s8 (172.16.1.1) во внутренней сети, второй enp0s3 (192.168.1.50) с внешним IP адресом и доступом в Интернет.

В данном примере сетевые интерфейсы — enp0s8,enp0s3 — имеют статические настройки.

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

Для управления сетевыми настройками в Oracle Linux можно воспользоваться графической утилитой nmtui.

Вызываем программу:

nmtui

Выбираем первый пункт «Изменить соединение»

выбираем сетевой интерфейс и жмем «Изменить»

Указываем вручную IP-адрес внутреннего сетевого адаптера

Сохраняем настройки, нажимая «ОК»

Указываем вручную IP-адрес внешнего сетевого адаптера

Сохраняем настройки, нажимая «ОК»

Изменяем имя хоста выбрав пункт «Измените имя узла»

Вводим имя узла

Нажимаем «ОК» для сохранения

 

Подготовка системы

Обновление системы

dnf update -y

Удаление SELinux

dnf -y remove selinux*

Установка утилит

dnf install -y wget mc net-tools

 

Настройка NAT и брандмауэра

NAT — технология сетевой трансляции адресов позволяет организовать выход в интернет компьютеров локальной сети через один сетевой адрес. Данная технология абсолютно прозрачна для клиентских устройств и способна работать с любыми сетевыми приложениями и протоколами.

Включаем IP Forwarding

Чтобы сервер мог маршрутизировать пакеты между сетевыми адаптерами, необходимо выполнить следующую настройку.

Открываем файл:

mcedit /etc/sysctl.conf

И добавляем в него следующую строку:

net.ipv4.ip_forward = 1

После применяем настройку:

sysctl -p /etc/sysctl.conf

 

Удаление Firewalld

Остановка сервиса firewalld:

systemctl stop firewalld

Выключение сервиса автозагрузки firewalld:

systemctl disable firewalld

Маскировка сервиса firewalld:

systemctl mask --now firewalld

Удаление firewalld:

dnf -y remove firewalld

 

Установка и включение Iptables

Установка iptables:

dnf install -y iptables-services

Запуск сервиса iptables:

systemctl start iptables

Включение сервиса iptables в автозагрузку:

systemctl enable iptables

Проверка статуса службы iptables:

systemctl status iptables

В зависимости от политики сетевой безопасности существуют различные подходы к настройке брандмауэра.

В данном примере политикой по умолчанию установлена DROP. Эта политика сбрасывает весь трафик, не соответствующий правилам. При этой политике нужно поддерживать белый список. Для этого нужно явно разрешить все необходимые сервисы.

Создадим файл настроек в редакторе Midnight Commander:

mcedit iptables.sh

и внесем в него следующее содержимое:

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
# - Очищаем таблицы
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# - Политики по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# - Разрешить трафик по петлевому интерфейсу
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# - Разрешим передавать пакеты, относящиеся к уже установленным соединениям
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# - Разрешаем пинги
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
# - Доступ по SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# - Разрешить DHCP сервер
iptables -A INPUT -i enp0s8 -p udp --dport 67 -j ACCEPT
# - Разрешить DNS сервер
iptables -A INPUT -i enp0s8 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i enp0s8 -p tcp --dport 53 -j ACCEPT
# - Разрешить WEB сервер
iptables -A INPUT -i enp0s8 -p tcp --dport 80 -j ACCEPT
# - Разрешающим передачу пакетов между внутренним (enp0s8) и внешним (enp0s3) интерфейсом
iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
# - Разрешить все исходящие
iptables -I OUTPUT 1 -j ACCEPT
# - Включаем NAT
#iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s3 -j SNAT --to-source 192.168.1.50
# - Доступ к squid
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -p tcp --dport 3129 -j ACCEPT
iptables -A INPUT -p tcp --dport 3130 -j ACCEPT
# - Перенаправление HTTP, HTTPS в squid
iptables -t nat -A PREROUTING -p tcp -m tcp -s 172.16.1.0/24 --dport 80 -j REDIRECT --to-ports 3129
iptables -t nat -A PREROUTING -p tcp -m tcp -s 172.16.1.0/24 --dport 443 -j REDIRECT --to-ports 3130
# - Исключить адрес из перенаправления на squid 
iptables -t nat -I PREROUTING -d 172.16.1.1 -j ACCEPT
# - Сохранить настройки
service iptables save

В файле за комментирована строка:

iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

В данном случае целесообразно использовать:

iptables -t nat -A POSTROUTING -o enp0s3 -j SNAT --to-source 192.168.1.50

SNAT — работает аналогично MASQUERADE, однако позволяет указать адрес внешнего» интерфейса. Такой подход позволяет экономить процессорное время шлюза, так как в случае с MASQUERADE для каждого пакета адрес внешнего интерфейса определяется заново при каждом новом коннекте (например к сайту на другом хосту). Однако, в случае, если внешний адрес шлюза динамический, то есть меняется в начале каждой новой сессии, правильнее будет использовать именно MASQUERADE.

Сохраняем и назначаем права доступа:

chmod +x iptables.sh

Выполняем скрипт:

./iptables.sh

Посмотреть список правил iptables можно командой:

iptables --line-numbers -L -v -n

Отображать все действующие правила лучше с детализацией и нумерацией строк. Ключ —line-numbers нумерует строки, -L выводит список правил всех цепочек, -v отвечает за детализацию вывода, -n выводит IP-адреса и номера портов в числовом формате.

Вывести все действующие правила таблицы NAT можно просмотреть командой:

iptables --line-numbers -t nat -L -v -n

Установка и настройка DHCP

DHCP-сервер является неотъемлемой частью сетей любого размера, ручное указание сетевых настроек, это даже не вчерашний, а позавчерашний день.

Устанавливаем DHCPD

dnf -y install dhcp-server

Откроем на редактирование конфигурационный файл

mcedit /etc/dhcp/dhcpd.conf

Внесем в него следующее

ddns-update-style none;

ignore client-updates;

DHCPARGS="enp0s8";

subnet 172.16.1.0 netmask 255.255.255.0
{
    range 172.16.1.2 172.16.1.254;
    option routers 172.16.1.1;
    option subnet-mask 255.255.255.0;
    option domain-name "mailns.local";
    option domain-name-servers 172.16.1.1;
    option time-offset -18000;
    default-lease-time 604800;
    max-lease-time 1209600;
}

host PC1 {
    hardware ethernet 08:00:27:28:EE:F8; fixed-address 172.16.1.101;
}

ddns-update-style none — режим обновления DNS;
ignore client-updates — игнорировать все клиентские запросы на модификацию DDNS;
DHCPARGS=»enp0s8″ — интерфейс для работы;
subnet — обозначает сеть, в области которой будет работать данная группа настроек;
range — диапазон, из которого будут браться IP-адреса;
option routers — шлюз по умолчанию;
option subnet-mask — маска подсети для выдаваемых вашим клиентам IP адресов;
option domain-name — суффикс доменного имени;
option domain-name-servers — IP адрес DNS сервера, через запятую DNS-сервера;
option time-offset — разница во времени с Гринвичем в секундах;
default-lease-time — время аренды IP адреса выдаваемое клинту;
max-lease-time — максимальное время аренды IP адреса клиентом;

Резервирование IP

host PC1 {
    hardware ethernet 08:00:27:28:EE:F8; fixed-address 172.16.1.101;
}

PC1 — имя узла, для которого резервируем адрес;
08:00:27:28:EE:F8 — mac-адрес;
172.16.1.101 — IP, который будет назначать узлу;

Включение сервиса dhcpd в автозагрузку:

systemctl enable dhcpd

Запуск сервиса dhcpd:

systemctl start dhcpd

Проверим статус сервиса dhcpd:

systemctl status dhcpd

Установка и настройка DNS

Можно установить полноценный DNS сервер, но в данном случаи это избыточно, поэтому ограничимся простым кеширующим DNS сервером Dnsmasq.

Устанавливаем dnsmasq:

dnf -y install dnsmasq

Откроем на редактирование конфигурационный файл:

mcedit /etc/dnsmasq.conf

Приводим его к следующему виду:

# Прослушивать запросы на интерфейсе
interface=enp0s8
# Отключить DHCP и TFTP
no-dhcp-interface=enp0s8
# Прослушивать порт
port=53
# Название домена
domain=mailns.local
# Запись с указанием адреса (A-запись)
address=/proxy.mailns.local/172.16.1.1
# Перенаправлять запросы
server=8.8.8.8
server=8.8.4.4
# Очистка кеша при перезагрузке
clear-on-reload

Включение сервиса dnsmasq в автозагрузку:

systemctl enable dnsmasq

Запуск сервиса dnsmasq:

systemctl start dnsmasq

Проверим статус сервиса dnsmasq:

systemctl status dnsmasq

 

Установка и настройка Squid

Основным назначением прокси-сервера Squid было кэширование трафика, сегодня, при повсеместном внедрении безлимитного интернета, эти возможности мало востребованы.

Squid поддерживает кэширование двух типов, в оперативной памяти и на диске. Сегодня можно встретить рекомендации отказаться от дискового кэша.

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

В данном примере Squid настроен на работу в прозрачном режиме с авторизацией по mac адресам с фильтрацией HTTPS ресурсов без подмены сертификатов.

Установка Squid

Пакет из репозитория не устанавливал а скачал и установил с RPM resource.

Скачиваем пакет:

wget https://rpmfind.net/linux/centos/8-stream/AppStream/x86_64/os/Packages/squid-4.15-1.module_el8.5.0+860+303ccf92.x86_64.rpm

Установка пакета:

dnf -y localinstall squid-4.15-1.module_el8.5.0+860+303ccf92.x86_64.rpm

 

Создание CA сертификата

Создадим каталог для сертификатов:

mkdir -p /etc/squid/ssl

Готовим базу для генерируемых сертификатов:

/usr/lib64/squid/security_file_certgen -c -s /var/spool/squid/ssl_db -M 16MB

Назначим пользователя и права доступа на каталог:

chown -R squid:squid /etc/squid/ssl

chmod 700 /etc/squid/ssl

Переходим в каталог для сертификатов:

cd /etc/squid/ssl

Создадим сертификат и ключ:

openssl req -new -newkey rsa:2048 -sha256 -days 36500 -nodes -x509 -extensions v3_ca -keyout squidCA.pem -out squidCA.pem

Вводим данные сертификата:

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Sverdlovsk region
Locality Name (eg, city) []:Ekaterinburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mailns Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:proxy.mailns.local
Email Address []:admin@mailns.ru

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

openssl x509 -in squidCA.pem -outform DER -out squidCA.der

Откроем файл конфигурации Squid:

mcedit /etc/squid/squid.conf

Приводим его к следующему виду:

visible_hostname = proxy.mailns.local

# DNS сервера
dns_nameservers 192.168.1.1

# Разрешить доступ из локальных сетей.
acl localnet src 172.16.1.0/24		# LAN

# Разрешенные порты на прокси сервере
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

# Доступ пользователей по MAC адресам
acl mac arp "/etc/squid/acl/users.mac"
http_access allow mac

# Отклонять запросы к неразрешенным портам
http_access deny !Safe_ports

# Запретить метод CONNECT не на SSL-порт
http_access deny CONNECT !SSL_ports

# Разрешить только локальное управление кэшем
http_access allow localhost manager
http_access deny manager

# Список запрещенных ресурсов HTTP
acl ban url_regex -i "/etc/squid/acl/ban"
http_access deny ban

# Не ограничивать локальный доступ с сервера
#http_access deny to_localhost

# Разрешить доступ из локальных сетей.
#http_access allow localnet
#http_access allow localhost

# Отображение доменов посещенных HTTPS ресурсов в логе и mac пользователя
acl https_port port 443
logformat https %ts.%03tu %6tr %>eui %Ss/%03>Hs %<st %rm %ssl::>sni %[un %Sh/%<a %mt
cache_access_log /var/log/squid/access.log https https_port

# Отображение HTTP ресурсов и mac пользователя
acl http_port port 80
logformat http %ts.%03tu %6tr %>eui %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt.
cache_access_log /var/log/squid/access.log http http_port

# Блокировать все, что не разрешено выше
http_access deny all

# Не прозрачный порт
http_port 3128 ssl-bump connection-auth=off generate-host-certificates=on dynamic_cert_mem_cache_size=16MB cert=/etc/squid/ssl/squidCA.pem key=/etc/squid/ssl/squidCA.pem

# Прозрачный порт HTTP
http_port 3129 intercept

# Прозрачный порт HTTPS
https_port 3130 intercept ssl-bump connection-auth=off generate-host-certificates=on dynamic_cert_mem_cache_size=16MB cert=/etc/squid/ssl/squidCA.pem key=/etc/squid/ssl/squidCA.pem

# Разрешать соединение даже с ошибками проверки сертификата
always_direct allow all
sslproxy_cert_error allow all

# Список запрещенных ресурсов HTTPS
acl banned ssl::server_name_regex -i "/etc/squid/acl/ban"

# Глубина перехвата HTTPS-трафика (получение открытой информации о соединении)
acl step1 at_step SslBump1
ssl_bump peek step1

# Терминируем соединение, если клиент заходит на запрещенный ресурс
ssl_bump terminate banned

# Подсмотреть всю доступную информацию без влезания в соединение
ssl_bump peek all

# Хелпер генерации сертификатов для сайтов 
sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/spool/squid/ssl_db -M 16MB
sslcrtd_children 50 startup=10 idle=10

# Объем оперативной памяти, которая будет использована для хранения закэшированных объектов
cache_mem 1024 MB

# Не держать в памяти то, что больше не используеться активно
memory_pools off

# Максимальный размер объекта, сохраняемого в оперативной памяти
maximum_object_size_in_memory 1 MB

# Каталог кэша
cache_dir aufs /var/spool/squid 2048 16 256

# Максимальный размер объекта, выдаваемого из кэша
maximum_object_size 4 MB

# Нижняя и верхняя граница преодолев которую squid начинает вычищать мусор из своего кэша - измеряется в процентах
cache_swap_low 90
cache_swap_high 95

# Время жизни объектов
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

# E-mail адрес Cache менеджера, для отправки уведомлений и отображении в страницах ошибок
cache_mgr admin@mailns.ru

# Вывод ошибок на русском языке
error_directory /usr/share/squid/errors/ru

# Вести статистику по каждому клиенту
client_db off

# Посылает сообщение о закрытии соединения клиентам, которые оставляют полуоткрытое соединение с сервером
half_closed_clients off

# Число ротаций логов
logfile_rotate 0

Создадим каталог для списков управления доступом:

mkdir -p /etc/squid/acl

Создадим список запрещенных ресурсов:

mcedit /etc/squid/acl/ban

Списком значений запрещенных ресурсов хранится в виде regex-выражений:

^([A-Za-z0-9.-]*\.)?vk\.com
^([A-Za-z0-9.-]*\.)?ok\.ru
^([A-Za-z0-9.-]*\.)?facebook\.com
^([A-Za-z0-9.-]*\.)?instagram\.com

Создадим список доступа с mac адресами:

mcedit /etc/squid/acl/users.mac

Содержимое файла users.mac:

08:00:27:76:C1:4E #PC1
08:00:27:28:EE:F8 #PC2

Включение сервиса squid в автозагрузку

systemctl enable squid

Запуск сервиса squid:

systemctl start squid

Проверим статус сервиса squid:

systemctl status squid

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

squid -k reconfigure

Настройка ротации логов Squid

Ротация логов осуществляется с помощью системной службы logrotate. Сама служба вызывается раз в сутки через планировщик cron.

Основные настройки logrotate хранятся в /etc/logrotate.conf, настройки отдельных сервисов хранятся в /etc/logrotate.d.

Откроем файл настройки ротации логов Squid:

mcedit /etc/logrotate.d/squid

Надо настроить ежедневную ротацию логов двух файлов access.log и cache.log.

Приведем файл конфигурации к виду:

# Ежедневная ротация лог-файла access.log
    /var/log/squid/access.log {
    daily
    rotate 365
    compress
    notifempty
    missingok
    nocreate
    sharedscripts
    postrotate
    endscript
}
# Ежедневная ротация лог-файла cache.log
    /var/log/squid/cache.log {
    daily
    rotate 365
    compress
    notifempty
    missingok
    nocreate
    sharedscripts
    postrotate
    endscript
}

daily — задает ежедневную ротацию;
weekly — задает еженедельную ротацию;
monthly — задает ежемесячную ротацию;
compress — указывает сжимать архивные логи, обратная опция nocompress;
delaycompress — не сжимать текущий лог до следующей ротации, обычно используется в тех случаях, когда в лог происходит непрерывная запись;
rotate 365 — количество ротаций до удаления файла, в данном случае будут храниться два архива;
missingok — при отсутствии файла журнала указывает продолжить работу без вывода сообщения об ошибке;
nocreate — не создавать новый файл лога;
sharedscripts — используется для секций prerotate и postrotate, данная опция указывает исполнять скрипты из этих секций один раз перед и после ротации всех логов, в противном случае скрипты будут исполнены перед и после ротации каждого лога;
postrotate — проверяет, запущен ли squid и запускает ротацию логов самим прокси сервером.

 

Установка SquidAnalyzer

SquidAnalyzer — это анализатор журналов для прокси-сервера Squid. SquidAnalyzer генерирует и предоставляет аналитические отчеты через веб-интерфейс. SquidAnalyzer бесплатное програмное обеспечение с открытым исходным кодом, распространяется по лицензии GNU GPL.

Установка необходимых компонентов для SquidAnalyzer

Устанавливаем HTTP-сервер Apache:

dnf install -y httpd

Включение сервиса httpd в автозагрузку:

systemctl enable httpd

Запуск сервиса httpd:

systemctl start httpd

Проверим статус сервиса httpd:

systemctl status httpd

Можно зайти по адресу сервера http://ip-адрес и увидеть тестовую страницу:

Устанавливаем пакеты perl:

dnf install perl perl-devel -y

Добавление репозитория

wget -P /etc/yum.repos.d https://copr.fedorainfracloud.org/coprs/tachtler/squidanalyzer/repo/epel-8/tachtler-squidanalyzer-epel-8.repo

Импорт GPG-ключа репозитория

rpm --import https://download.copr.fedorainfracloud.org/results/tachtler/squidanalyzer/pubkey.gpg

Установка пакета SquidAnalyzer

dnf install -y squidanalyzer

Создадим конфигурацию Apache, чтобы добавить веб-сайт SquidAnalyzer:

mcedit /etc/httpd/conf.d/squidanalyzer.conf

Добавим следующие содержимое в файл конфигурации:

Alias /squidanalyzer /var/www/squidanalyzer
<Directory /var/www/squidanalyzer>
	Options +Indexes +FollowSymLinks +MultiViews
	AllowOverride None
	Order deny,allow
	Deny from all
	Allow from all
</Directory>

Перезапускаем сервис httpd:

systemctl restart httpd

Для вывода отчетов на руcском языке изменим строку в конфигурационном файле SquidAnalyzer:

mcedit /etc/squidanalyzer/squidanalyzer.conf

Раскоментируем строку: «Lang» и приведем ее к следующему виду:

Lang	/etc/squidanalyzer/lang/ru_RU.txt

Запустить анализ логов можно выполнив команду:

/usr/bin/squid-analyzer

Запустить анализ нескольких файлов (например ротированных файлов) можно командой:

/usr/bin/squid-analyzer logfile ls /var/log/squid/*

После запуска анализа будет сформерован отчет, который будет доступен по адресу http:// ip-адрес/squidanalyzer/

Стоит отметить что страницу с отчетами можно стилизовать под себя, сменить логотипы, подписи, фон и т.д.

Часть следует менять в основном конфиге:

/etc/squidanalyzer/squidanalyzer.conf

И в скрипте который является шаблоном для /usr/bin/squid-analyzer:

/usr/share/perl5/vendor_perl/SquidAnalyzer.pm

 

Режем скорость

Разделение, ограничение и управление трафиком — актуальная и сложная задача, которую обычно возлагают на дорогостоящее сетевое оборудование.

Но решить ее можно и с помощью подсистемы Linux-ядра Traffic Control.

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

Решил воспользоваться некогда популярным историческим скриптом для управления трафиком HTB.init.

HTB.init — это скрипт, который с помощью утилит ip, tc настраивает пропускную способность канала.

HTB.init генерирует правила шейпера согласно созданным файлам конфигурации.

Устанавливаем утилиту tc:

dnf install -y tc

Установка htb.init

Качаем скрипт htb.init в директорию /etc/init.d и сохроняем под именем htb:

wget "https://raw.githubusercontent.com/lbulej/htb.init/master/htb.init" -O /etc/init.d/htb

Разрешим выполнение скрипта:

chmod +x /etc/init.d/htb

Добовляем скрипт в атозагрузку:

chkconfig htb on

Создаем каталог под файлы конфигурации:

mkdir -p /etc/sysconfig/htb

Теперь можно приступать к написанию конфигурационных файлов, переходим в каталог:

cd /etc/sysconfig/htb

Пример для разделение входящей и исходящей скорости канала поровну между машинами локальной сети.

Создаем конфигурационные файлы для входящего трафика.

Описываем интерфейс enp0s8:

mcedit enp0s8

Содержимое файла enp0s8:

DEFAULT=0
R2Q=100

Создаем корневой класс:

mcedit enp0s8-2.root

Содержимое файла enp0s8-2.root:

RATE=1000Mbit

Создаем класс очереди:

mcedit enp0s8-2:3.dfl

Содержимое файла enp0s8-2:3.dfl:

RATE=60Mbit
CEIL=60Mbit
LEAF=sfq
RULE=172.16.1.0/24

Создаем конфигурационные файлы для входящего трафика.

Описываем интерфейс enp0s3:

mcedit enp0s3

Содержимое файла enp0s3:

DEFAULT=0
R2Q=100

Создаем корневой класс:

mcedit enp0s3-2.root

Содержимое файла enp0s3-2.root:

RATE=1000Mbit

Создаем класс очереди:

mcedit enp0s3-2:3.dfl

Содержимое файла enp0s3-2:3.dfl:

RATE=60Mbit
CEIL=60Mbit
LEAF=sfq
MARK=1

Для корректной работы надо добавить правило в фаервол:

iptables -t mangle -A PREROUTING -s 172.16.1.0/24 -j MARK --set-mark 1

Посмотреть какие правила будут сформированы:

service htb compile

Запуск скрипта:

service htb start

Перезапуск после внесения изменений в файлы конфигурации:

service htb restart

Параметры

DEFAULT=0 — указывает номер класса, куда попадает трафик не попавший ни под одно правило;
R2Q=100 — точность шейпера;
RATE=60Mbit — выделенная (гарантированная) пропускная способность очереди, задается в Kbit, Mbit;
CEIL=60MBit — максимальная пропускная способность очереди, если не указывать, то по умолчанию CEIL=RATE;
BURST=bytes — количество байт без ограничения скорости;
PRIO=number — приоритет трафика очереди к другим очередям в классе. Чем меньше число, тем выше приоритет. По умолчанию 0;
LEAF=sfq — равномерное распределение между участниками очереди;
RULE=172.16.1.0/24 — правило, определяющее трафик, который должен проходить через данную очередь. В одном файле могут присутствовать сразу несколько правил.
MARK=1 — трафик имеющий метку. Например если надо ограничить исходящий трафик от клиента в локальной сети, находящегося за NAT, RULE не будет работать, нужно использовать MARK, и метить нужные пакеты в фаерволе;
TIME — временные параметры.

Не совсем удобно использовать данный скрипт когда требуеться ограничить скорость для каждого IP-адреса подсети, придеться создовать класс очереди для каждого IP-адреса.

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

mcedit htb-enp0s8.sh

Содержимое скрипта:

#!/bin/bash

TARGET_DIR=/etc/sysconfig/htb;

FILES_COUNT=254;

echo "Creating $FILES_COUNT files in $TARGET_DIR";

for ((k=1; k<=$FILES_COUNT; k++));
do
	FILE_NAME=$(printf "$TARGET_DIR/enp0s8-2:3%03d.PC" $k);

	echo "*Creating file $FILE_NAME";

	echo "RATE=8Mbit" > $FILE_NAME;
	echo "CEIL=8Mbit" >> $FILE_NAME;
	echo "LEAF=sfq" >> $FILE_NAME;

	RULE_NUM=$(($k+1-1));
	echo "RULE=172.16.1.$RULE_NUM" >> $FILE_NAME;
done

Разрешим выполнение скрипта:

chmod +x htb-enp0s8.sh

Запускаем скрипт:

./htb-enp0s8.sh

Теперь создадим скрипт генерации файлов класса очереди исходящего трафика:

mcedit htb-enp0s3.sh

Содержимое скрипта:

#!/bin/bash

TARGET_DIR=/etc/sysconfig/htb;

FILES_COUNT=254;

echo "Creating $FILES_COUNT files in $TARGET_DIR";

for ((k=1; k<=$FILES_COUNT; k++));
do
	FILE_NAME=$(printf "$TARGET_DIR/enp0s3-2:3%03d.PC" $k);

	echo "*Creating file $FILE_NAME";

	echo "RATE=8Mbit" > $FILE_NAME;
	echo "CEIL=8Mbit" >> $FILE_NAME;
	echo "LEAF=sfq" >> $FILE_NAME;

	MARK_NUM=$(($k+1-1));
	echo "MARK=$MARK_NUM" >> $FILE_NAME;
done

Разрешим выполнение скрипта:

chmod +x htb-enp0s3.sh

Запускаем скрипт:

./htb-enp0s3.sh

Проверяем наличи и содержимое файлов в каталоге:

/etc/sysconfig/htb

Создаем скрипт для создания правил маркировки пакетов файрволом:

mcedit add-mark-iptables.sh

Содержимое скрипта:

#!/bin/bash

for ((i=1; i < 255; i++))
do

	iptables -t mangle -A PREROUTING -s 172.16.1.${i} -j MARK --set-mark ${i}

done

service iptables save

Разрешим выполнение скрипта:

chmod +x add-mark-iptables.sh

Выполняем скрипт:

./add-mark-iptables.sh

Поверяем правила файрвола:

iptables --line-numbers -t mangle -L -v -n

Удаляем кеш скрипта htb.init:

rm /var/cache/htb.init

Просматриваем список создоваемых правил:

service htb compile

Перезапускаем htb.init:

service htb restart

Измеряем скорость

 

Доступ к NAT по MAC адресам

Ограничить прохождение пакетов можно через iptables в цепочке FORWARD.

Создадим небольной скрипт для добавления mac адресов из файла users.mac расположенного в /etc/squid/acl/users.mac.

Данный скрипт очищает цепочку FORWARD, добавляет правило разрешающее передавать пакеты, относящиеся к уже установленным соединениям. Создает правила, разрешающие передачу пакетов между внутренним и внешним интерфейсом с определенных mac адресов и дает команду squid перечитать конфигурационный файл.

mcedit add-mac-iptables.sh

Содержимое скрипта:

#!/bin/bash

iptables -F FORWARD
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

for i in `sed 's/#.*//; /^$/d' /etc/squid/acl/users.mac`
do
    iptables -A FORWARD -i enp0s8 -o enp0s3 -m mac --mac-source ${i} -j ACCEPT
done

iptables -A FORWARD -j REJECT

service iptables save

squid -k reconfigure

Разрешим выполнение скрипта:

chmod +x add-mac-iptables.sh

Выполняем скрипт:

./add-mac-iptables.sh

Посмотрим список правил iptables:

iptables --line-numbers -L -v -n

Допустим необходимо обеспечить доступ c определенного IP адреса к NAT напрямую без перенаправления на squid, для этого нужно добавить правило в iptables, но оно должно быть выше редирикта на squid:

iptables -t nat -I PREROUTING 1 -s 172.16.1.3 -p tcp -m tcp --dport 80 -j RETURN

iptables -t nat -I PREROUTING 1 -s 172.16.1.3 -p tcp -m tcp --dport 443 -j RETURN

Посмотрим список правил iptables таблицы NAT:

iptables --line-numbers -t nat -L -v -n

 

Ссылки

Squid
HTB.init
SquidAnalyzer
Перехват и раскрытие HTTPS-запросов на прокси-сервере Squid при помощи SSL-Bump
QoS в Linux
Iptables
Ограничение скорости HTB.init
Шейпер трафика: режем скорость