Содержание

Создание HTB, TBF полисера через JSON

В данной статье приведено описание создания HTB и TBF полисеров. Назначение полисеров на абонентов описано в разделе: Управление полисингом (тарифным планом). Именованные профили полисинга.
Для решения задач автоматизации более удобным может оказаться просмотр и задание настроек полисинга в формате JSON.

Первый вариант

Вывод настроек полисинга тарифного плана TEST в формате json:

Создание полисера через JSON

Профиль полисинга (тарифный план) можно задать не только файлом с разметкой, но и в формате JSON. Это удобно для автоматизации: JSON проще формировать из скриптов и биллинга, а текущие настройки профиля можно выгрузить в том же формате.

Чем именованный профиль отличается от анонимного и как назначить профиль абоненту, описано в разделе Управление полисингом (тарифным планом). Именованные профили полисинга.

JSON передаётся в команду одним аргументом в одинарных кавычках. Переносы строк внутри кавычек допустимы, поэтому ниже примеры показаны в многострочном виде. Длинный JSON удобнее хранить в файле и подставлять так: --profile.json "$(cat tariff.json)".

Поддерживаются два формата:

Формат Параметр загрузки Параметр вывода Особенность
json --profile.json --outformat json Скорость задаётся одной строкой со значением и единицей: "20mbit"
json2 --profile.json2 --outformat=json2 Значение и единица измерения задаются отдельными ключами: "rate_value": "20", "rate_unit": "mbps"

Параметры

Параметр Описание
type Механизм полисинга: HTB или TBF
outbound, inbound Настройки для исходящего и входящего трафика
root_rate Общая полоса тарифа (корневой класс HTB), в рамках которой классы заимствуют полосу друг у друга
root_ceil Максимальная полоса корневого класса
root_burst, root_cburst Размер всплеска для root_rate и root_ceil. Если не заданы, вычисляются автоматически
classes Список классов трафика (0–7)
class Номер класса трафика
rate Для HTB — гарантированная (минимальная) полоса класса. Для TBF — ограничение полосы класса
ceil Только HTB: максимальная полоса, которую класс может занять, заимствуя свободную полосу корневого класса
burst, cburst Размер всплеска для rate и ceil. Если не заданы, вычисляются автоматически
Для HTB необходимо описать все 8 классов. Сумма rate по классам должна быть меньше root_rate.

Формат json

Просмотр профиля

fdpi_ctrl list profile --policing --profile.name TEST --outformat json

HTB: сокращённая запись

Параметры burst и cburst вычисляются автоматически. В примере тариф 20 Мбит/с, все классы могут занимать всю полосу тарифа:

fdpi_ctrl load profile --policing --profile.name TEST --profile.json '{
  "type": "HTB",
  "outbound": {
    "root_rate": "20mbit",
    "root_ceil": "20mbit",
    "classes": [
      {"class": 0, "rate": "8bit", "ceil": "20mbit"},
      {"class": 1, "rate": "8bit", "ceil": "20mbit"},
      {"class": 2, "rate": "8bit", "ceil": "20mbit"},
      {"class": 3, "rate": "8bit", "ceil": "20mbit"},
      {"class": 4, "rate": "8bit", "ceil": "20mbit"},
      {"class": 5, "rate": "8bit", "ceil": "20mbit"},
      {"class": 6, "rate": "8bit", "ceil": "20mbit"},
      {"class": 7, "rate": "8bit", "ceil": "20mbit"}
    ]
  },
  "inbound": {
    "root_rate": "20mbit",
    "root_ceil": "20mbit",
    "classes": [
      {"class": 0, "rate": "8bit", "ceil": "20mbit"},
      {"class": 1, "rate": "8bit", "ceil": "20mbit"},
      {"class": 2, "rate": "8bit", "ceil": "20mbit"},
      {"class": 3, "rate": "8bit", "ceil": "20mbit"},
      {"class": 4, "rate": "8bit", "ceil": "20mbit"},
      {"class": 5, "rate": "8bit", "ceil": "20mbit"},
      {"class": 6, "rate": "8bit", "ceil": "20mbit"},
      {"class": 7, "rate": "8bit", "ceil": "20mbit"}
    ]
  }
}'

HTB: полная запись

Параметры burst и cburst задаются явно:

fdpi_ctrl load profile --policing --profile.name TEST --profile.json '{
  "type": "HTB",
  "outbound": {
    "root_rate": "20mbit",
    "root_ceil": "20mbit",
    "root_burst": "10mbit",
    "root_cburst": "10mbit",
    "classes": [
      {"class": 0, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 1, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 2, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 3, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 4, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 5, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 6, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 7, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"}
    ]
  },
  "inbound": {
    "root_rate": "20mbit",
    "root_ceil": "20mbit",
    "root_burst": "10mbit",
    "root_cburst": "10mbit",
    "classes": [
      {"class": 0, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 1, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 2, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 3, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 4, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 5, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 6, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"},
      {"class": 7, "rate": "8bit", "ceil": "20mbit", "burst": "8bit", "cburst": "10mbit"}
    ]
  }
}'

TBF

Ограничение 2 Мбит/с только для класса 1 (cs1). Остальные классы описываются по аналогии.

Анонимный профиль на IPv4-адрес:

fdpi_ctrl load --policing --profile.json '{
  "type": "TBF",
  "outbound": {
    "classes": [
      {"class": 1, "rate": "2mbit"}
    ]
  },
  "inbound": {
    "classes": [
      {"class": 1, "rate": "2mbit"}
    ]
  }
}' --ip 192.168.0.10

Анонимный профиль на login, связанный с IPv4-адресом:

fdpi_ctrl load --bind --user test_ipv4:192.168.0.10
fdpi_ctrl load --policing --profile.json '{
  "type": "TBF",
  "outbound": {
    "classes": [
      {"class": 1, "rate": "2mbit"}
    ]
  },
  "inbound": {
    "classes": [
      {"class": 1, "rate": "2mbit"}
    ]
  }
}' --login test_ipv4

Анонимный профиль на login, связанный с IPv6-подсетью:

fdpi_ctrl load --bind --user test_ipv6:2001:470:e5bf:dead::0/64
fdpi_ctrl load --policing --profile.json '{
  "type": "TBF",
  "outbound": {
    "classes": [
      {"class": 1, "rate": "2mbit"}
    ]
  },
  "inbound": {
    "classes": [
      {"class": 1, "rate": "2mbit"}
    ]
  }
}' --login test_ipv6

Связывание IP с login описано в разделе Связывание IP-login (bind, bind_multi).

Формат json2

В формате json2 значение и единица измерения задаются отдельными ключами (например, root_rate_value и root_rate_unit). Это удобно, когда значения формируются программно и не нужно собирать строку вида "20mbit".

Просмотр профиля

fdpi_ctrl list profile --policing --profile.name TEST2 --outformat=json2

HTB: загрузка профиля

Тариф 100 Мбит/с с явно заданными burst и cburst:

fdpi_ctrl load profile --policing --profile.name TEST2 --profile.json2 '{
  "type": "HTB",
  "outbound": {
    "root_rate_value": "100",
    "root_rate_unit": "mbps",
    "root_ceil_value": "100",
    "root_ceil_unit": "mbps",
    "root_burst_value": "50",
    "root_burst_unit": "mbit",
    "root_cburst_value": "50",
    "root_cburst_unit": "mbit",
    "classes": [
      {"class": 0, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 1, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 2, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 3, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 4, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 5, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 6, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 7, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"}
    ]
  },
  "inbound": {
    "bw_rate_value": "0",
    "bw_rate_unit": "bps",
    "bw_ceil_value": "0",
    "bw_ceil_unit": "bps",
    "root_rate_value": "100",
    "root_rate_unit": "mbps",
    "root_ceil_value": "100",
    "root_ceil_unit": "mbps",
    "root_burst_value": "50",
    "root_burst_unit": "mbit",
    "root_cburst_value": "50",
    "root_cburst_unit": "mbit",
    "classes": [
      {"class": 0, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 1, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 2, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 3, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 4, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 5, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 6, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"},
      {"class": 7, "rate_value": "8", "rate_unit": "bps", "ceil_value": "100", "ceil_unit": "mbps", "burst_value": "8", "burst_unit": "bit", "cburst_value": "50", "cburst_unit": "mbit"}
    ]
  }
}'
fdpi_ctrl list profile --policing --profile.name TEST --outformat json

Загрузка настроек полисера (тарифного плана) в формате json:

Сокращенный формат создания HTB полисера (burst, cburst вычисляются автоматически):

fdpi_ctrl load profile --policing --profile.name TEST --profile.json '{ "type":"HTB", "outbound":{ "root_rate":"20mbit","root_ceil":"20mbit", "classes" : [ {"class":0, "rate":"8bit", "ceil":"20mbit"},{"class":1, "rate":"8bit", "ceil":"20mbit"},{"class":2, "rate":"8bit", "ceil":"20mbit"},{"class":3, "rate":"8bit", "ceil":"20mbit"},{"class":4, "rate":"8bit", "ceil":"20mbit"},{"class":5, "rate":"8bit", "ceil":"20mbit"},{"class":6, "rate":"8bit", "ceil":"20mbit"},{"class":7, "rate":"8bit", "ceil":"20mbit"} ]}, "inbound":{ "root_rate":"20mbit","root_ceil":"20mbit", "classes" : [ {"class":0, "rate":"8bit", "ceil":"20mbit"},{"class":1, "rate":"8bit", "ceil":"20mbit"},{"class":2, "rate":"8bit", "ceil":"20mbit"},{"class":3, "rate":"8bit", "ceil":"20mbit"},{"class":4, "rate":"8bit", "ceil":"20mbit"},{"class":5, "rate":"8bit", "ceil":"20mbit"},{"class":6, "rate":"8bit", "ceil":"20mbit"},{"class":7, "rate":"8bit", "ceil":"20mbit"} ]}}' 

Полный формат создания HTB полисера (burst, cburst явно задаются):

fdpi_ctrl load profile --policing --profile.name TEST --profile.json '{ "type":"HTB", "outbound":{  "root_rate":"20mbit","root_ceil":"20mbit","root_burst":"10mbit","root_cburst":"10mbit" , "classes" : [ {"class":0, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":1, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":2, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":3, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":4, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":5, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":6, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":7, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" } ]}, "inbound":{ "root_rate":"20mbit","root_ceil":"20mbit","root_burst":"10mbit","root_cburst":"10mbit" , "classes" : [ {"class":0, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":1, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":2, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":3, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":4, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":5, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":6, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" },{"class":7, "rate":"8bit", "ceil":"20mbit","burst":"8bit","cburst":"10mbit" } ]}}'

Пример назначения TBF полисера 2mbps на IPv4 только на cs1 (остальные классы можно описать по аналогии). Анонимный полисер назначается на IPv4.

fdpi_ctrl load  --policing  --profile.json  '{ "type":"TBF", "outbound":{"classes" : [ {"class":1, "rate":"2mbit"}]}, "inbound":{"classes" : [ {"class":1, "rate":"2mbit"}]}}' --ip 192.168.0.10 

Пример назначения TBF полисера 2mbps на IPv4 только на cs1 (остальные классы можно описать по аналогии). Создается bind IP-login и Анонимный Полисер назначается на login.

fdpi_ctrl load --bind --user test_ipv4:192.168.0.10 && fdpi_ctrl load  --policing  --profile.json  '{ "type":"TBF", "outbound":{"classes" : [ {"class":1, "rate":"2mbit"}]}, "inbound":{"classes" : [ {"class":1, "rate":"2mbit"}]}}' --login test_ipv4 

Пример назначения TBF полисера 2mbps на IPv6 только на cs1 (остальные классы можно описать по аналогии). Создается bind IP-login и Анонимный Полисер назначается на login.

fdpi_ctrl load --bind --user test_ipv6:2001:470:e5bf:dead::0/64 && fdpi_ctrl load  --policing  --profile.json  '{ "type":"TBF", "outbound":{"classes" : [ {"class":1, "rate":"2mbit"}]}, "inbound":{"classes" : [ {"class":1, "rate":"2mbit"}]}}' --login test_ipv6 

Второй вариант

Формат json2 содержит более подробные настройки значений — здесь разделены единицы измерения и значения скорости по отдельным ключам

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

fdpi_ctrl list profile --policing --profile.name TEST2 --outformat=json2

Загрузка настроек полисинга тарифного плана TEST в формате json2:

fdpi_ctrl load profile --policing --profile.name TEST2 --profile.json2 '{ "type":"HTB", "outbound":{  "root_rate_value":"100","root_rate_unit":"mbps","root_ceil_value":"100","root_ceil_unit":"mbps","root_burst_value":"50","root_burst_unit":"mbit","root_cburst_value":"50" ,"root_cburst_unit":"mbit" , "classes" : [ {"class":0, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":1, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":2, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":3, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":4, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":5, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":6, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":7, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" } ]}, "inbound":{ "bw_rate_value":"0" , "bw_rate_unit":"bps" , "bw_ceil_value":"0" , "bw_ceil_unit":"bps" , "root_rate_value":"100","root_rate_unit":"mbps","root_ceil_value":"100","root_ceil_unit":"mbps","root_burst_value":"50","root_burst_unit":"mbit","root_cburst_value":"50" ,"root_cburst_unit":"mbit" , "classes" : [ {"class":0, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":1, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":2, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":3, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":4, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":5, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":6, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" },{"class":7, "rate_value":"8", "rate_unit":"bps", "ceil_value":"100", "ceil_unit":"mbps", "burst_value":"8", "burst_unit":"bit", "cburst_value":"50", "cburst_unit":"mbit" } ]}}'