Kamailio и NAT

Kamailio/OpenSIPS и другие производные от SER.

Модераторы: Admins, Модераторы

Ответить
tma
Сообщения: 361
Зарегистрирован: 11 июл 2005, 17:52
Контактная информация:

Kamailio и NAT

Сообщение tma » 26 фев 2009, 12:43

Добрый день!

Стоит Kamailio в сети с IP RFC1918.
Есть пользователи, у которых за роутерами также используются эти же сети.
Проблему с маршрутизацией как-то они решают, моя задача объяснить Kamailio, что данные пользователи стоят за NAT.
Я решил проверять только сеть 172.16, с остальными сетями пользователи сами пусть мудохаются.
Пытался сделать так:

Код: Выделить всё

route[2]{
        force_rport();
        if (nat_uac_test("18")) {
                if (method=="REGISTER") {
                        fix_nated_register();
                } else {
                        fix_nated_contact();
                };
                setflag(5);
        }
        # Contact:: sip:22222@172.16.0.2:5061 Q=0
        else if search('Contact:.*sip:[0-9].+@172\.16\..+') {
                xlog("L_INFO","Fix NAT user with src_ip=$src_ip\n");
                if (method=="REGISTER")
                {
                        nat_keepalive();
                        $avp(s:received_uri) = $source_uri;
                        fix_nated_register();
                } else {
                        $avp(s:received_uri) = $source_uri;
                        fix_nated_contact();
                }
                setflag(5);
        }
Но видимо не правильно search пишу, т.к. проверка не срабатывает.

Отсюда два вопроса:
1. Как правильно написать search
2. Какой еще способ подскажете?

P.S. Kamailio version: 1.4.3
Maksim Timofejev

simax
Сообщения: 35
Зарегистрирован: 19 май 2008, 04:45

Сообщение simax » 26 фев 2009, 16:31

Я делаю так - проверяю если IP и/или порт из верхнего Via хидера не равно IP и/или порту с которого пришел запрос тогда считаю что запрос пришел из-за NATа:


....
#
# If (received.ip != topmost_via.ip) ||
# (received.port != topmost_via.port)
#
if(nat_uac_test("18")) {
xlog("L_INFO", "Request is behind NAT");
....
}
....

tma
Сообщения: 361
Зарегистрирован: 11 июл 2005, 17:52
Контактная информация:

Сообщение tma » 27 фев 2009, 12:17

Это производится этим кодом?
Попробую, спасибо.

Код: Выделить всё

# If (received.ip != topmost_via.ip) ||
# (received.port != topmost_via.port)
Код

Код: Выделить всё

if(nat_uac_test("18"))
я уже использую, но не во всех случаях это подходит.
Maksim Timofejev

simax
Сообщения: 35
Зарегистрирован: 19 май 2008, 04:45

Сообщение simax » 27 фев 2009, 20:32

tma писал(а): Код

Код: Выделить всё

if(nat_uac_test("18"))
я уже использую, но не во всех случаях это подходит.
И в каких неработает?

tma
Сообщения: 361
Зарегистрирован: 11 июл 2005, 17:52
Контактная информация:

Сообщение tma » 28 фев 2009, 11:17

Пока это неподтвержденное мнение.
Лично у меня все работает, только два телефона за одним NAT'ом не работают. Не разбирался еще (есть идеи?).
А вот пользователи жаловались, но они всегда жалуются и чаще всего не по делу, так что возможно я и не прав.
Maksim Timofejev

simax
Сообщения: 35
Зарегистрирован: 19 май 2008, 04:45

Сообщение simax » 02 мар 2009, 12:24

Идей много - уже искурил огромное количество проблем с NATом - плюс проблем с sip-enabled NATами которые меняют в SIP запросах IP и порты на внешние и наоборот какбы маскируя внутреннюю сеть. В большинстве случаев они или работают неверно или тупо забывают про rport или про contact из-за неверных настроек.
Только вот по куску конфига и отсутствию логов проблемных звонков врятли можно генерировать правильные идеи...

tma
Сообщения: 361
Зарегистрирован: 11 июл 2005, 17:52
Контактная информация:

Сообщение tma » 02 мар 2009, 13:06

simax писал(а):Только вот по куску конфига и отсутствию логов проблемных звонков врятли можно генерировать правильные идеи...
Как только будут -- выложу.
Пока я столкнулся с проблемами, описанными в соседних топиках:
1. Kamailio падает при использовании БД. Причем пока не смог выявить в какой момент, хотя есть варианты.
2. Преобразование номера в e164 для биллинга (авторизация через radius).
Maksim Timofejev

Ответить