Это старая версия документа!
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
Пример для СКАТ-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 }'