Как сделать так, чтобы все trunk'и по умолчанию привязывались к одному интерфейсу?

Коллеги, <br/> Нужна помощь по FreePBX — ИИ начал повторяться, человекочеловеческая помощь приветствуется. <br/> У меня Debian 12 + FreePBX 17: <br/> ens18 — первая локальная сеть; <br/> ens19 — вторая локальная сеть провайдера Ростелеком (они предоставляют VoIP). Транки регистрируются на их сервере, доступном внутри этой сети. <br/> Нельзя сделать два шлюза, поэтому настроены правила маршрутизации, но PJSIP их игнорирует: он отправляет трафик по всем интерфейсам и использует transport 0.0.0.0-udp. Через веб-интерфейс изменить транспорт не получается, через конфиги тоже не получилось. Когда создаю Trunk, чтобы зарегистрироваться на сервере Ростелекома через второй интерфейс, PJSIP всё равно выходит в интернет через первый интерфейс. Пробовал кастомные транки и правки в pjsip.transports_custom.conf — не смог привязать транспорт к нужному интерфейсу. <br/> Подскажите, как изменить транспорт и привязать его к конкретному сетевому интерфейсу?
  • 27 февраля 2026 г. 12:01
Ответы на вопрос 1
Кратко — 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 под вашу сеть.
Похожие вопросы