6 Как выдать конкретный адрес абоненту с NAT 1:1?

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

белый_адрес_абонента & mask = серый_адрес_абонента & mask

где mask зависит от числа рабочих потоков:

при 4 рабочих потоках mask=3 (типично для СКАТ >= 10)

при 2 рабочих потоках mask=1 (типично для СКАТ <= 6)

Фактически для младших версий СКАТ абонентам с четными серыми адресами нужно выдавать четные белые адреса, а нечетными — нечетные. Достаточно учитывать только младший байт NNN в IP адресе XXX.YYY.ZZZ.NNN

Соответственно для старших версий нужно учитывать равенство 2 младших бит IP адреса.

При одном рабочем потоке зависимость между адресами исчезает.

Точное значение маски можно посмотреть в логе DPI:

grep nat_hash_mask /var/log/dpi/fastdpi_alert.log

Если старт был давно, то выполнить reload

service fastdpi reload

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

Пример для СКАТ-20: абоненту с серым адресом 10.0.0.15 требуется выдать белый адрес 188.99.99.27
маска=3
15&3=3 равно 27&3=3 - это значит, такой адрес выдать можно (в противном случае пришлось бы поменять или выдаваемый абоненту серый адрес, или назначаемый ему белый)

Назначаем адрес абоненту командой:

fdpi_ctrl load profile --ip 10.0.0.15 --service 11 --profile.json '{ "nat_ip_pool" : "188.99.99.27/32", "nat_type" : 1 }'