Настройка SIP-регистрации на Raspberry Pi с Asterisk и FreePBX: пошаговый опыт

Вы купили Raspberry Pi, хотите подключить к ней SIP-телефоны или привязать внешнего провайдера, но не знаете, как всё это собрать воедино. Задача вполне реальная: на одном маленьком компьютере можно поднять полноценную АТС и заставить её регистрировать телефоны по SIP. Ниже — тот путь, который я прошёл сам и который объясняю клиентам. Без воды, с конкретными командами и типичными граблями.

Что мы вообще собираем

Сначала определимся в терминах, чтобы не путаться дальше.

  • Asterisk — это ядро АТС, программа, которая маршрутизирует звонки, обрабатывает регистрации, держит диалплан.
  • FreePBX — веб-интерфейс поверх Asterisk, который позволяет настраивать всё через браузер, а не править конфиги вручную.
  • SIP-регистрация — это процесс, при котором телефон (или другой клиент) говорит серверу: «Я здесь, мой адрес такой-то, принимай звонки сюда».

Итого схема такая: Raspberry Pi → на него ставится ОС → Asterisk + FreePBX → в FreePBX создаём SIP-транки и экстеншены → телефоны регистрируются на эту конструкцию.

Железо и подготовка

Я пробовал на Pi 3B+, Pi 4 и Pi 5. На третьей модели работает, но при нескольких одновременных звонках уже начинает задыхаться. Для чего-то серьёзного — только Pi 4 с 4 ГБ оперативки или Pi 5.

Что понадобится:

  • Raspberry Pi 4/5 с 4+ ГБ RAM
  • Карта памяти минимум 32 ГБ (лучше 64 ГБ, и не Class 10 — возьмите A2, скорость записи имеет значение)
  • Блок питания с запасом — Pi 4 тянет до 3 А, слабый блок даёт просадки и телефоны отваливаются от регистрации
  • Ethernet-кабель — Wi-Fi не зло, но для голоса по возможности только провод

ОС — я использую Raspberry Pi OS Lite (64-bit, без рабочего стола). Графике тут делать нечего, ресурсы лучше отдать под АТС.

Установка базовой системы

После первого загрузки — стандартные шаги, которые все делают, но я напомню ключевые моменты, влияющие на SIP.

  1. Обновление системы:
sudo apt update && sudo apt upgrade -y
  1. Статический IP. Это критично. Если IP будет меняться — телефоны потеряют сервер регистрации и начнут отваливаться. Задаём через dhcpcd:
sudo nano /etc/dhcpcd.conf

Добавляем (подставляйте свои значения):

interface eth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

  1. Отключаем то, что мешает. На Raspberry Pi может быть встроен сервис, который резервирует порты или конфликтует с сетевыми настройками. Проверьте, что нет лишних SIP-демонов и что порт 5060 свободен:
sudo lsof -i :5060

Установка Asterisk

Тут два пути: собрать из исходников или взять из репозитория. Я рекомендую репозиторий для начала — меньше боли с зависимостями.

sudo apt install asterisk -y

После установки проверяем:

sudo asterisk -rvvv

Если видим версию и консоль — Asterisk жив. Выходим командой exit.

Добавляем автозапуск:

sudo systemctl enable asterisk
sudo systemctl start asterisk

Установка FreePBX

FreePBX ставится поверх Asterisk скриптом. Порядок такой:

  1. Устанавливаем веб-сервер и PHP:
sudo apt install apache2 libapache2-mod-php php php-mysql php-curl php-cli php-mbstring php-xml php-bcmath php-zip php-gd php-sqlite3 -y
  1. Устанавливаем MariaDB (вместо MySQL):
sudo apt install mariadb-server mariadb-client -y
sudo mysql_secure_installation

В процессе задаём root-пароль и отвечаем «Y» на все вопросы безопасности.

  1. Скачиваем и запускаем установщик FreePBX:
cd /tmp
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-16.0-latest.tgz
tar xzf freepbx-16.0-latest.tgz
cd freepbx
sudo ./start_asterisk start
sudo ./install -n

Флаг -n означает «не спрашивать пароль базы, использовать стандартный». Если ставили MariaDB с другим паролем — уберите -n и введите его.

После установки открываем в браузере http://192.168.1.100 и видим мастер первоначальной настройки FreePBX. Задаём логин/пароль администратора, настраиваем почту для уведомлений (по желанию) и дожидаемся применения всех конфигов.

Настройка SIP-экстеншена в FreePBX

Теперь самое интересное — создаём внутренний номер, на который сможет зарегистрироваться телефон.

  1. В веб-интерфейсе: Applications → Extensions → Add Extension → SIP.
  2. Заполняем:
  • Extension Number: 1001 (ваш внутренний номер)
  • Display Name: Офисный телефон
  • Secret: пароль для регистрации — минимум 16 символов, смешанные буквы, цифры, спецсимволы. Не используйте «1234» или «password» — бот-сканеры атакуют SIP-порт каждую минуту.
  1. На вкладке Advanced проверяем:
  • NAT: yes (если телефон за NAT, а он почти всегда за NAT)
  • Transport: UDP (для начала, потом можно добавить TLS)
  • DTMF Mode: rfc4733
  1. Нажимаем Submit → красная кнопка Apply Config вверху страницы.

Настройка SIP-транка к провайдеру

Если нужно принимать звонки извне или звонить на городские номера, настраиваем транк. У каждого провайдера свои параметры, но общая структура такая:

  1. Connectivity → Trunks → Add SIP (chan_pjsip) Trunk
  2. Вкладка General:
  • Trunk Name: название провайдера
  • Outbound CallerID: ваш номер
  • Maximum Channels: сколько одновременных линий
  1. Вкладка Outgoing — Peer Details:
type=peer
host=sip.provider.com
port=5060
context=from-trunk
transport=udp
dtmf=rfc4733
insecure=port,invite
qualify=yes

В поле host — адрес вашего SIP-провайдера. Всё остальное — типичный набор, который работает у большинства провайдеров в РФ и СНГ.

  1. Вкладка Incoming — USER Context и USER Details заполняются по аналогии, но если провайдер присылает регистрацию на ваш сервер, то в USER Details указываем логин и пароль от провайдера.

Если провайдер работает по модели «мы звоним на ваш IP» (без регистрации с вашей стороны), то вкладку Incoming можно оставить пустой, а маршрутизацию настраивать через входящий маршрут с любым DID.

Маршрутизация звонков

Без маршрутов FreePBX не знает, что делать с вызовами. Настраиваем:

  • Connectivity → Inbound Routes — входящие: какой DID → на какой экстеншен или ринг-группу.
  • Connectivity → Outbound Routes — исходящие: какие номера через какой транк отправлять.

Для простого теста: создайте исходящий маршрут, который все вызовы отправляет через ваш транк, и попробуйте позвонить на любой мобильный номер.

Настройка телефона для регистрации

Возьмём любой SIP-клиент: аппаратный телефон (Grandstream, Yealink), софтфон на ПК (MicroSIP, Zoiper) или приложение на смартфоне (Linphone, Zoiper).

Параметры регистрации везде одинаковые:

  • Server / Domain: 192.168.1.100 (IP вашего Raspberry Pi)
  • Username: 1001 (номер экстеншена)
  • Password: тот самый Secret, который задали в FreePBX
  • Transport: UDP
  • Port: 5060

Если всё настроено верно, через 10–20 секунд телефон покажет статус «Registered». Если нет — читаем раздел про ошибки.

Брандмауэр и NAT

Это то, на чём спотыкается 80% новичков. Asterisk использует два типа портов:

  • Сигнализация (SIP): UDP 5060 — телефон говорит «я хочу зарегистрироваться»
  • Медиа (RTP): UDP 10000–20000 — сам голос, который идёт отдельным потоком

Если порт RTP не открыт — регистрация будет, а звука не будет. Или будет в одну сторону.

На Raspberry Pi настраиваем iptables:

sudo iptables -A INPUT -p udp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
sudo apt install iptables-persistent -y
sudo netfilter-persistent save

Если ваш Raspberry Pi стоит за роутером — пробросьте эти порты на его IP в настройках роутера. И не забудьте про статический IP на Pi, о котором я говорил выше.

В FreePBX тоже нужно указать NAT-настройки: Settings → Asterisk SIP Settings. В секции External Address указывайте внешний IP роутера, а в Local Networks — вашу локальную подсеть (например, 192.168.1.0/255.255.255.0).

Сравнение подходов: chan_sip vs chan_pjsip

Asterisk поддерживает два SIP-драйвера. Это важно понимать, потому что от выбора зависит конфигурация.

Параметр chan_sip chan_pjsip
Статус разработки Устаревает, поддержка ограничена Активно развивается, рекомендуется
Производительность Ниже Выше, лучше масштабируется
Поддержка кодеков Базовая Широкая, включая Opus
TLS/SRTP Ограниченно Полная поддержка
Совместимость Максимальная Высокая, но старые устройства могут капризничать
Рекомендация Только если pjsip не работает Выбирайте по умолчанию

FreePBX 16+ по умолчанию использует pjsip. Если у вас старый телефон, который не регистрируется на pjsip — можно включить модуль chan_sip через Admin → Modules и переключить транк.

Частые ошибки и как их ловить

Вот реальный список проблем, с которыми я сталкивался и которые вижу у клиентов регулярно:

  • «Телефон не регистрируется» — в 90% случаев это неправильный пароль или закрытый порт 5060. Проверьте: sudo asterisk -rx "pjsip show endpoints" — увидите статус всех эндпоинтов.
  • «Регистрация есть, но звука нет» — не открыты порты RTP (10000–20000) или не настроен NAT в Asterisk. Проверьте: sudo asterisk -rx "rtp set debug on" и смотрите, приходят ли пакеты.
  • «Звонок идёт 2 секунды и обрывается» — обычно это таймаут NAT. В настройках транка добавьте nat=yes и qualify=yes.
  • «FreePBX не загружается» — не хватило памяти на Pi. Проверьте свободную память: free -h. Если swap почти забит — уменьшите веб-интерфейс или переходите на Pi 4/5.
  • «Двойная регистрация или конфликт» — два телефона с одним экстеншеном. FreePBX это не запрещает, но звонок придёт на оба. Если нужно одно устройство — используйте разные номера.

Что делать в зависимости от вашей ситуации

У вас домашний офис, 2–3 телефона, один провайдер: ставьте FreePBX 16 с chan_pjsip, создайте 2–3 экстеншена, один транк к провайдеру. Не заморачивайтесь с TLS — в локальной сети это избыточно. Откройте порты на роутере и пользуйтесь.

У вас малый офис, 10–20 сотрудников: обязательно Pi 4 с 4 ГБ или Pi 5. Настройте ринг-группы, IVR (голосовое меню), очереди вызовов. Отдельно настройте fail2ban — он уже встроен в FreePBX, включите его в Admin → System Admin → Intrusion Detection. Без этого через неделю начнутся атаки перебором паролей.

Хотите шифрование (TLS/SRTP): вам понадобится сертификат. Можно использовать Let's Encrypt через встроенный модуль FreePBX. Учтите: все телефоны тоже должны поддерживать TLS. Не все дешёвые модели это умеют.

Нужна отказоустойчивость: на Raspberry Pi это сложно. Я бы не стал строить критичную телефонию на одной плате. Максимум — держать второй Pi с синхронизацией конфигов и быстро поднимать в случае падения.

Практические рекомендации

  • Пароли. Минимум 16 символов для каждого экстеншена. FreePBX умеет генерировать — используйте эту кнопку.
  • Обновления. Регулярно обновляйте модули через Admin → Module Admin. Обновления безопасности выходят часто.
  • Бэкапы. Настройте резервное копирование в Admin → Backup & Restore. Хотя бы раз в неделю. При обновлении FreePBX — обязательно бэкап перед обновлением.
  • Мониторинг. Подключите хотя бы базовый мониторинг через команду sudo asterisk -rx "core show channels" — покажет активные вызовы. Для продвинутого — настройте Zabbix или Prometheus с экспортером метрик Asterisk.
  • Логи. Если что-то не работает — смотрите /var/log/asterisk/full. Там всё написано, нужно только уметь читать.

Итог

Настройка SIP-регистрации на Raspberry Pi с Asterisk и FreePBX — задача полностью реальная и хорошо документированная. Ключевые моменты: статический IP, правильный NAT, открытые порты RTP, надёжные пароли и актуальная версия FreePBX с chan_pjsip.

Если начинаете с нуля — возьмите Pi 4 с 4 ГБ, поставьте Raspberry Pi OS Lite, Asterisk из репозитория и FreePBX скриптом. Создайте один экстеншен, подключите один телефон, добейтесь регистрации. Потом добавляйте транк к провайдеру и стройте дальше. Не пытайтесь настроить всё сразу — идите от простого к сложному, и всё заработает.

Virtual SIM — eSIM и виртуальные номера по всему миру