Проверка привязки делается по двум группам в таблице 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 схема аналогичная.
Комментариев нет:
Отправить комментарий