воскресенье, 30 марта 2025 г.

Прописание маршрута с указанием IP source в Linux

Если Linux машина имеет несколько IP интерфейсов, то создавать статический маршрут правильно с привязкой к определенному исходному IP-адресу (src)
Если используется NetworkManager, то делается это утилитой nmcli.

1. Необходимо узнать имена интерфейсов и принадлежность IP адреса интерфейсу.
Это делается командами:
1.1.
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 172.31.0.3/28 brd 172.31.0.15 scope global noprefixroute ens18
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.63.70.170/29 brd 10.63.70.175 scope global noprefixroute ens19

1.2
# nmcli con
NAME    UUID                                  TYPE      DEVICE
ens18  95fdeba9-6dcc-31d1-9758-879d140cbc55  ethernet  ens18
System ens19          03c4dac8-78f9-36c3-8580-d35a45e6f2ea  ethernet  ens19

Команда "ip a" покажет IP адреса и их привязку к коротким названиям интерфейсов.
Команда "nmcli con" покажет привязку коротких названий интерфейсов к полному наименованию.
В данном примере интерфейс "ens19" имеет полное имя "System ens19".
2. Прописать маршрут с заданием IP адреса источника нужно с указанием полного наименования интерфейса, вот так:
# nmcli connection modify "System ens19" +ipv4.routes "10.63.90.1/32 10.63.70.169 src=10.63.70.170"
# nmcli connection up "System ens19"

Тут прописывается маршрут на сеть 10.63.90.1/32 через gateway 10.63.70.169 c IP источника 10.63.70.170
3. Команда удаления маршрута (если потребуется):
# nmcli connection modify "System ens19" ipv4.routes ""

Модули mod_xml_curl, mod_httapi и mod_xml_rpc FREESWITCH

Модуль mod_xml_curl
Этот модуль используется для динамической генерации XML-конфигураций FreeSWITCH через внешний HTTP-сервер.
Загрузка выполняется при старте freeswitch и при выполнении команды reloadxml.
Freeswitch отправялет запрос о том, какую секцию загрузить, например directory или dialplan. В отввет ожидается XML документ куска конфигурации.
По умолчанию модуль не включен в конфигурацию Freeswitch. Проверка:
# fs_cli -x "module_exists mod_xml_curl"
Команда должна вывести "false"
Для установки модуля сначало необходимо его скомпилировать. Заходим в директорию с исходными кодами freeswitch, проводим сборку и установку.
# cd /usr/src/freeswitch
# cd src/mod/xml_int/mod_xml_curl
# make install

Проверка установки модуля:
# ls -l /usr/lib64/freeswitch/mod/ | grep curl
Теперь модуль нужно минимально сконфигурить. Открываем конфигурационный файл:
# nano /etc/freeswitch/autoload_configs/xml_curl.conf.xml
Для проерки достаточно прописать один параметр, определяющий URL, откуда сервер Freeswitch будет подтягивать конфигурацию.
Это параметр gateway-url:
    <binding name="example">
        <param name="gateway-url" value="http://127.0.0.1:8081/fsapi" bindings="dialplan|configuration|directory|phrases"/>
...
</binding>
Теперь проверяем загрузку модуля:
# fs_cli
> load mod_xml_curl

Ответ должен быть "+OK"
Для включения модуля в конфигурацию открываем файл загружаемых модулей:
# nano /etc/freeswitch/autoload_configs/modules.conf.xml
Раскомментируем строчку
<load module="mod_xml_curl"/>

Модуль mod_httapi.
Модуль позволяет интегрировать FreeSWITCH с внешними HTTP-сервисами для обработки вызовов через API.
Запрос на внешний сервер может отправляться при каждом вызове. Freeswitch отправляет на внешний HTTP сервер запрос содержащий, например переменные:
caller_id_number (Номер звонящего), destination_number (Набранный номер).
В ответ Freeswitch должен получить набор инструкций, описывающий обработку вызова. Или набор переменных, которые используются для обработки вызова в диалплане.
По умолчанию модуль включен в конфигурацию Freeswitch. Проверка:
# fs_cli -x "module_exists mod_httapi"
Команда должна вывести "true"
Файл настроек модуля:
# nano /etc/freeswitch/autoload_configs/httapi.conf.xml

Модуль mod_xml_rpc.
Модуль mod_xml_rpc в FreeSWITCH позволяет использовать XML-RPC интерфейс для управления сервером через внешние приложения.
По умолчанию модуль не включен в конфигурацию Freeswitch. Проверка:
# fs_cli -x "module_exists mod_xml_rpc"
Команда должна вывести "false"
Для установки модуля сначала необходимо его скомпилировать. Заходим в директорию с исходными кодами freeswitch, проводим сборку и установку.
# cd /usr/src/freeswitch
# cd src/mod/xml_int/mod_xml_rpc
# make install

Проверка установки:
# ls -l /usr/lib64/freeswitch/mod/ | grep mod_xml_rpc
# fs_cli
> load mod_xml_rpc

Отет должен быть "+OK"
Включаем модуль в загрузку при старте Freeswitch:
# nano /etc/freeswitch/autoload_configs/modules.conf.xml
Раскомментируем строку:
<load module="mod_xml_rpc"/>
Файл настроек модуля:
# nano /etc/freeswitch/autoload_configs/xml_rpc.conf.xml
Тут можно указать логин-пароль для доступа к сервису XML-RPC (по умолчанию freeswitch/works), сменить прослушиваемый порт (по умолчанию 8080) и выставить IP адрес, на котором сервис слушает сеть (по умолчанию 0.0.0.0, установить конкретный IP можно директивой <param name="listen-ip" value="127.0.0.1"/>)
Рестартуем Freeswitch
# systemctl restart freeswitch
Проверка прослушивания порта 8080:
# netstat -ltupn | grep 8080
Проверка выполнения команд
# curl -X GET http://127.0.0.1:8080/webapi/sofia?status%20profile%20internal -u freeswitch:works                          
Name                    internal
Domain Name             N/A
Auto-NAT                false
DBName                  sofia_reg_internal
Pres Hosts              10.0.1.53,10.0.1.53
Dialplan                XML
Context                 public
Challenge Realm         auto_from
.....

Библиотека Event Socket Library (ESL) для Freeswitch

Библиотека ESL позволяет гибко управлять Freeswitch через сокеты.
Для сборки библиотеки необходимо предварительно установить пакеты:
# dnf groupinstall "Development Tools"
# dnf install python3-devel
# dnf install libcurl-devel openssl-devel

Переходим в каталог с исходными кодами и собираем пакет ESL для Python3:
# cd /usr/src/freeswitch/libs/esl/
# make pymod
# cp python/_ESL.so /usr/lib64/python3.9/site-packages/
# cp python/ESL.py /usr/lib64/python3.9/site-packages/

Включаем возможность работы с сокетами в Freeswitch:
# nano /etc/freeswitch/autoload_configs/modules.conf.xml
Следующая строчка должна быть раскомментирована:
<load module="mod_event_socket"/>
Конфигурационный файл модуля mod_event_socket
# nano /etc/freeswitch/autoload_configs/event_socket.conf.xml
Тут определяются пароли доступа к сервису ESL, прослушиваемый порт.
Можно все оставить по умолчанию или изменить пароль подключения.
После изменений конфигурации, нужно рестартовать Freeswitch
# systemctl restart freeswitch
Для проверки создаем файл соединения с Python:
# nano testesl.py
Содержимое:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import string
import sys
from ESL import ESLconnection
esl = ESLconnection("127.0.0.1","8021","ClueCon")
if esl.connected():
    print("Подключение к FreeSWITCH успешно!")
else:
    print("Не удалось подключиться к FreeSWITCH.")
if esl.connected:
    esl.events("plain", "all");
    while 1:
        event = esl.recvEvent()
        if event:
            # Выводим содержимое события
            print("Получено событие:")
            print(event.serialize())

Теперь после запуска сервера:
# python3 testesl.py
Мы будем получать все события:
Подключение к FreeSWITCH успешно!
Получено событие:
Event-Name: HEARTBEAT
Core-UUID: f78a248f-4d85-4d36-a773-424267bc7761
FreeSWITCH-Hostname: testkvs
FreeSWITCH-Switchname: testkvs

...
Получено событие:
Event-Name: RE_SCHEDULE
Core-UUID: f78a248f-4d85-4d36-a773-424267bc7761
FreeSWITCH-Hostname: testkvs
FreeSWITCH-Switchname: testkvs
...