yum создаем локальный репозиторий

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

# yum install createrepo yum-utils 

Смотрим подключенные репозитории:

# yum repolist
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.colocall.net
 * elrepo: mirrors.colocall.net
 * epel: mirrors.colocall.net
 * extras: centos.colocall.net
 * remi-safe: mirrors.bytes.ua
 * updates: centos.colocall.net
 * webtatic: uk.repo.webtatic.com
Идентификатор репозитория                                репозиторий                                                                                состояние
base/7/x86_64                                            CentOS-7 - Base                                                                            10.019
ce_10.0                                                  ownCloud Server Version 10.0 (CentOS_7)                                                         2
elrepo                                                   ELRepo.org Community Enterprise Linux Repository - el7                                        114
epel/x86_64                                              Extra Packages for Enterprise Linux 7 - x86_64                                             13.297
extras/7/x86_64                                          CentOS-7 - Extras                                                                             419
ius/x86_64                                               IUS for Enterprise Linux 7 - x86_64                                                           589
remi-safe                                                Safe Remi's RPM repository for Enterprise Linux 7 - x86_64                                  3.483
updates/7/x86_64                                         CentOS-7 - Updates                                                                          2.233
webtatic/x86_64                                          Webtatic Repository EL7 - x86_64                                                              459
repolist: 30.615

Создаем директории для их локального хранения (всех или избранных):

# mkdir -p /var/www/html/repos/{base,ce_10.0,elrepo,epel,ius,remi-safe,webtatic,extras,updates}

Синхронизируем утилитой reposync:

# reposync -g -l -d -m --repoid=base --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=remi-safe --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=epel --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=elrepo --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=extras --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=ius --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=ce_10.0 --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=webtatic --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=updates --newest-only --download-metadata --download_path=/var/www/html/repos/

флаги в приведенном выше выводе:

  • -g — позволяет удалить пакеты, которые не поддаются проверке подписи GPG после загрузки.
  • -l — поддержка плагина yum.
  • -d — позволяет удалить локальные пакеты, которые больше не присутствуют в репозитории.
  • -m — позволяет загружать файлы comps.xml.
  • —repoid — указывает идентификатор репозитория.
  • —newest-only — указывает reposync, получить последнюю версию для каждого пакета в репозитории.
  • —download-metadata — позволяет загружать все метаданные, отличающиеся от дефолтных.
  • —download_path — указывает путь для загрузки пакетов.

Запускаем генерацию метаданных и обновление репозитория:

# createrepo -g comps.xml /var/www/html/repos/base
# createrepo -g comps.xml /var/www/html/repos/extras
# createrepo -g comps.xml /var/www/html/repos/ius  
# createrepo -g comps.xml /var/www/html/repos/epel  
# createrepo -g comps.xml /var/www/html/repos/ce_10.0  
# createrepo -g comps.xml /var/www/html/repos/remi-safe 
# createrepo -g comps.xml /var/www/html/repos/elrepo 
# createrepo -g comps.xml /var/www/html/repos/webtatic 
# createrepo -g comps.xml /var/www/html/repos/updates

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

# vi /etc/yum.repos.d/local-repos.repo
[local-base]
name=CentOS Base
baseurl=http://repo.server.com/repos/base/
gpgcheck=0
enabled=1

[local-ius]
name=CentOS IUS
baseurl=http://repo.server.com/repos/extras/
gpgcheck=0
enabled=1

[local-extras]
name=CentOS Extras
baseurl=http://repo.server.com/repos/extras/
gpgcheck=0
enabled=1

[local-updates]
name=CentOS Updates
baseurl=http://repo.server.com/repos/updates/
gpgcheck=0
enabled=1

Для просмотра репозитория через web-браузер сменим пользователя на nginx:www-data:

# chown -R nginx:www-data /var/www/html/repos

Устанавливаем nginx/apache и прописываем блок конфигурации:

# vi /etc/nginx/sites-available/default

### REPOS ####
location /repos {
    autoindex            on;     # включить автоматическое индексирование содержания (Включить просмотр каталогов/файлов 
    autoindex_exact_size off;    # Полезно, если вы хотите округлить размеры файлов в КБ, МБ, ГБ и т.д. (по умолчанию установлен в байтах)
    autoindex_localtime  on;     # показывать местное время создания файлов
}
##############
# nginx -t
# nginx -s reload

Проверяем набрав в браузере:

https://repo.server.com/repos/

На клиентских компьютерах CentOS нужно добавить локальные репозитории в конфигурацию:

# vim /etc/yum.repos.d/local-repos.repo
[local-base] 
name=CentOS Base 
baseurl=http://repo.server.com/repos/base/
gpgcheck=0 
enabled=1 

[local-ius] 
name=CentOS IUS 
baseurl=http://repo.server.com/repos/extras/ 
gpgcheck=0 
enabled=1 

[local-extras] 
name=CentOS Extras 
baseurl=http://repo.server.com/repos/extras/ 
gpgcheck=0 
enabled=1 

[local-updates] 
name=CentOS Updates 
baseurl=http://repo.server.com/repos/updates/ 
gpgcheck=0 
enabled=1

Запустите представленную ниже команду, чтобы просмотреть локальные репозитории в списке доступных репозиториев YUM на клиентских компьютерах:

# yum repolist

Проверяем обновления, отключив все репозитории, кроме нашего нового [local-updates]:

# yum --disablerepo=* --enablerepo=local-update check-update

Настроим автоматическое обновление/синхронизацию локального репозитория:

# vi /etc/cron.daily/update-localrepos
#!/bin/bash

LOCAL_REPOS="base ius extras updates"

for REPO in ${LOCAL_REPOS}; do
    reposync -g -l -d -m --repoid=$REPO --newest-only --download-metadata --download_path=/var/www/html/repos/
    createrepo -g comps.xml /var/www/html/repos/$REPO/
done

Делаем файл исполняемым:

# chmod +x /etc/cron.daily/update-localrepos
image_pdfimage_print

Logrotate

Конфигурационный файл по умолчанию — /etc/logrotate.conf, а индивидуальные правила ротирования логов для сервисов хранятся в директории /etc/logrotate.d

Пример

/var/log/name_service/* {
    rotate 30
    size=10M
    missingok
    notifempty
    daily  
    compress
    delaycompress
    maxage 30
    create 0644 root root
    postrotate
       /usr/bin/systemctl restart logstash-forwarder
    endscript
}
  • rotate 30 — хранить последние 30 ротированных файлов. Остальные удалять.
  • size=10M — пока размер лог-файла не превысит 10 мегабайт, он не будет ротироваться.
  • missingok — если файла не существует, не выкидывать ошибку.
  • notifempty — если файл пустой, не выполнять никаких действий.
  • daily — делать ротацию каждый день.
  • dateyesterday – вчерашнюю дату при ротации
  • dateext – ставить дату вместо номера
  • compress — сжимать ротированные файлы.
  • delaycompress — сжимать только предыдущий журнал. Позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу.
  • maxage 30 — хранить ротированные файлы за последние 30 дней. Остальные удалять.
  • copytruncate – Создать копию оригинального log-файла, а потом его ‘обнулить’.  Таким образом сам файл не удаляется и не меняется его дескриптор. Несовместимость: create
  • create 0644 root root — создать новый лог-файл после ротирования.
  • postrotate … endscript — скрипт, который необходимо выполнить после чистки лога.

* /var/log/name_service/* — путь к файлу, который нужно ротировать. * указывает, что нужно чистить все файлы, которые расположены в каталоге /var/log/name_service/

Пример для ulog-acctd

/var/log/ulog-acctd/account.log /var/log/ulog-acctd/debug.log {
    daily
    rotate 50
    copytruncate
    compress
    notifempty
    dateyesterday #вчерашнюю дату при ротации
    #dateext #ставить дату вместо номера
    missingok
    sharedscripts
    prerotate
       if [ -e /var/run/ulog-acctd.pid ]; then kill -TSTP `cat /var/run/ulog-acctd.pid`; fi
    endscript
    postrotate
       if [ -e /var/run/ulog-acctd.pid ]; then kill -CONT `cat /var/run/ulog-acctd.pid`; fi
    endscript
}

Предварительная ротация (проверка/отладка)

В первую очередь проверьте что произойдет, когда вы принудительно запустите logrotate (без изменений в файловой системе):

$ logrotate -vdf CONFIG_FILE

с выводом в файл:

# /usr/sbin/logrotate -d /etc/logrotate.conf 2> /tmp/logrotate.debug

Принудительный запуск logrotate:

$ logrotate -vf CONFIG_FILE

Опции передаваемые команде logrotate:

-d, –debug                Запустить logrotate в режиме отладки (пробный прогон).
-f, –force                   Принудительно запустить logrotate.
-v, –verbose             Показать больше информации.

С помощью опции -f, –force, logrotate произведет принудительную ротацию файлов, даже если они не попадаю под определенные критерии, как minsizeage и т.п.

image_pdfimage_print

Бэкапим почту

RSYNC

# mkdir -p /backup/vmail
# vi backup_mail_server_name.sh 

#!/bin/sh
## Backup
rsync -a --delete-after /var/vmail/ /home/backup/vmail

## Restore
#rsync -a --delete-after /home/backup/vmail /var/vmail/
# chmod +x backup_mail_server_name.sh
# crontab -e

55 4 * * *      /home/user/bin/backup_mail_server_name.sh

 

https://softnastroy.com/content/postfix-arhivaciya-i-vosstanovlenie-pisem.html

 

image_pdfimage_print

FTP активный и пассивный режимы

При работе по протоколу FTP между клиентом и сервером устанавливается два соединения – управляющее (по нему идут команды) и соединение передачи данных (по нему передаются файлы).

Управляющее соединение одинаково для Активного и Пассивного режима. Клиент инициирует TCP-соединение с динамического порта (1024-65535) к порту номер 21 на FTP-сервере и говорит «Привет! Я хочу подключиться к тебе. Вот мое имя и мой пароль». Дальнейшие действия зависят от того, какой режим FTP (Активный или Пассивный) выбран.

В активном режиме, когда клиент говорит «Привет!» он так же сообщает серверу номер порта (из динамического диапазона 1024-65535) для того, чтобы сервер мог подключиться к клиенту для установки соединения для передачи данных. FTP-сервер подключается к заданному номеру порта клиента используя со своей стороны номер TCP-порта 20 для передачи данных.

В активном режиме все происходит в следующем порядке:

  1. Клиент посылает с временного порта диапазоном 102465535 запрос на порт сервера номер 21.
  2. Сервер отвечает на временный порт клиента (в примере порт 1036).
  3. Клиент подтверждает установку соединения.
  4. Клиент отправляет команду PORT, которая говорит об использовании активного режима FTP, свой IP-адрес, а также номер порта для установки соединения для передачи данных, к которому подключится сервер (в примере порт 1037).
  5. Команда подтверждается сервером.
  6. Клиент задает серверу команды для работы с FTP.
  7. Сервер создает соединение передачи данных. Для этого он отправляет запрос с 20-го порта на указанный клиентом в четвертом пункте порт (1037).
  8. Клиент отвечает на запрос.
  9. Сервер подтверждает установку соединения и дает клиенту возможность передавать данные.

Активный режим FTP

В пассивном режиме, после того как клиент сказал «Привет!», сервер сообщает клиенту номер TCP-порта (из динамического диапазона 1024-65535), к которому можно подключиться для установки соединения передачи данных.

Действия происходят следующим образом:

  1. Клиент посылает с временного порта диапазоном 102465535 запрос на порт сервера номер 21.
  2. Сервер отвечает на временный порт клиента (в примере порт 1036).
  3. Клиент подтверждает установку соединения.
  4. Клиент отправляет команду PASV, которая говорит об использовании пассивного режима FTP.
  5. Сервер подтверждает работу в пассивном режиме, посылает свой IP-адрес, а также номер порта для установки соединения для передачи данных, к которому подключится клиент (в примере 2154).
  6. С порта для передачи данных (в примере 1037) клиент посылает запрос на установку соединения на выданный сервером порт (2154).
  7. Сервер подтверждает установку соединения.
  8. Клиент устанавливает соединение.
  9. Клиент задает команды серверу (с управляющего порта на порт 21, в примере — с порта 1036 на порт 21), после чего возможна передача данных.

Пассивный режим FTP

Главное отличие между активным режимом FTP и пассивным режимом FTP – это сторона, которая открывает соединение для передачи данных. В активном режиме, клиент должен принять соединение от FTP-сервера. В пассивном режиме, клиент всегда инициирует соединение сам.

image_pdfimage_print

Состояние сокетов

ESTABLISHED – сокет с установленным соединением
SYN_SENT        – сокет в процессе установки соединения
SYN_RECV        – был принят запрос установки соединения из сети
FIN_WAIT1       – сокет закрыт и соединение закрывается
FIN_WAIT2       – сокет закрыт и ждет закрытия соединения с удаленного хоста
TIME_WAIT      – сокет после своего закрытия, еще какое-то время принимает пакеты из сети
CLOSED        – сокет не используется
CLOSE_WAIT    – удаленный хост отключился, ожидаем закрытие сокета
LAST_ACK          – удаленный хост отключился и сокет закрыт. Ожидание подтверждения
LISTEN                – сокет ожидает входящие подключения
CLOSING             – оба сокета отключились, но еще не все наши данные отправлены
UNKNOWN         – статус сокета неизвестен

image_pdfimage_print

RRDTool

RRDtool — это небольшая утилита, которая замечательно делает три вещи:

  1. Создаёт циклические базы данных (Round-Robin Databases, RRDs),
  2. записывает в них данные,
  3. и создаёт графики на основе того, что туда записала.

RRD (Round-Robin Databases) это такая специальная база данных, которая, начиная с какого-то момента, записывает новые значения поверх старых. Например, если базе полагается хранить 7 дней данных, то восьмой день запишется поверх первого, девятый — поверх второго, и так далее.

rrdtool create cpu.rrd \ 
      --step 10 \ 
      DS:cpu:GAUGE:20:0:100 \
      RRA:AVERAGE:0.5:6:120

Первая строка — создаём БД по имени cpu.rrd. В нашем случае это циклическая база данных для хранения метрик процессора. Следующий параметр — step10  — задаёт, как часто мы будем записывать новую порцию данных. В данном случае — раз в 10 секунд. Если данные придут раньше или позже, rrdtool интерполирует значения и выровняет их по десятисекундным границам. Последние две строки описывают источник данных и архив, в котором они будут храниться.

Источник данных (Data source, DS)

DS параметр описывает источник данных. То, что он есть, еще совсем не значит, что данные будут сохранены — для этого нужны архивы. И в одной базе может быть несколько источников данных.

Наш параметр —  DS:cpu:GAUGE:20:0:100 — буквально значит следующее:

  1. Создай источник данных (DS)
  2. под названием cpu
  3. и с типом GAUGE.
  4. Если в течение 20 секунд (heartbeat interval) новых данных не поступает — сохраняем UNDEFINED.
  5. Значения варьируются между 0
  6. и 100.

Тип GAUGE говорит rrdtool интерпретировать входящие значения «как есть». Есть еще типы COUNTER, DERIVE и ABSOLUTE, для которых rrdtool сохраняла бы не значение, а скорость, с которой они меняются (берем текущее значение, вычитаем предыдущее, делим на step ). С шагом   step , heartbeat-параметром и встроенной интерполяцией раз в 10 секунд в базе будет появляться новое значение, нравится нам это, или нет. Это значение называются первичной точкой данных (Primary Data Point, PDP)

Циклический архив (Round-robin archive, RRA)

RRA — это агрегированное временное окно с данными. Как и в случае с DS, в базе их может быть несколько. Наш единственный архив  RRA:AVERAGE:0.5:6:120  расшифровывается так:

  1. Создай циклический архив (RRA)
  2. длиной в 120 элементов,
  3. каждый из которых это среднее (AVERAGE)
  4. от 6-ти первичных точек данных.
  5. Если больше половины (>0.5) значений в шестерке — UNDEFINED, в архив так же идёт UNDEFINED.

В итоге получится архив, который будет хранить поминутные (10 секунд * 6) средние значения загрузки CPU за последние два часа (10 секунд  * 6 * 120). Один элемент архива называется консолидированной точкой данных (Consolidated Data Point, CDP), а AVERAGE — консолидирующей функцией (Consolidation Function, CF). Первичные и консолидированные точки связаны между собой вот так:

  • CDP1 = CF(PDP1, PDP2, …, PDPn)
  • CDP2 = CF(PDPn+1, …, PDP2n)
  • и т. д.

Кроме AVERAGE есть и другие консолидирующие функции: MIN, MAX, и LAST.

Добавляем данные в RRD

Добавление новых данных в циклическую базу тоже идёт через rrdtool. Так как время влияет на то, как и куда будут сохраняться значения, его нужно передавать вместе с ними. Например, можно добавить значение с меткой «сейчас»:

rrdtool update cpu.rrd N:51 # Now:51%

или с количеством секунд «назад»:

Кроме цифровых значений в базу можно сохранить ‘U’ — UNDEFINED.

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

Создание графиков из RRD

rrdtool умеет не только хранить данные, но и рисовать. Команда для создания графиков может принимать на вход миллион параметров, но для демки хватит всего нескольких основных.

rrdtool graph cpu.png \ # Create graph cpu.png
     -s 'end-30m' \ # for data range starting 30mins ago
     -e 'now' \ # and until now
     -w '700' -h '350' \ # width/height: 700/350 
     -u 40 \ # y-axe upper bound: 40
     -t 'cpu-0' \ # title 'cpu-0'
     -v 'Jiffies' # vertical title: 'Jiffies'
     'DEF:user_avg=cpu-user.rrd:value:AVERAGE' \ # import from cpu-user.rrd
     'CDEF:user_clean=user_avg,UN,0,user_avg,IF' \ # replace UNDEFINED with 0
     'DEF:system_avg=cpu-system.rrd:value:AVERAGE' \ # import from cpu-system.rrd
     'CDEF:system_clean=system_avg,UN,0,system_avg,IF' \ # replace UNDEFINED with 0
     'CDEF:user_stack=system_clean,user_clean,+' \ # calculate new 'user' series built on top of 'system'
     'AREA:user_clean#FFF000:user' \ # Draw yellow area for 'user_clean' definition with 'user' legend
     'AREA:system_clean#FF0000:system' \ # Draw red area for 'system_clean' definition with 'system legend
     'LINE1:user_clean#FF0000' # Draw thin red line on top of 'user_clean' area

Первая половина аргументов достаточно понятна: задать заголовок, размеры изображения, и т. п.  Вторая половина, которая, собственно, и отвечает за отрисовку, выглядит более загадочно.

DEF (Definition), по сути, это объявление переменной, а строка целиком —  ‘DEF:user_avg=cpu-user.rrd:value:AVERAGE’ — означает: «начиная с этого момента под user_avg имеется ввиду циклический архив со средними для DS с именем value,что в cpu-user.rrd’. Так как в cpu-user.rrd может быть больше чем один архив, rrdtool выберет тот, который по временному диапазону больше подходит к данному графику.

CDEF (Calculated Definition), с другой стороны, это тоже объявление, но вычисляемое. Его значение — математическое или логическое выражение в обратной польской записи, через которое обычно пропускают ряд с данными. В нашем примере таких три. При помощи первых двух, вроде   user_clean=user_avg,UN,0,user_avg,IF , мы объявляем user_clean и system_clean, которым присваиваем значения из user_avg и system_avg, но нулями вместо UNDEFINED. Третье выражение —user_stack=system_clean,user_clean,+ — вводит новый ряд, который суммирует user_clean и system_clean, чтобы получить общую загрузку

Наконец, AREA и LINE1 отвечают за саму отрисовку. На вход им подаётся переменная с данными, цвет, и, опционально, имя для легенды. Есть еще LINE2 и LINE3, которые отличаются только толщиной линии.

 

Краткое введение в rrdtool

https://ru.wikibooks.org/wiki/RRDtool

https://www.ylsoftware.com/news/644

 

image_pdfimage_print

Ttaffic Control для небольшой сети

Очереди

Существуют несколько видов очередей, соответствующих моделям из теории массового обслуживания и телетрафика:

CBQ (Class-Based Queueing) – Очередь, основанная на классах. Позволяет создавать иерархию классов с приоритетами. Управление производится в зависимости от общей пропускной способности и загруженности канала.

HTB (Hierarchical Token Bucket) – Алгоритм дырявого ведра. Позволяет ограничивать пропускную способность независимо от общей пропускной способности канала. Поддерживает приоритеты.

PRIO – очередь, не влияющая на пропускную способность. Пакеты более низких приоритетов уходят на сетевую карту только при отсутствии в очереди пакетов полее высоких приоритетов.

Ещё есть несколько бесклассовых видов очередей:

[P|B]FIFO – First In, First Out с ограничением в пакетах или байтах.

RED (Random Early Detection) – имитирует физические заторы, отбрасывая пакеты при приближении к выделенной полосе пропускания.

SFQ (Stochastic Fairness Queueing) – равномерное распределение пакетов из разных сессий внутри очереди. Трафик разбивается на большое количество FIFO очередей, которые получают доступ к сетевой карте в режиме round-robin. Параметры: perturb – время, через которое будет меняться алгоритм распределения пакетов (обычно ставят 10 с), quantum – объем данных, выпускааемых из потока за один раз (по умолчанию MTU).

TBF (Token Bucket Filter) – замедляет трафик по точно заданному лимиту. Параметры следующие: rate – нужная скорость, latency – максимальное время в очереди, burst – размер “ведра” в байтах.

Если подвести итог, то TBF хорошо подходит, если надо замедлить весь исходящий трафик от узла на конкретном интерфейсе, а HTB – для построения иерархии классов и шейпинга трафика в соответствии с этой иерархией. При этом CBQ требует учитывания ряда дополнительных параметров, которые придётся для каждого конкретного случая получать эмпирическим путём, поэтому используется редко.

**************

Определим корневую дисциплину для конкретного сетевого интерфейса и набор классов-наследников:

1.tc qdisc add dev eth0 root handle 1:  htb default 3
2.tc class add dev eth0 parent 1: classid 1:1 htb rate 64kbit
3.tc class add dev eth0 parent 1: classid 1:2 htb rate 4mbit burst 15k
4.tc class add dev eth0 parent 1: classid 1:3 htb rate 4mbit ceil 100mbit

Здесь мы создали корневой qdisc с идентификатором 1: , дисциплиной обслуживания HTB, сетевым интерфейсом eth0 и классом по умолчанию 1:3. И для него 3 класса: один с постоянной полосой 64kbit, второй с постоянной полосой 4mbit и максимальным объемом данных, который может быть передан через сетевую карту без переключения на другие классы, 15k, и, наконец, третий с гарантированной скоростью 4mbit и выше.

Для каждого класса при необходимости можно прописать отдельную дисциплину, например:

1.tc qdisc add dev eth0 parent 1:1 red min 1600 max 3210 burst 2 limit 32100 avpkt 1000
2.tc qdisc add dev eth0 parent 1:2  sfq perturb 10

После создания иерархии классов и набора дисциплин нам останется только распределить трафик по классам. Сделать это можно несколькими способами.

Способ первый – tc filter. В зависимости от некоторых условий направляем пакеты в класс 1:1

# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.1 flowid 1:1

В данном случае это пакеты, получателем у которых указан ip 192.168.0.1.

Способ второй – пометка пакетов с помощью iptables

#iptables -A OUTPUT -t mangle -p tcp  -d 192.168.0.2 –dport 80 -j MARK —set-mark 20
# tc filter add dev eth0 protocol ip parent 1: prio 2 handle 20 fw classid 1:2

Способ третий – установка класса сразу с помощью iptables

# iptables -t mangle -A POSTROUTING -p tcp -d 192.168.0.3 -j CLASSIFY —set-class 1:3

Пример 1

Задачу по ограничению исходящего трафика в направлении определенного хоста можно выполнить, например, следующими тремя командами:

#tc qdisc add dev eth0 root handle 1:  htb default 1
#tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
#iptables -t mangle -A POSTROUTING -p tcp -d 192.168.0.3 -j CLASSIFY  --set-class 1:1

Проверить маркировку пакетов в iptables:

# iptables -L -n -v -t mangle

Удалить все правила:

# tc qdisc del dev eth0 root
# iptables -t mangle -F

Проверить дисциплину:

# tc qdisc
qdisc noqueue 0: dev lo root refcnt 2
qdisc pfifo_fast 0: dev enp0s3 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: dev enp0s8 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

Проверить классы:

# tc -d -s qdisc show dev enp0s8
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 1028 bytes 14 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

После выполнения скрипта, картина меняется:

# tc qdisc
qdisc noqueue 0: dev lo root refcnt 2
qdisc pfifo_fast 0: dev enp0s3 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc htb 1: dev enp0s8 root refcnt 2 r2q 10 default 6 direct_packets_stat 0 direct_qlen 1000
# tc -d -s class show dev enp0s8
class htb 1:1 root rate 2Mbit ceil 2Mbit linklayer ethernet burst 1600b/1 mpu 0b cburst 1600b/1 mpu 0b level 7
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 100000 ctokens: 100000

class htb 1:5 parent 1:1 prio 0 quantum 12500 rate 1Mbit ceil 1500Kbit linklayer ethernet burst 1600b/1 mpu 0b cburst 1599b/1 mpu 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 200000 ctokens: 133328

class htb 1:6 parent 1:1 prio 0 quantum 6250 rate 500Kbit ceil 1500Kbit linklayer ethernet burst 1600b/1 mpu 0b cburst 1599b/1 mpu 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 400000 ctokens: 133328

class htb 1:7 parent 1:1 prio 0 quantum 2500 rate 200Kbit ceil 1Mbit linklayer ethernet burst 1600b/1 mpu 0b cburst 1600b/1 mpu 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 1000000 ctokens: 200000

 

Проверить статус:

# tc -s -d qdisc show dev eth0

 

image_pdfimage_print