Наиболее частым применением 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
Шейпер трафика: режем скорость