среда, 22 января 2025 г.

Реализация привязки аккаунта к IP-адресу с помощью модуля permissions в OpenSIPS

Проверка привязки делается по двум группам в таблице address модуля permissions. Сначала в одной группе ищется совпадение username из реквизитов аутентификации по сети 0.0.0.0/0 (т.е. по всем адресам), затем в другой группе ищется совпадение IP/username. Если совпадает, то запрос обрабатывается обычным образом.

На примере запроса REGISTER. Аккаунту 4521 разрешено подключаться только с IP 10.49.2.78.


Сначала ищем в группе 1000 паттерн 4521, чтобы убедиться, что для этого аккаунта есть привязка, потом в группе 2000 ищем разрешенный IP. 


Для поиска используем auth username.

if (is_method("REGISTER")) {

    # Проверяем аутентификационные данные

    if (www_authorize("", "subscriber")) {

        # Если данные верны, то ищем username ($au) в группе 1000 раздела my_part

        if (check_source_address(1000,$avp(ctx),$au,"my_part")) {

            # Если нашелся, то ищем в группе 2000 совпадение с IP источника запроса

            if (!check_source_address(2000,$avp(ctx),$au,"my_part")) {

                # Если совпадения не нашлось, то блокируем запрос

                xlog("Wrong IP: $si:$sp with login $au, $avp(ctx) (callid: $ci)\n");

                send_reply(403, "Wrong IP");

                exit();

            }

        }

    # Если совпадение есть, то IP валиден, и мы продолжаем обычную обработку

    save("location");

    exit();

    }

}

Для INVITE схема аналогичная.


Комментариев нет:

Отправить комментарий