Кратко — PJSIP берёт исходный интерфейс по тому IP‑адресу, на который он привязан (bind). Значит надо:
1) создать PJSIP‑transport, который привязан (bind) к IP интерфейса ens19;
2) заставить ваш trunk использовать именно этот transport;
3) при необходимости добавить policy routing в kernel, чтобы пакеты с этим исходным IP шли через шлюз провайдера.
Ниже — пошагово с примерами.
1) Узнайте IP интерфейса ens19
(пример)
- ip -4 addr show dev ens19
Предположим, IP = 192.0.2.10, подсеть 192.0.2.0/24, шлюз провайдера 192.0.2.1.
2) Создайте транспорт, привязанный к этому IP
Создайте файл /etc/asterisk/pjsip.transports_custom.conf (FreePBX включает *_custom.conf и он не перезаписывается) и добавьте:
[transport-rtk]
type=transport
protocol=udp
bind=192.0.2.10:5060
local_net=192.0.2.0/24
(имя transport-rtk — произвольное, можно другое). Если нужен TCP/TLS — аналогично protocol=tcp/tls и соответствующие порты.
3) Перезагрузите PJSIP/Asterisk
- fwconsole reload
или
- asterisk -rx "pjsip reload"
(можно перезагрузить весь FreePBX: fwconsole restart)
4) Назначьте этот transport для вашего Trunk
В GUI FreePBX:
- Откройте ваш PJSIP Trunk → Advanced / PJSIP Settings → должен быть выпадающий список Transport (или поле Transport в разделе Advanced). Выберите transport-rtk.
Если в GUI такого поля нет/он не работает, можно в "PEER Details" / "Other PJSIP Settings" добавить строку:
transport=transport-rtk
После этого в Asterisk CLI проверьте:
- asterisk -rvv
- pjsip show transports — должен показывать transport-rtk с адресом 192.0.2.10:5060
- pjsip show endpoints <имя_транка> — должно показывать Transport: transport-rtk
- pjsip show registrations — для регистрирующихся транков проверьте, что регистрация уходит с нужного IP
5) Если по-прежнему трафик уходит не через ens19 — настройте policy routing
Даже если Asterisk привязан к 192.0.2.10, нужно, чтобы kernel отправлял пакеты с source=192.0.2.10 через шлюз провайдера:
ip route add 192.0.2.0/24 dev ens19 src 192.0.2.10
ip rule add from 192.0.2.10 table 200
ip route add default via 192.0.2.1 dev ens19 table 200
Добавьте эти правила в скрипт запуска (или /etc/network/interfaces/.network, systemd unit или /etc/rc.local), чтобы они сохранялись после перезагрузки.
6) Важные замечания и отладка
- Если у вас уже есть дефолтный transport 0.0.0.0-udp, он может конфликтовать (привязываться к всем интерфейсам) — тогда PJSIP всё равно будет слушать на 0.0.0.0. Уберите/измените дефолтный транспорт в FreePBX (Settings → Asterisk SIP Settings → PJSIP Transports) или перенастройте его через GUI так, чтобы не было слушания на 0.0.0.0, иначе трафик может идти через него.
- Проверки:
- netstat -nulp | grep asterisk — покажет, на каких адресах/портах слушает asterisk.
- pjsip show transports — покажет все transport и bind‑адреса.
- tcpdump -i ens19 port 5060 — смотреть исходящий SIP на нужном интерфейсе.
- Если в GUI FreePBX не видно/не выбирается ваш transport: перезапустите Asterisk/FreePBX, проверьте логи (fwconsole chown; fwconsole restart). В редких случаях приходится добавить transport через GUI, а не только через *_custom.conf.
Если хотите — пришлите вывод:
- pjsip show transports
- pjsip show endpoints <имя_транка>
- ip -4 addr show
- ip route show
и я подскажу точные строки для конфигурации и policy routing под вашу сеть.