"Что
<br />
В 90% случаев проблемы с SIP за MikroTik решает одна команда: /ip firewall service-port disable sip. Дальше — UDP timeout, RTP-порты и DNAT до Asterisk или FreePBX. Статья покрывает RouterOS v6 и v7, схемы с FastTrack, VPN, dual-WAN, SIP TLS и QoS. Команды проверены в продакшне.<br />
"Для
<br />
Ты администрируешь сеть с <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mikrotik/" target="_blank" rel="noopener" title="mikrotik" data-wpil-keyword-link="linked" data-wpil-monitor-id="1938">MikroTik</a> и IP-телефонией. У тебя Asterisk, FreePBX, 3CX или любая другая АТС за NAT. Или SIP-провайдер — Sipuni, Mango, Zadarma — и IP-телефоны в офисе. Статья подходит для RouterOS 6.x и 7.x, отличия между версиями вынесены в отдельный раздел.<br />
"Симптомы
<br />
— Телефон зарегистрирован, но звука нет совсем<br />
— Слышишь только ты, тебя не слышат — или наоборот<br />
— Звонок обрывается ровно через 30-60 секунд<br />
— SIP-регистрация периодически пропадает сама по себе<br />
— Входящие звонки не проходят, исходящие работают<br />
— SIP работает через LTE, но не работает через провайдера<br />
— После замены <a href="https://it-apteka.com/dyndns-polnyj-gajd-po-nastrojke-dinamicheskogo-dns-na-routere-keenetic-i-mikrotik-besplatno-i-bez-boli/" title="DynDNS: полный гайд по настройке динамического DNS на роутере, Keenetic и MikroTik — бесплатно и без боли" target="_blank" rel="noopener" data-wpil-monitor-id="1942">роутера на MikroTik</a> телефония перестала работать<br />
<h2 id="what-is-sip-alg">Что такое SIP ALG и почему он ломает VoIP</h2>
<p>SIP ALG (Application Layer Gateway) — механизм в RouterOS, который работает на уровне приложений и умеет разбирать SIP-протокол. Когда через MikroTik проходит SIP-пакет, ALG перехватывает его, анализирует содержимое и пытается исправить IP-адреса внутри SIP-заголовков и SDP-тела.</p>
<p>Задумывался он для решения классической проблемы VoIP за NAT: SIP-телефон внутри <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="1939">сети</a> отправляет в пакете свой локальный IP (192.168.x.x), который снаружи бесполезен. ALG должен подменить этот адрес на внешний IP роутера, чтобы АТС знала куда слать RTP-поток с аудио.</p>
<p>Звучит разумно. Но вот почему это ломается:</p>
<ul>
<li><strong>Облачные АТС сами справляются с NAT.</strong> Asterisk, FreePBX, 3CX, Sipuni, Mango — все они работают через STUN, ICE или фиксированный external IP. Когда ALG лезет со своими «исправлениями» поверх — получается каша из адресов.</li>
<li><strong>Зашифрованный SIP (TLS/SRTP).</strong> ALG не может расшифровать содержимое. Либо ломает пакет, либо пропускает непредсказуемо.</li>
<li><strong>Нестандартные порты.</strong> ALG ориентируется на порт 5060. Если АТС работает на 5080 или 5061 — ALG не вмешается. Непоследовательное поведение.</li>
<li><strong>VPN + SIP.</strong> SIP идёт через туннель — ALG видит зашифрованные данные и делает что-то неожиданное.</li>
<li><strong>Несколько SIP-транков.</strong> ALG не умеет разбираться в сложных схемах с несколькими потоками одновременно.</li>
</ul>
<p>SIP ALG — реликт эпохи, когда SIP-устройства не умели работать с NAT сами. Сегодня он приносит больше вреда, чем пользы. Первое действие при любых проблемах с VoIP за MikroTik — отключить его.</p>
<h2 id="check-sip-alg">Проверка: включён ли SIP ALG</h2>
<pre><code class="language-bash">
/ip firewall service-port print
</code></pre>
<p>SIP ALG <strong>включён</strong> — проблема есть:</p>
<pre><code class="language-bash">
Flags: X - disabled
# NAME PORTS
0 ftp 21
1 tftp 69
2 irc 6667
3 h323 1720
4 sip 5060,5061
5 pptp 1723
</code></pre>
<p>SIP ALG <strong>отключён</strong> — правильное состояние:</p>
<pre><code class="language-bash">
Flags: X - disabled
# NAME PORTS
...
X 4 sip 5060,5061
</code></pre>
<p>Флаг X перед sip — отключён.</p>
<h2 id="disable-sip-alg">Как отключить SIP ALG на MikroTik</h2>
<pre><code class="language-bash">
/ip firewall service-port disable sip
</code></pre>
<p>Проверить:</p>
<pre><code class="language-bash">
/ip firewall service-port print
</code></pre>
<p>Через WinBox: IP — Firewall — Service Ports — находим sip — снимаем галочку Enabled — Apply.</p>
<p>Изменение вступает в силу немедленно, без перезагрузки. Активные SIP-сессии кратковременно прерываются — телефоны перерегистрируются. Лучше делать в нерабочее время.</p>
<h2 id="routeros7">RouterOS v7: что изменилось для SIP</h2>
<h3>Где находится SIP Helper в RouterOS 7</h3>
<p>В RouterOS 7 команда та же:</p>
<pre><code class="language-bash">
/ip firewall service-port disable sip
</code></pre>
<p>Но в v7 появилось несколько изменений, которые влияют на SIP.</p>
<h3>Connection Tracking в RouterOS 7</h3>
<p>В v7 connection tracking вынесен в отдельный раздел и имеет расширенный синтаксис:</p>
<pre><code class="language-bash">
# RouterOS 6
/ip firewall connection tracking set udp-timeout=60s
# RouterOS 7 - тот же синтаксис, но появились новые параметры
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# Посмотреть все параметры
/ip firewall connection tracking print
</code></pre>
<p>В v7 появился параметр <code>loose-tcp-tracking</code> — для SIP over TCP он не нужен, но знать стоит.</p>
<h3>FastTrack в RouterOS 7</h3>
<p>В RouterOS 7 FastTrack изменил поведение. Теперь он работает на уровне hardware offload и может быть более агрессивным в отношении обхода правил mangle и queue. Если настроен QoS для VoIP через Mangle/Queue Tree — FastTrack нужно исключать явно.</p>
<pre><code class="language-bash">
# RouterOS 7: исключить SIP и RTP из FastTrack
# Добавить в Mangle ПЕРЕД FastTrack-правилом
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=5060-5061 \
action=mark-connection \
new-connection-mark=sip \
passthrough=yes \
comment="Mark SIP connections"
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=10000-20000 \
action=mark-connection \
new-connection-mark=rtp \
passthrough=yes \
comment="Mark RTP connections"
# FastTrack только для не-SIP/RTP соединений
/ip firewall filter add \
chain=forward \
connection-mark=!sip \
connection-mark=!rtp \
connection-state=established,related \
action=fasttrack-connection \
comment="FastTrack non-VoIP"
</code></pre>
<h3>Routing tables и policy routing в RouterOS 7</h3>
<p>В RouterOS 7 routing tables работают иначе. Если используешь policy routing для SIP-трафика (например, направить SIP через конкретного провайдера):</p>
<pre><code class="language-bash">
# RouterOS 7: создать routing table для SIP
/routing table add name=voip-table fib
# Добавить маршрут через нужного провайдера
/ip route add dst-address=0.0.0.0/0 gateway=ISP1_GW routing-table=voip-table
# Mangle: направить SIP через voip-table
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=5060-5061 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="Route SIP via ISP1"
# RTP направить туда же
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=10000-20000 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="Route RTP via ISP1"
</code></pre>
<h2 id="full-config">Полная конфигурация MikroTik для SIP телефонии</h2>
<h3>Архитектура: MikroTik + Asterisk за NAT</h3>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 60}
}}%%
flowchart TD
A["Интернет - SIP провайдер"] --> B["MikroTik WAN - ether1 X.X.X.X"]
B --> C["MikroTik LAN - 192.168.1.1/24"]
C --> D["Asterisk / FreePBX - 192.168.1.100:5060"]
C --> E["IP-телефоны - 192.168.1.x"]
D --> E
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<h3>Шаг 1: отключить SIP ALG</h3>
<pre><code class="language-bash">
/ip firewall service-port disable sip
</code></pre>
<h3>Шаг 2: настроить NAT masquerade</h3>
<pre><code class="language-bash">
/ip firewall nat add \
chain=srcnat \
out-interface=ether1 \
action=masquerade \
comment="NAT masquerade"
</code></pre>
<p>Если masquerade уже есть — пропускай этот шаг.</p>
<h3>Шаг 3: DNAT для SIP сигнализации</h3>
<pre><code class="language-bash">
# SIP UDP - основной протокол
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5060 \
comment="DNAT SIP UDP to Asterisk"
# SIP TCP - некоторые провайдеры и телефоны используют TCP
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=tcp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5060 \
comment="DNAT SIP TCP to Asterisk"
# SIP TLS (порт 5061) - если используется
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=tcp \
dst-port=5061 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5061 \
comment="DNAT SIP TLS to Asterisk"
</code></pre>
<h3>Шаг 4: открыть и пробросить RTP-порты</h3>
<pre><code class="language-bash">
# Разрешить входящий RTP
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.100 \
dst-port=10000-20000 \
action=accept \
comment="RTP to Asterisk" \
place-before=0
# DNAT для входящего RTP на Asterisk
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=10000-20000 \
action=dst-nat \
to-addresses=192.168.1.100 \
comment="DNAT RTP to Asterisk"
</code></pre>
<p>RTP-диапазон 10000-20000 — стандарт для Asterisk и FreePBX. Для 3CX — 9000-10999. Для Yeastar — смотри в настройках. Уточняй у своей АТС.</p>
<h3>Шаг 5: увеличить UDP timeout</h3>
<pre><code class="language-bash">
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# Проверить
/ip firewall connection tracking print
</code></pre>
<h3>Шаг 6: разрешающие правила в filter</h3>
<pre><code class="language-bash">
# Разрешить SIP на вход роутера (если АТС - сам MikroTik)
/ip firewall filter add \
chain=input \
protocol=udp \
dst-port=5060 \
action=accept \
comment="Allow SIP input"
# Разрешить SIP форвард к Asterisk
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.100 \
dst-port=5060 \
action=accept \
comment="Allow SIP to Asterisk"
# Разрешить RTP форвард к Asterisk
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.100 \
dst-port=10000-20000 \
action=accept \
comment="Allow RTP to Asterisk"
</code></pre>
<h2 id="fasttrack-sip">FastTrack и SIP: как исключить VoIP</h2>
<p>FastTrack ускоряет маршрутизацию, но пакеты в FastTrack-сессиях обходят mangle, queue и часть filter-правил. Если VoIP-трафик попал в FastTrack — QoS и некоторые NAT-правила перестают работать.</p>
<p>Как проверить — есть ли FastTrack:</p>
<pre><code class="language-bash">
/ip firewall filter print where action=fasttrack-connection
</code></pre>
<p>Если строки есть — FastTrack активен. Исключаем SIP и RTP:</p>
<pre><code class="language-bash">
# Поставить ПЕРЕД правилом fasttrack-connection
# Отметить SIP и RTP соединения чтобы они не попадали в FastTrack
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-port=5060-5061 \
action=accept \
comment="SIP - bypass FastTrack" \
place-before=0
/ip firewall filter add \
chain=forward \
protocol=udp \
src-port=5060-5061 \
action=accept \
comment="SIP response - bypass FastTrack" \
place-before=1
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-port=10000-20000 \
action=accept \
comment="RTP - bypass FastTrack" \
place-before=2
</code></pre>
<p>Важно: правила accept до FastTrack не отменяют FastTrack для этих пакетов напрямую. В RouterOS 7 правильный способ — через Mangle и connection-mark (показан в разделе RouterOS v7 выше).</p>
<h2 id="sip-tls">SIP over TLS и SRTP за MikroTik</h2>
<h3>Почему SIP ALG особенно опасен для TLS</h3>
<p>SIP ALG работает с открытым текстом. SIP TLS — зашифрованный трафик на порту 5061/TCP. ALG не может расшифровать содержимое, поэтому ведёт себя непредсказуемо: может пропустить пакет как есть, может обрезать его, может переписать заголовки которые не должен трогать.</p>
<p>Результат: при включённом SIP ALG — TLS-соединения либо не устанавливаются, либо устанавливаются но ломаются при первом re-INVITE.</p>
<h3>Порты для SIP TLS и SRTP</h3>
<table>
<thead>
<tr>
<th>Протокол</th>
<th>Порт</th>
<th>Транспорт</th>
<th>Назначение</th>
</tr>
</thead>
<tbody>
<tr>
<td>SIP</td>
<td>5060</td>
<td>UDP / TCP</td>
<td>Стандартная сигнализация (открытый текст)</td>
</tr>
<tr>
<td>SIP TLS</td>
<td>5061</td>
<td>TCP</td>
<td>Зашифрованная сигнализация</td>
</tr>
<tr>
<td>RTP</td>
<td>10000-20000</td>
<td>UDP</td>
<td>Аудиопоток (открытый текст)</td>
</tr>
<tr>
<td>SRTP</td>
<td>10000-20000</td>
<td>UDP</td>
<td>Зашифрованный аудиопоток (те же порты)</td>
</tr>
</tbody>
</table>
<p>SRTP использует те же порты что и RTP — шифрование на уровне содержимого пакета, не порта. Поэтому правила файрвола для RTP и SRTP — одинаковые.</p>
<h3>Настройка MikroTik для SIP TLS</h3>
<pre><code class="language-bash">
# 1. Отключить SIP ALG - обязательно
/ip firewall service-port disable sip
# 2. DNAT для 5061/TCP на Asterisk
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=tcp \
dst-port=5061 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5061 \
comment="DNAT SIP TLS to Asterisk"
# 3. Разрешить 5061/TCP форвард
/ip firewall filter add \
chain=forward \
protocol=tcp \
dst-address=192.168.1.100 \
dst-port=5061 \
action=accept \
comment="Allow SIP TLS to Asterisk"
# 4. SRTP - те же правила что для RTP
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=10000-20000 \
action=dst-nat \
to-addresses=192.168.1.100 \
comment="DNAT SRTP to Asterisk"
</code></pre>
<h3>Как не ломать TLS-сертификаты</h3>
<p>MikroTik не должен терминировать TLS SIP — он должен пропускать TCP-соединение насквозь. Никакого SSL inspection на порту 5061. Если у тебя настроен transparent <a href="https://it-apteka.com/acme-nginx-nastrojka-let-s-encrypt-vruchnuju-i-cherez-nginx-proxy-manager/" title="ACME + Nginx: настройка Let’s Encrypt вручную и через Nginx Proxy Manager" target="_blank" rel="noopener" data-wpil-monitor-id="1940">proxy или SSL</a> inspection — добавь 5061/TCP в исключения.</p>
<p>Проверить что 5061 проходит насквозь:</p>
<pre><code class="language-bash">
# Захват TLS-трафика на WAN
/tool sniffer quick port=5061 interface=ether1
# Если пакеты видны - MikroTik их пропускает
# Если нет - проверяй firewall filter
/ip firewall filter print stats where dst-port~"5061"
</code></pre>
<h2 id="dual-wan">SIP при dual-WAN и failover</h2>
<h3>Что происходит с SIP при переключении провайдера</h3>
<p>SIP-сессия привязана к IP-адресу и NAT-записи. При failover меняется внешний IP — старые NAT-записи становятся невалидными. Активные звонки обрываются. Телефоны, которые были зарегистрированы через провайдера 1, теряют регистрацию.</p>
<p>Это не баг MikroTik — это природа SIP и UDP.</p>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 60}
}}%%
flowchart TD
A["ISP1 - основной"] --> B["MikroTik"]
C["ISP2 - резервный"] --> B
B --> D["Asterisk - 192.168.1.100"]
B --> E["Failover скрипт"]
E --> F["Очистить connection tracking"]
E --> G["Переключить маршрут на ISP2"]
E --> H["Asterisk перерегистрируется через ISP2"]
style A fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style C fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#475569
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style F fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#991b1b
</pre>
<h3>Очистка connection tracking при failover</h3>
<p>При переключении провайдера нужно сбросить старые NAT-записи, чтобы SIP перерегистрировался с новым IP:</p>
<pre><code class="language-bash">
# Скрипт failover - добавь это в свой скрипт переключения
# Очистить все SIP-соединения
/ip firewall connection remove [find dst-port=5060 or src-port=5060]
# Очистить все UDP-соединения (включая RTP)
# Осторожно - это сбросит все UDP-сессии, включая DNS
/ip firewall connection remove [find protocol=udp]
# Мягче - только SIP и RTP
/ip firewall connection remove [find dst-port=5060]
/ip firewall connection remove [find src-port=5060]
/ip firewall connection remove [find dst-port~"1[0-9][0-9][0-9][0-9]" protocol=udp]
</code></pre>
<h3>Recursive routing для SIP failover</h3>
<p>Recursive routing в <a href="https://it-apteka.com/ntp-cherez-dhcp-options-v-mikrotik-avtomaticheskaja-razdacha-vremeni-klientam/" title="NTP через DHCP Options в MikroTik: автоматическая раздача времени клиентам" target="_blank" rel="noopener" data-wpil-monitor-id="1943">MikroTik позволяет автоматически</a> переключать маршрут когда провайдер недоступен. Для SIP важно чтобы весь SIP-трафик шёл через одного провайдера — не балансировался между двумя.</p>
<pre><code class="language-bash">
# RouterOS 7: привязать SIP к ISP1 через policy routing
/routing table add name=voip-table fib
# Маршрут для SIP через ISP1
/ip route add dst-address=0.0.0.0/0 gateway=ISP1_GW routing-table=voip-table distance=1
/ip route add dst-address=0.0.0.0/0 gateway=ISP2_GW routing-table=voip-table distance=10
# Mangle: весь SIP через voip-table
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=5060-5061 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="SIP via ISP1"
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
src-port=5060-5061 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=10000-20000 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="RTP via ISP1"
</code></pre>
<h3>Persistent NAT для VoIP</h3>
<p>Persistent NAT гарантирует что SIP-сессия от одного источника всегда выходит через один и тот же внешний порт — это важно для регистрации:</p>
<pre><code class="language-bash">
# Для Asterisk - srcnat с фиксированным исходящим адресом
/ip firewall nat add \
chain=srcnat \
src-address=192.168.1.100 \
out-interface=ether1 \
action=src-nat \
to-addresses=X.X.X.X \
comment="Persistent NAT for Asterisk"
</code></pre>
<h2 id="sip-vpn">SIP через VPN</h2>
<h3>Когда SIP в туннеле — это правильно</h3>
<p>Если АТС и телефоны соединены через VPN-туннель — SIP-трафик внутри туннеля не требует пробросов и не касается SIP ALG. ALG работает с открытым трафиком, а внутри туннеля всё зашифровано.</p>
<p>Правило простое: SIP ALG нужно отключить в любом случае. Внутри VPN он просто не вмешается, снаружи — не навредит.</p>
<h3>SIP через WireGuard</h3>
<pre><code class="language-bash">
# WireGuard настройка для SIP-трафика
# Пример: телефоны в офисе, Asterisk через WireGuard
# Интерфейс WireGuard
/interface wireguard add name=wg0 listen-port=51820
# Пир - Asterisk сервер
/interface wireguard peers add \
interface=wg0 \
public-key="SERVER_PUBLIC_KEY" \
allowed-address=10.0.0.0/24 \
endpoint-address=ASTERISK_SERVER_IP \
endpoint-port=51820 \
persistent-keepalive=25
# IP для WireGuard интерфейса
/ip address add address=10.0.0.1/24 interface=wg0
# Маршрут к Asterisk через WireGuard
/ip route add dst-address=10.0.0.2/32 gateway=wg0
# Firewall: разрешить WireGuard и SIP внутри туннеля
/ip firewall filter add \
chain=input \
protocol=udp \
dst-port=51820 \
action=accept \
comment="WireGuard"
/ip firewall filter add \
chain=forward \
in-interface=wg0 \
action=accept \
comment="Forward in WireGuard"
</code></pre>
<p>При SIP через WireGuard: SIP ALG отключить, DNAT для 5060 не нужен (трафик идёт через туннель), RTP-порты открывать только если внешний провайдер присылает RTP напрямую не через туннель.</p>
<h3>SIP через IPsec</h3>
<pre><code class="language-bash">
# Отключить SIP ALG - обязательно
/ip firewall service-port disable sip
# IPsec bypass для SIP ALG - ALG может мешать IPsec-пакетам
# Добавить в NAT bypass для IPsec-трафика
/ip firewall nat add \
chain=srcnat \
dst-address=IPSEC_REMOTE_NETWORK \
action=accept \
comment="IPsec bypass NAT" \
place-before=0
</code></pre>
<h3>Когда RTP можно не пробрасывать</h3>
<p>Если и SIP-клиент, и Asterisk находятся за одним NAT (внутри одной сети или оба подключены к одному VPN) — RTP идёт напрямую между ними. Проброс RTP нужен только для входящего трафика извне. Проверить: если входящие звонки работают со звуком без DNAT для RTP — пробрасывать не нужно.</p>
<h2 id="qos">QoS для SIP и RTP на MikroTik</h2>
<h3>Почему голос требует приоритизации</h3>
<p>Голосовой трафик чувствителен к задержкам и потерям. Джиттер больше 30ms — голос становится «деревянным». Потеря 5% пакетов — слышны артефакты. SIP-сигнализация менее критична, но задержка в регистрации раздражает.</p>
<h3>DSCP EF для RTP</h3>
<p>DSCP EF (Expedited Forwarding) — маркировка пакетов для голосового трафика. Правильные транзитные маршрутизаторы дадут приоритет таким пакетам.</p>
<pre><code class="language-bash">
# Mangle: пометить SIP DSCP CS3
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=5060-5061 \
action=change-dscp \
new-dscp=24 \
passthrough=yes \
comment="DSCP CS3 for SIP"
# Mangle: пометить RTP DSCP EF (46)
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=10000-20000 \
action=change-dscp \
new-dscp=46 \
passthrough=yes \
comment="DSCP EF for RTP"
</code></pre>
<h3>Queue Tree для приоритизации голоса</h3>
<pre><code class="language-bash">
# Mangle: отметить VoIP-трафик для очереди
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=5060-5061 \
action=mark-packet \
new-packet-mark=sip-packet \
passthrough=yes
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=10000-20000 \
action=mark-packet \
new-packet-mark=rtp-packet \
passthrough=yes
# Корневая очередь
/queue tree add name=WAN parent=ether1 max-limit=100M
# Голосовая очередь - высший приоритет
/queue tree add \
name=VoIP \
parent=WAN \
packet-mark=rtp-packet,sip-packet \
priority=1 \
max-limit=10M \
comment="VoIP priority queue"
# Остальной трафик
/queue tree add \
name=Other \
parent=WAN \
priority=8 \
max-limit=100M \
comment="Other traffic"
</code></pre>
<h3>Simple Queue для небольших сетей</h3>
<pre><code class="language-bash">
# Простой вариант через Simple Queue с Burst
/queue simple add \
name="VoIP-Priority" \
target=192.168.1.100/32 \
max-limit=10M/10M \
priority=1/1 \
comment="Asterisk VoIP priority"
</code></pre>
<h3>Что делать при потере пакетов и джиттере</h3>
<p>Если диагностика показывает потери или джиттер:</p>
<pre><code class="language-bash">
# Проверить очереди - смотри dropped пакеты
/queue tree print stats
/queue simple print stats
# Torch для анализа трафика в реальном времени
/tool torch interface=ether1 ip-protocol=udp port=5060
# Ping с малым интервалом для проверки джиттера
/ping 192.168.1.100 count=100 interval=10ms
</code></pre>
<p>Джиттер больше 30ms при полной очереди — увеличь max-limit или повысь приоритет VoIP относительно других очередей.</p>
<h2 id="platforms">Настройка под конкретные платформы</h2>
<h3>FreePBX за MikroTik</h3>
<p>В FreePBX: Admin — Asterisk SIP Settings.</p>
<ul>
<li><strong>External Address:</strong> внешний IP MikroTik (или FQDN)</li>
<li><strong>Local Networks:</strong> добавить 192.168.1.0/24</li>
<li><strong>NAT:</strong> Yes</li>
<li><strong>RTP port range:</strong> 10000-20000 (по умолчанию)</li>
</ul>
<p>На MikroTik: всё как в разделе «Полная конфигурация». RTP диапазон 10000-20000 совпадает.</p>
<pre><code class="language-bash">
# FreePBX специфика - часто использует порт 5160 для chan_pjsip
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5160 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5160 \
comment="DNAT pjsip to FreePBX"
</code></pre>
<h3>Asterisk за MikroTik</h3>
<p>В <code>/etc/asterisk/sip.conf</code> (chan_sip):</p>
<pre><code class="language-text">
[general]
externip=X.X.X.X
localnet=192.168.1.0/24
nat=force_rport,comedia
rtpstart=10000
rtpend=20000
</code></pre>
<p>В <code>/etc/asterisk/pjsip.conf</code> (chan_pjsip):</p>
<pre><code class="language-text">
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=X.X.X.X
external_signaling_address=X.X.X.X
local_net=192.168.1.0/24
</code></pre>
<h3>3CX за MikroTik</h3>
<p>3CX использует порты 5060, 5061 (TLS) и RTP 9000-10999. Это отличается от Asterisk.</p>
<pre><code class="language-bash">
# 3CX: DNAT для SIP
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.101 \
to-ports=5060 \
comment="DNAT SIP to 3CX"
# 3CX: DNAT для RTP (диапазон другой!)
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=9000-10999 \
action=dst-nat \
to-addresses=192.168.1.101 \
comment="DNAT RTP to 3CX"
# 3CX: разрешить RTP
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.101 \
dst-port=9000-10999 \
action=accept \
comment="Allow RTP to 3CX"
</code></pre>
<h3>Yeastar за MikroTik</h3>
<p>Yeastar S-серия и P-серия используют порты 5060 и RTP 10000-12000 по умолчанию. В веб-интерфейсе Yeastar: Settings — SIP — NAT — включить NAT и указать внешний IP MikroTik.</p>
<pre><code class="language-bash">
# Yeastar: DNAT
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.102 \
to-ports=5060 \
comment="DNAT SIP to Yeastar"
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=10000-12000 \
action=dst-nat \
to-addresses=192.168.1.102 \
comment="DNAT RTP to Yeastar"
</code></pre>
<h3>SIP-телефоны Yealink за MikroTik</h3>
<p>Yealink работают хорошо когда SIP ALG отключён и UDP timeout достаточный. На самом телефоне:</p>
<ul>
<li>Account — SIP Server Port: 5060</li>
<li>Account — NAT: включить</li>
<li>Account — Keep Alive Type: UDP (интервал 30 сек)</li>
</ul>
<p>Keep-alive каждые 30 секунд — при UDP timeout 60s регистрация не пропадёт.</p>
<h3>Grandstream за MikroTik</h3>
<p>Grandstream GXP/GXV серия: Account — NAT Traversal — STUN. Укажи STUN-сервер (stun.l.google.com:19302 или сервер провайдера). STUN поможет телефону определить внешний IP и правильно заполнить SDP.</p>
<p>С STUN и отключённым SIP ALG — Grandstream работают стабильно.</p>
<h3>SIP-провайдеры: Sipuni, Mango, Zadarma, Sipnet</h3>
<p>Для всех облачных провайдеров: SIP ALG отключить, UDP timeout 60s, masquerade настроен. DNAT для 5060 не нужен если у тебя только исходящие звонки и регистрация на провайдере (АТС во внутренней сети или на провайдере).</p>
<p>DNAT нужен только если внешний провайдер должен сам инициировать соединение к твоему серверу — то есть входящие звонки через DID (прямой номер).</p>
<h2 id="after-setup">Проверка после настройки</h2>
<h3>Чеклист</h3>
<pre><code class="language-bash">
# 1. SIP ALG отключён
/ip firewall service-port print
# Ожидаем: X 4 sip 5060,5061
# 2. UDP timeout достаточный
/ip firewall connection tracking print
# Ожидаем: udp-timeout=1m, udp-stream-timeout=2m или больше
# 3. DNAT для SIP настроен
/ip firewall nat print where chain=dstnat dst-port=5060
# Ожидаем: строку с action=dst-nat
# 4. DNAT для RTP настроен
/ip firewall nat print where chain=dstnat dst-port=10000-20000
# Ожидаем: строку с action=dst-nat
# 5. Masquerade работает
/ip firewall nat print stats where action=masquerade
# Ожидаем: счётчик packets растёт
# 6. RTP-порты разрешены в filter
/ip firewall filter print where dst-port~"10000"
# Ожидаем: строку с action=accept
# 7. Тестовый звонок в обе стороны
# Сделать звонок и проверить:
# - слышишь ты
# - слышат тебя
# - нет обрыва через 30 сек
# 8. Активные SIP-соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
# Ожидаем: соединения в состоянии established
</code></pre>
<h2 id="troubleshooting-table">Таблица диагностики SIP за MikroTik</h2>
<table>
<thead>
<tr>
<th>Симптом</th>
<th>Вероятная причина</th>
<th>Что проверить</th>
<th>Команда</th>
</tr>
</thead>
<tbody>
<tr>
<td>Нет звука совсем</td>
<td>RTP заблокирован или SIP ALG сломал SDP</td>
<td>Firewall filter, DNAT RTP, SIP ALG</td>
<td>/ip firewall filter print stats where action=drop</td>
</tr>
<tr>
<td>Односторонний звук</td>
<td>NAT / SDP issue, externip не настроен</td>
<td>SIP ALG, externip в Asterisk, masquerade</td>
<td>/ip firewall nat print stats where action=masquerade</td>
</tr>
<tr>
<td>Обрыв через 30-60 сек</td>
<td>UDP <a href="https://it-apteka.com/doh-server-connection-error-prichiny-i-reshenija-mikrotik-ssl-timeout/" title="DoH Server Connection Error: причины и решения (MikroTik, SSL, Timeout)" target="_blank" rel="noopener" data-wpil-monitor-id="1941">timeout в connection</a> tracking</td>
<td>udp-timeout, udp-stream-timeout</td>
<td>/ip firewall connection tracking print</td>
</tr>
<tr>
<td>Регистрация периодически пропадает</td>
<td>UDP timeout или SIP ALG переписывает Contact</td>
<td>service-port, udp-timeout</td>
<td>/ip firewall service-port print</td>
</tr>
<tr>
<td>Нет регистрации вообще</td>
<td>SIP ALG или firewall блокирует 5060</td>
<td>service-port sip, filter input chain</td>
<td>/tool sniffer quick port=5060</td>
</tr>
<tr>
<td>Входящие не проходят</td>
<td>Нет DNAT для 5060</td>
<td>dstnat chain, правило для порта 5060</td>
<td>/ip firewall nat print where chain=dstnat</td>
</tr>
<tr>
<td>Работает по LTE, не через провайдера</td>
<td>Провайдер тоже включил SIP ALG на своей стороне</td>
<td>Звонок провайдеру, SIP TLS как обходной путь</td>
<td>/tool sniffer quick port=5060 interface=ether1</td>
</tr>
<tr>
<td>После включения FastTrack — нет звука</td>
<td>RTP попал в FastTrack, обходит правила</td>
<td>FastTrack-правило, mangle для RTP</td>
<td>/ip firewall filter print where action=fasttrack-connection</td>
</tr>
<tr>
<td>SIP TLS не устанавливается</td>
<td>SIP ALG ломает TCP/TLS пакеты</td>
<td>service-port sip, filter tcp 5061</td>
<td>/ip firewall filter print stats where dst-port~»5061″</td>
</tr>
<tr>
<td>При failover звонки обрываются</td>
<td>Connection tracking не сброшен, старый NAT</td>
<td>Скрипт очистки connection tracking при failover</td>
<td>/ip firewall connection remove [find dst-port=5060]</td>
</tr>
</tbody>
</table>
<h2 id="troubleshooting">Troubleshooting: детальный разбор</h2>
<h3>Нет звука совсем</h3>
<pre><code class="language-bash">
# Шаг 1: проверить SIP ALG
/ip firewall service-port print
# sip должен иметь флаг X
# Шаг 2: посмотреть что дропается
/ip firewall filter print stats where action=drop
# Если счётчик растёт - смотри имя правила
# Шаг 3: захватить SIP-трафик и посмотреть SDP
/tool sniffer quick port=5060 ip-address=192.168.1.100
# В SDP ищи строку c= и m= - там должен быть правильный IP
# Шаг 4: проверить RTP
/ip firewall filter print where dst-port~"10000"
# Правило accept для 10000-20000 должно быть
</code></pre>
<h3>Односторонний звук</h3>
<p>Слышишь ты — тебя нет. Это значит исходящий RTP работает (твой голос уходит), входящий RTP не доходит (чужой голос не приходит).</p>
<pre><code class="language-bash">
# Проверить masquerade - он должен подставлять правильный внешний IP
/ip firewall nat print stats where action=masquerade
# Проверить что externip в Asterisk совпадает с внешним IP MikroTik
# На Asterisk: cat /etc/asterisk/sip.conf | grep externip
# Проверить DNAT для входящего RTP
/ip firewall nat print where chain=dstnat dst-port~"10000"
</code></pre>
<h3>Звонок обрывается через 30 секунд</h3>
<p>Классика. UDP timeout по умолчанию 10 секунд в старых версиях RouterOS, 30 секунд в новых. SIP re-INVITE приходит позже.</p>
<pre><code class="language-bash">
# Исправление
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# Проверить текущее значение
/ip firewall connection tracking print
# Смотри udp-timeout и udp-stream-timeout
# Посмотреть активные SIP соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
</code></pre>
<h3>SIP работает по LTE, но не через провайдера</h3>
<p>Часто это означает что провайдер тоже включил SIP ALG на своём оборудовании. Это его собственный ALG — ты его не отключишь.</p>
<p>Обходные пути: SIP TLS (порт 5061, зашифрован — провайдерский ALG не видит содержимое), нестандартный порт SIP (5080, 5090), VPN-туннель до АТС.</p>
<pre><code class="language-bash">
# Захватить трафик и посмотреть что происходит с SIP-заголовками
/tool sniffer quick port=5060 interface=ether1
# Если видишь пакеты с изменёнными заголовками - провайдер вмешивается
</code></pre>
<h2 id="diagnostics">Инструменты диагностики</h2>
<h3>Packet Sniffer</h3>
<pre><code class="language-bash">
# Захват SIP-пакетов
/tool sniffer quick port=5060
# Захват с фильтром по IP
/tool sniffer quick port=5060 ip-address=192.168.1.100
# Захват RTP трафика
/tool sniffer quick port=10000-20000 ip-address=192.168.1.100
# Остановить
/tool sniffer stop
</code></pre>
<h3>Torch — реальное время</h3>
<pre><code class="language-bash">
# Смотреть SIP-трафик на WAN
/tool torch interface=ether1 ip-protocol=udp
# С фильтром по порту
/tool torch interface=ether1 port=5060
</code></pre>
<h3>Connection tracking</h3>
<pre><code class="language-bash">
# Активные SIP соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
# Все UDP соединения
/ip firewall connection print where protocol=udp
# Количество активных соединений
/ip firewall connection print count-only
</code></pre>
<h2 id="cheatsheet">Шпаргалка команд</h2>
<pre><code class="language-bash">
# ===== ДИАГНОСТИКА =====
# Статус SIP ALG
/ip firewall service-port print
# Таймауты connection tracking
/ip firewall connection tracking print
# Активные SIP соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
# Что дропается
/ip firewall filter print stats where action=drop
# NAT правила
/ip firewall nat print
# Захват SIP
/tool sniffer quick port=5060
# ===== ИСПРАВЛЕНИЕ =====
# Отключить SIP ALG
/ip firewall service-port disable sip
# Увеличить UDP таймауты
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# DNAT SIP на Asterisk
/ip firewall nat add chain=dstnat in-interface=ether1 protocol=udp dst-port=5060 action=dst-nat to-addresses=192.168.1.100 to-ports=5060
# DNAT RTP на Asterisk
/ip firewall nat add chain=dstnat in-interface=ether1 protocol=udp dst-port=10000-20000 action=dst-nat to-addresses=192.168.1.100
# Разрешить RTP в filter
/ip firewall filter add chain=forward protocol=udp dst-port=10000-20000 action=accept comment="RTP VoIP" place-before=0
# Очистить SIP-соединения (при failover)
/ip firewall connection remove [find dst-port=5060]
# ===== ПРОВЕРКА =====
# SIP ALG отключён - должен быть флаг X
/ip firewall service-port print
# Masquerade работает - счётчик растёт
/ip firewall nat print stats where action=masquerade
# RTP открыт
/ip firewall filter print where dst-port~"10000"
# UDP timeout 60s или больше
/ip firewall connection tracking print
</code></pre>
<h2 id="faq">FAQ</h2>
<h3>Почему нет звука только в одну сторону?</h3>
<p>Односторонний звук — классический признак NAT-проблемы. Одно направление RTP доходит, другое — нет. Чаще всего: externip в Asterisk не совпадает с внешним IP MikroTik, или нет DNAT для входящего RTP. Проверь <code>/ip firewall nat print where chain=dstnat</code> — правило для 10000-20000 должно быть. Проверь externip/external_media_address в конфиге Asterisk.</p>
<h3>Почему звонок обрывается через 32 секунды?</h3>
<p>UDP timeout. MikroTik закрыл NAT-запись раньше чем SIP прислал re-INVITE или keep-alive. Исправление одной командой: <code>/ip firewall connection tracking set udp-timeout=60s</code>. Значение 32 секунды специфично для старых версий RouterOS — в новых дефолт выше, но всё равно может не хватать.</p>
<h3>Нужно ли открывать порт 5061?</h3>
<p>Только если используешь SIP TLS. Обычный SIP работает на 5060/UDP. SIP TLS использует 5061/TCP. Если у тебя нет TLS — порт 5061 не нужен. Если есть — добавь DNAT для 5061/TCP.</p>
<h3>Нужен ли STUN если отключён SIP ALG?</h3>
<p>Зависит от настройки АТС. Если Asterisk настроен с правильным externip и localnet — STUN не нужен. Если используешь сторонние SIP-телефоны напрямую без АТС — STUN помогает телефону узнать свой внешний IP. Для АТС за MikroTik: настрой externip в Asterisk, STUN опционален.</p>
<h3>Какой RTP range использовать для FreePBX?</h3>
<p>По умолчанию FreePBX и Asterisk используют 10000-20000/UDP. Проверить в FreePBX: Admin — Asterisk SIP Settings — RTP Settings. Пробрасывай именно тот диапазон который указан там — не угадывай.</p>
<h3>Почему SIP работает по LTE, но не работает через провайдера?</h3>
<p>Провайдер включил SIP ALG на своём оборудовании. LTE-оператор этого не делает или делает меньше. Решение: SIP TLS (5061/TCP — провайдерский ALG не видит содержимое зашифрованного пакета) или VPN-туннель до АТС. Позвони провайдеру и попроси отключить SIP ALG — иногда это возможно.</p>
<h3>Нужно ли отключать SIP ALG у провайдера или только на MikroTik?</h3>
<p>В идеале — у всех на пути. На MikroTik ты управляешь сам. У провайдера — по запросу, не всегда дают. Если провайдер не отключает — используй SIP TLS или VPN, чтобы трафик был зашифрован и провайдерский ALG не мог вмешаться.</p>
<h3>Нужно ли пробрасывать RTP если телефоны внутри сети и АТС тоже внутри?</h3>
<p>Нет. DNAT для RTP нужен только для входящего трафика из интернета. Если и телефоны, и Asterisk в одной локальной сети — RTP идёт напрямую между ними без NAT. Проброс нужен когда внешний SIP-провайдер должен доставить RTP до твоего Asterisk за NAT.</p>
<h2 id="conclusion">Итог: три действия которые решают 90% проблем</h2>
<p>Если SIP-телефония за MikroTik работает плохо — действуем по порядку:</p>
<ol>
<li><strong>Отключить SIP ALG</strong> — <code>/ip firewall service-port disable sip</code>. Первое и главное. В большинстве случаев уже это решает проблему.</li>
<li><strong>Открыть RTP-порты и настроить DNAT</strong> — если нужен входящий трафик. Без этого звук будет только исходящий.</li>
<li><strong>Увеличить UDP timeout</strong> — <code>/ip firewall connection tracking set udp-timeout=60s</code>. Решает обрывы через 30 секунд и пропадание регистрации.</li>
</ol>
<p>FastTrack, QoS, dual-WAN, SIP TLS — это тюнинг поверх рабочей базы. Сначала работающая телефония, потом оптимизация.</p>
<p>Если после всех настроек что-то не работает — пиши в комментарии схему подключения, версию RouterOS и симптомы. Разберёмся.</p>
"Официальная
<br />
MikroTik — SIP ALG и service-port: wiki.mikrotik.com/wiki/Manual:IP/Firewall/Service_Ports</p>
<p>MikroTik — Connection Tracking: wiki.mikrotik.com/wiki/Manual:IP/Firewall/Connection_tracking</p>
<p><a href="https://it-apteka.com/install-asterisk-full-manual/" title="Asterisk с нуля: установка, настройка и запуск IP-телефонии на сервере" target="_blank" rel="noopener" data-wpil-monitor-id="1944">Asterisk — NAT настройка</a>: wiki.asterisk.org/wiki/display/AST/Configuring+res_pjsip+to+work+through+NAT</p>
<p>FreePBX — SIP Settings: wiki.freepbx.org/display/FPG/Asterisk+SIP+Settings+User+Guide<br />
Что получим
В 90% случаев проблемы с SIP за MikroTik решает одна команда: /ip firewall service-port disable sip. Дальше — UDP timeout, RTP-порты и DNAT до Asterisk или FreePBX. Статья покрывает RouterOS v6 и v7, схемы с FastTrack, VPN, dual-WAN, SIP TLS и QoS. Команды проверены в продакшне.
Для кого эта статья
Ты администрируешь сеть с
MikroTik и IP-телефонией. У тебя Asterisk, FreePBX, 3CX или любая другая АТС за NAT. Или SIP-провайдер — Sipuni, Mango, Zadarma — и IP-телефоны в офисе. Статья подходит для RouterOS 6.x и 7.x, отличия между версиями вынесены в отдельный раздел.
Симптомы - если хоть два совпали, читай дальше
— Телефон зарегистрирован, но звука нет совсем
— Слышишь только ты, тебя не слышат — или наоборот
— Звонок обрывается ровно через 30-60 секунд
— SIP-регистрация периодически пропадает сама по себе
— Входящие звонки не проходят, исходящие работают
— SIP работает через LTE, но не работает через провайдера
— После замены
роутера на MikroTik телефония перестала работать
Что такое SIP ALG и почему он ломает VoIP
SIP ALG (Application Layer Gateway) — механизм в RouterOS, который работает на уровне приложений и умеет разбирать SIP-протокол. Когда через MikroTik проходит SIP-пакет, ALG перехватывает его, анализирует содержимое и пытается исправить IP-адреса внутри SIP-заголовков и SDP-тела.
Задумывался он для решения классической проблемы VoIP за NAT: SIP-телефон внутри сети отправляет в пакете свой локальный IP (192.168.x.x), который снаружи бесполезен. ALG должен подменить этот адрес на внешний IP роутера, чтобы АТС знала куда слать RTP-поток с аудио.
Звучит разумно. Но вот почему это ломается:
- Облачные АТС сами справляются с NAT. Asterisk, FreePBX, 3CX, Sipuni, Mango — все они работают через STUN, ICE или фиксированный external IP. Когда ALG лезет со своими «исправлениями» поверх — получается каша из адресов.
- Зашифрованный SIP (TLS/SRTP). ALG не может расшифровать содержимое. Либо ломает пакет, либо пропускает непредсказуемо.
- Нестандартные порты. ALG ориентируется на порт 5060. Если АТС работает на 5080 или 5061 — ALG не вмешается. Непоследовательное поведение.
- VPN + SIP. SIP идёт через туннель — ALG видит зашифрованные данные и делает что-то неожиданное.
- Несколько SIP-транков. ALG не умеет разбираться в сложных схемах с несколькими потоками одновременно.
SIP ALG — реликт эпохи, когда SIP-устройства не умели работать с NAT сами. Сегодня он приносит больше вреда, чем пользы. Первое действие при любых проблемах с VoIP за MikroTik — отключить его.
Проверка: включён ли SIP ALG
/ip firewall service-port print
SIP ALG включён — проблема есть:
Flags: X - disabled
# NAME PORTS
0 ftp 21
1 tftp 69
2 irc 6667
3 h323 1720
4 sip 5060,5061
5 pptp 1723
SIP ALG отключён — правильное состояние:
Flags: X - disabled
# NAME PORTS
...
X 4 sip 5060,5061
Флаг X перед sip — отключён.
Как отключить SIP ALG на MikroTik
/ip firewall service-port disable sip
Проверить:
/ip firewall service-port print
Через WinBox: IP — Firewall — Service Ports — находим sip — снимаем галочку Enabled — Apply.
Изменение вступает в силу немедленно, без перезагрузки. Активные SIP-сессии кратковременно прерываются — телефоны перерегистрируются. Лучше делать в нерабочее время.
RouterOS v7: что изменилось для SIP
Где находится SIP Helper в RouterOS 7
В RouterOS 7 команда та же:
/ip firewall service-port disable sip
Но в v7 появилось несколько изменений, которые влияют на SIP.
Connection Tracking в RouterOS 7
В v7 connection tracking вынесен в отдельный раздел и имеет расширенный синтаксис:
# RouterOS 6
/ip firewall connection tracking set udp-timeout=60s
# RouterOS 7 - тот же синтаксис, но появились новые параметры
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# Посмотреть все параметры
/ip firewall connection tracking print
В v7 появился параметр loose-tcp-tracking — для SIP over TCP он не нужен, но знать стоит.
FastTrack в RouterOS 7
В RouterOS 7 FastTrack изменил поведение. Теперь он работает на уровне hardware offload и может быть более агрессивным в отношении обхода правил mangle и queue. Если настроен QoS для VoIP через Mangle/Queue Tree — FastTrack нужно исключать явно.
# RouterOS 7: исключить SIP и RTP из FastTrack
# Добавить в Mangle ПЕРЕД FastTrack-правилом
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=5060-5061 \
action=mark-connection \
new-connection-mark=sip \
passthrough=yes \
comment="Mark SIP connections"
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=10000-20000 \
action=mark-connection \
new-connection-mark=rtp \
passthrough=yes \
comment="Mark RTP connections"
# FastTrack только для не-SIP/RTP соединений
/ip firewall filter add \
chain=forward \
connection-mark=!sip \
connection-mark=!rtp \
connection-state=established,related \
action=fasttrack-connection \
comment="FastTrack non-VoIP"
Routing tables и policy routing в RouterOS 7
В RouterOS 7 routing tables работают иначе. Если используешь policy routing для SIP-трафика (например, направить SIP через конкретного провайдера):
# RouterOS 7: создать routing table для SIP
/routing table add name=voip-table fib
# Добавить маршрут через нужного провайдера
/ip route add dst-address=0.0.0.0/0 gateway=ISP1_GW routing-table=voip-table
# Mangle: направить SIP через voip-table
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=5060-5061 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="Route SIP via ISP1"
# RTP направить туда же
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=10000-20000 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="Route RTP via ISP1"
Полная конфигурация MikroTik для SIP телефонии
Архитектура: MikroTik + Asterisk за NAT
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 60}
}}%%
flowchart TD
A["Интернет - SIP провайдер"] --> B["MikroTik WAN - ether1 X.X.X.X"]
B --> C["MikroTik LAN - 192.168.1.1/24"]
C --> D["Asterisk / FreePBX - 192.168.1.100:5060"]
C --> E["IP-телефоны - 192.168.1.x"]
D --> E
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Шаг 1: отключить SIP ALG
/ip firewall service-port disable sip
Шаг 2: настроить NAT masquerade
/ip firewall nat add \
chain=srcnat \
out-interface=ether1 \
action=masquerade \
comment="NAT masquerade"
Если masquerade уже есть — пропускай этот шаг.
Шаг 3: DNAT для SIP сигнализации
# SIP UDP - основной протокол
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5060 \
comment="DNAT SIP UDP to Asterisk"
# SIP TCP - некоторые провайдеры и телефоны используют TCP
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=tcp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5060 \
comment="DNAT SIP TCP to Asterisk"
# SIP TLS (порт 5061) - если используется
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=tcp \
dst-port=5061 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5061 \
comment="DNAT SIP TLS to Asterisk"
Шаг 4: открыть и пробросить RTP-порты
# Разрешить входящий RTP
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.100 \
dst-port=10000-20000 \
action=accept \
comment="RTP to Asterisk" \
place-before=0
# DNAT для входящего RTP на Asterisk
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=10000-20000 \
action=dst-nat \
to-addresses=192.168.1.100 \
comment="DNAT RTP to Asterisk"
RTP-диапазон 10000-20000 — стандарт для Asterisk и FreePBX. Для 3CX — 9000-10999. Для Yeastar — смотри в настройках. Уточняй у своей АТС.
Шаг 5: увеличить UDP timeout
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# Проверить
/ip firewall connection tracking print
Шаг 6: разрешающие правила в filter
# Разрешить SIP на вход роутера (если АТС - сам MikroTik)
/ip firewall filter add \
chain=input \
protocol=udp \
dst-port=5060 \
action=accept \
comment="Allow SIP input"
# Разрешить SIP форвард к Asterisk
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.100 \
dst-port=5060 \
action=accept \
comment="Allow SIP to Asterisk"
# Разрешить RTP форвард к Asterisk
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.100 \
dst-port=10000-20000 \
action=accept \
comment="Allow RTP to Asterisk"
FastTrack и SIP: как исключить VoIP
FastTrack ускоряет маршрутизацию, но пакеты в FastTrack-сессиях обходят mangle, queue и часть filter-правил. Если VoIP-трафик попал в FastTrack — QoS и некоторые NAT-правила перестают работать.
Как проверить — есть ли FastTrack:
/ip firewall filter print where action=fasttrack-connection
Если строки есть — FastTrack активен. Исключаем SIP и RTP:
# Поставить ПЕРЕД правилом fasttrack-connection
# Отметить SIP и RTP соединения чтобы они не попадали в FastTrack
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-port=5060-5061 \
action=accept \
comment="SIP - bypass FastTrack" \
place-before=0
/ip firewall filter add \
chain=forward \
protocol=udp \
src-port=5060-5061 \
action=accept \
comment="SIP response - bypass FastTrack" \
place-before=1
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-port=10000-20000 \
action=accept \
comment="RTP - bypass FastTrack" \
place-before=2
Важно: правила accept до FastTrack не отменяют FastTrack для этих пакетов напрямую. В RouterOS 7 правильный способ — через Mangle и connection-mark (показан в разделе RouterOS v7 выше).
SIP over TLS и SRTP за MikroTik
Почему SIP ALG особенно опасен для TLS
SIP ALG работает с открытым текстом. SIP TLS — зашифрованный трафик на порту 5061/TCP. ALG не может расшифровать содержимое, поэтому ведёт себя непредсказуемо: может пропустить пакет как есть, может обрезать его, может переписать заголовки которые не должен трогать.
Результат: при включённом SIP ALG — TLS-соединения либо не устанавливаются, либо устанавливаются но ломаются при первом re-INVITE.
Порты для SIP TLS и SRTP
| Протокол |
Порт |
Транспорт |
Назначение |
| SIP |
5060 |
UDP / TCP |
Стандартная сигнализация (открытый текст) |
| SIP TLS |
5061 |
TCP |
Зашифрованная сигнализация |
| RTP |
10000-20000 |
UDP |
Аудиопоток (открытый текст) |
| SRTP |
10000-20000 |
UDP |
Зашифрованный аудиопоток (те же порты) |
SRTP использует те же порты что и RTP — шифрование на уровне содержимого пакета, не порта. Поэтому правила файрвола для RTP и SRTP — одинаковые.
Настройка MikroTik для SIP TLS
# 1. Отключить SIP ALG - обязательно
/ip firewall service-port disable sip
# 2. DNAT для 5061/TCP на Asterisk
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=tcp \
dst-port=5061 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5061 \
comment="DNAT SIP TLS to Asterisk"
# 3. Разрешить 5061/TCP форвард
/ip firewall filter add \
chain=forward \
protocol=tcp \
dst-address=192.168.1.100 \
dst-port=5061 \
action=accept \
comment="Allow SIP TLS to Asterisk"
# 4. SRTP - те же правила что для RTP
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=10000-20000 \
action=dst-nat \
to-addresses=192.168.1.100 \
comment="DNAT SRTP to Asterisk"
Как не ломать TLS-сертификаты
MikroTik не должен терминировать TLS SIP — он должен пропускать TCP-соединение насквозь. Никакого SSL inspection на порту 5061. Если у тебя настроен transparent proxy или SSL inspection — добавь 5061/TCP в исключения.
Проверить что 5061 проходит насквозь:
# Захват TLS-трафика на WAN
/tool sniffer quick port=5061 interface=ether1
# Если пакеты видны - MikroTik их пропускает
# Если нет - проверяй firewall filter
/ip firewall filter print stats where dst-port~"5061"
SIP при dual-WAN и failover
Что происходит с SIP при переключении провайдера
SIP-сессия привязана к IP-адресу и NAT-записи. При failover меняется внешний IP — старые NAT-записи становятся невалидными. Активные звонки обрываются. Телефоны, которые были зарегистрированы через провайдера 1, теряют регистрацию.
Это не баг MikroTik — это природа SIP и UDP.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 60}
}}%%
flowchart TD
A["ISP1 - основной"] --> B["MikroTik"]
C["ISP2 - резервный"] --> B
B --> D["Asterisk - 192.168.1.100"]
B --> E["Failover скрипт"]
E --> F["Очистить connection tracking"]
E --> G["Переключить маршрут на ISP2"]
E --> H["Asterisk перерегистрируется через ISP2"]
style A fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style C fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#475569
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style F fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#991b1b
Очистка connection tracking при failover
При переключении провайдера нужно сбросить старые NAT-записи, чтобы SIP перерегистрировался с новым IP:
# Скрипт failover - добавь это в свой скрипт переключения
# Очистить все SIP-соединения
/ip firewall connection remove [find dst-port=5060 or src-port=5060]
# Очистить все UDP-соединения (включая RTP)
# Осторожно - это сбросит все UDP-сессии, включая DNS
/ip firewall connection remove [find protocol=udp]
# Мягче - только SIP и RTP
/ip firewall connection remove [find dst-port=5060]
/ip firewall connection remove [find src-port=5060]
/ip firewall connection remove [find dst-port~"1[0-9][0-9][0-9][0-9]" protocol=udp]
Recursive routing для SIP failover
Recursive routing в MikroTik позволяет автоматически переключать маршрут когда провайдер недоступен. Для SIP важно чтобы весь SIP-трафик шёл через одного провайдера — не балансировался между двумя.
# RouterOS 7: привязать SIP к ISP1 через policy routing
/routing table add name=voip-table fib
# Маршрут для SIP через ISP1
/ip route add dst-address=0.0.0.0/0 gateway=ISP1_GW routing-table=voip-table distance=1
/ip route add dst-address=0.0.0.0/0 gateway=ISP2_GW routing-table=voip-table distance=10
# Mangle: весь SIP через voip-table
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=5060-5061 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="SIP via ISP1"
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
src-port=5060-5061 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=10000-20000 \
action=mark-routing \
new-routing-mark=voip-table \
passthrough=no \
comment="RTP via ISP1"
Persistent NAT для VoIP
Persistent NAT гарантирует что SIP-сессия от одного источника всегда выходит через один и тот же внешний порт — это важно для регистрации:
# Для Asterisk - srcnat с фиксированным исходящим адресом
/ip firewall nat add \
chain=srcnat \
src-address=192.168.1.100 \
out-interface=ether1 \
action=src-nat \
to-addresses=X.X.X.X \
comment="Persistent NAT for Asterisk"
SIP через VPN
Когда SIP в туннеле — это правильно
Если АТС и телефоны соединены через VPN-туннель — SIP-трафик внутри туннеля не требует пробросов и не касается SIP ALG. ALG работает с открытым трафиком, а внутри туннеля всё зашифровано.
Правило простое: SIP ALG нужно отключить в любом случае. Внутри VPN он просто не вмешается, снаружи — не навредит.
SIP через WireGuard
# WireGuard настройка для SIP-трафика
# Пример: телефоны в офисе, Asterisk через WireGuard
# Интерфейс WireGuard
/interface wireguard add name=wg0 listen-port=51820
# Пир - Asterisk сервер
/interface wireguard peers add \
interface=wg0 \
public-key="SERVER_PUBLIC_KEY" \
allowed-address=10.0.0.0/24 \
endpoint-address=ASTERISK_SERVER_IP \
endpoint-port=51820 \
persistent-keepalive=25
# IP для WireGuard интерфейса
/ip address add address=10.0.0.1/24 interface=wg0
# Маршрут к Asterisk через WireGuard
/ip route add dst-address=10.0.0.2/32 gateway=wg0
# Firewall: разрешить WireGuard и SIP внутри туннеля
/ip firewall filter add \
chain=input \
protocol=udp \
dst-port=51820 \
action=accept \
comment="WireGuard"
/ip firewall filter add \
chain=forward \
in-interface=wg0 \
action=accept \
comment="Forward in WireGuard"
При SIP через WireGuard: SIP ALG отключить, DNAT для 5060 не нужен (трафик идёт через туннель), RTP-порты открывать только если внешний провайдер присылает RTP напрямую не через туннель.
SIP через IPsec
# Отключить SIP ALG - обязательно
/ip firewall service-port disable sip
# IPsec bypass для SIP ALG - ALG может мешать IPsec-пакетам
# Добавить в NAT bypass для IPsec-трафика
/ip firewall nat add \
chain=srcnat \
dst-address=IPSEC_REMOTE_NETWORK \
action=accept \
comment="IPsec bypass NAT" \
place-before=0
Когда RTP можно не пробрасывать
Если и SIP-клиент, и Asterisk находятся за одним NAT (внутри одной сети или оба подключены к одному VPN) — RTP идёт напрямую между ними. Проброс RTP нужен только для входящего трафика извне. Проверить: если входящие звонки работают со звуком без DNAT для RTP — пробрасывать не нужно.
QoS для SIP и RTP на MikroTik
Почему голос требует приоритизации
Голосовой трафик чувствителен к задержкам и потерям. Джиттер больше 30ms — голос становится «деревянным». Потеря 5% пакетов — слышны артефакты. SIP-сигнализация менее критична, но задержка в регистрации раздражает.
DSCP EF для RTP
DSCP EF (Expedited Forwarding) — маркировка пакетов для голосового трафика. Правильные транзитные маршрутизаторы дадут приоритет таким пакетам.
# Mangle: пометить SIP DSCP CS3
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=5060-5061 \
action=change-dscp \
new-dscp=24 \
passthrough=yes \
comment="DSCP CS3 for SIP"
# Mangle: пометить RTP DSCP EF (46)
/ip firewall mangle add \
chain=prerouting \
protocol=udp \
dst-port=10000-20000 \
action=change-dscp \
new-dscp=46 \
passthrough=yes \
comment="DSCP EF for RTP"
Queue Tree для приоритизации голоса
# Mangle: отметить VoIP-трафик для очереди
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=5060-5061 \
action=mark-packet \
new-packet-mark=sip-packet \
passthrough=yes
/ip firewall mangle add \
chain=forward \
protocol=udp \
dst-port=10000-20000 \
action=mark-packet \
new-packet-mark=rtp-packet \
passthrough=yes
# Корневая очередь
/queue tree add name=WAN parent=ether1 max-limit=100M
# Голосовая очередь - высший приоритет
/queue tree add \
name=VoIP \
parent=WAN \
packet-mark=rtp-packet,sip-packet \
priority=1 \
max-limit=10M \
comment="VoIP priority queue"
# Остальной трафик
/queue tree add \
name=Other \
parent=WAN \
priority=8 \
max-limit=100M \
comment="Other traffic"
Simple Queue для небольших сетей
# Простой вариант через Simple Queue с Burst
/queue simple add \
name="VoIP-Priority" \
target=192.168.1.100/32 \
max-limit=10M/10M \
priority=1/1 \
comment="Asterisk VoIP priority"
Что делать при потере пакетов и джиттере
Если диагностика показывает потери или джиттер:
# Проверить очереди - смотри dropped пакеты
/queue tree print stats
/queue simple print stats
# Torch для анализа трафика в реальном времени
/tool torch interface=ether1 ip-protocol=udp port=5060
# Ping с малым интервалом для проверки джиттера
/ping 192.168.1.100 count=100 interval=10ms
Джиттер больше 30ms при полной очереди — увеличь max-limit или повысь приоритет VoIP относительно других очередей.
FreePBX за MikroTik
В FreePBX: Admin — Asterisk SIP Settings.
- External Address: внешний IP MikroTik (или FQDN)
- Local Networks: добавить 192.168.1.0/24
- NAT: Yes
- RTP port range: 10000-20000 (по умолчанию)
На MikroTik: всё как в разделе «Полная конфигурация». RTP диапазон 10000-20000 совпадает.
# FreePBX специфика - часто использует порт 5160 для chan_pjsip
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5160 \
action=dst-nat \
to-addresses=192.168.1.100 \
to-ports=5160 \
comment="DNAT pjsip to FreePBX"
Asterisk за MikroTik
В /etc/asterisk/sip.conf (chan_sip):
[general]
externip=X.X.X.X
localnet=192.168.1.0/24
nat=force_rport,comedia
rtpstart=10000
rtpend=20000
В /etc/asterisk/pjsip.conf (chan_pjsip):
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=X.X.X.X
external_signaling_address=X.X.X.X
local_net=192.168.1.0/24
3CX за MikroTik
3CX использует порты 5060, 5061 (TLS) и RTP 9000-10999. Это отличается от Asterisk.
# 3CX: DNAT для SIP
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.101 \
to-ports=5060 \
comment="DNAT SIP to 3CX"
# 3CX: DNAT для RTP (диапазон другой!)
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=9000-10999 \
action=dst-nat \
to-addresses=192.168.1.101 \
comment="DNAT RTP to 3CX"
# 3CX: разрешить RTP
/ip firewall filter add \
chain=forward \
protocol=udp \
dst-address=192.168.1.101 \
dst-port=9000-10999 \
action=accept \
comment="Allow RTP to 3CX"
Yeastar за MikroTik
Yeastar S-серия и P-серия используют порты 5060 и RTP 10000-12000 по умолчанию. В веб-интерфейсе Yeastar: Settings — SIP — NAT — включить NAT и указать внешний IP MikroTik.
# Yeastar: DNAT
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=5060 \
action=dst-nat \
to-addresses=192.168.1.102 \
to-ports=5060 \
comment="DNAT SIP to Yeastar"
/ip firewall nat add \
chain=dstnat \
in-interface=ether1 \
protocol=udp \
dst-port=10000-12000 \
action=dst-nat \
to-addresses=192.168.1.102 \
comment="DNAT RTP to Yeastar"
SIP-телефоны Yealink за MikroTik
Yealink работают хорошо когда SIP ALG отключён и UDP timeout достаточный. На самом телефоне:
- Account — SIP Server Port: 5060
- Account — NAT: включить
- Account — Keep Alive Type: UDP (интервал 30 сек)
Keep-alive каждые 30 секунд — при UDP timeout 60s регистрация не пропадёт.
Grandstream за MikroTik
Grandstream GXP/GXV серия: Account — NAT Traversal — STUN. Укажи STUN-сервер (stun.l.google.com:19302 или сервер провайдера). STUN поможет телефону определить внешний IP и правильно заполнить SDP.
С STUN и отключённым SIP ALG — Grandstream работают стабильно.
SIP-провайдеры: Sipuni, Mango, Zadarma, Sipnet
Для всех облачных провайдеров: SIP ALG отключить, UDP timeout 60s, masquerade настроен. DNAT для 5060 не нужен если у тебя только исходящие звонки и регистрация на провайдере (АТС во внутренней сети или на провайдере).
DNAT нужен только если внешний провайдер должен сам инициировать соединение к твоему серверу — то есть входящие звонки через DID (прямой номер).
Проверка после настройки
Чеклист
# 1. SIP ALG отключён
/ip firewall service-port print
# Ожидаем: X 4 sip 5060,5061
# 2. UDP timeout достаточный
/ip firewall connection tracking print
# Ожидаем: udp-timeout=1m, udp-stream-timeout=2m или больше
# 3. DNAT для SIP настроен
/ip firewall nat print where chain=dstnat dst-port=5060
# Ожидаем: строку с action=dst-nat
# 4. DNAT для RTP настроен
/ip firewall nat print where chain=dstnat dst-port=10000-20000
# Ожидаем: строку с action=dst-nat
# 5. Masquerade работает
/ip firewall nat print stats where action=masquerade
# Ожидаем: счётчик packets растёт
# 6. RTP-порты разрешены в filter
/ip firewall filter print where dst-port~"10000"
# Ожидаем: строку с action=accept
# 7. Тестовый звонок в обе стороны
# Сделать звонок и проверить:
# - слышишь ты
# - слышат тебя
# - нет обрыва через 30 сек
# 8. Активные SIP-соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
# Ожидаем: соединения в состоянии established
Таблица диагностики SIP за MikroTik
| Симптом |
Вероятная причина |
Что проверить |
Команда |
| Нет звука совсем |
RTP заблокирован или SIP ALG сломал SDP |
Firewall filter, DNAT RTP, SIP ALG |
/ip firewall filter print stats where action=drop |
| Односторонний звук |
NAT / SDP issue, externip не настроен |
SIP ALG, externip в Asterisk, masquerade |
/ip firewall nat print stats where action=masquerade |
| Обрыв через 30-60 сек |
UDP timeout в connection tracking |
udp-timeout, udp-stream-timeout |
/ip firewall connection tracking print |
| Регистрация периодически пропадает |
UDP timeout или SIP ALG переписывает Contact |
service-port, udp-timeout |
/ip firewall service-port print |
| Нет регистрации вообще |
SIP ALG или firewall блокирует 5060 |
service-port sip, filter input chain |
/tool sniffer quick port=5060 |
| Входящие не проходят |
Нет DNAT для 5060 |
dstnat chain, правило для порта 5060 |
/ip firewall nat print where chain=dstnat |
| Работает по LTE, не через провайдера |
Провайдер тоже включил SIP ALG на своей стороне |
Звонок провайдеру, SIP TLS как обходной путь |
/tool sniffer quick port=5060 interface=ether1 |
| После включения FastTrack — нет звука |
RTP попал в FastTrack, обходит правила |
FastTrack-правило, mangle для RTP |
/ip firewall filter print where action=fasttrack-connection |
| SIP TLS не устанавливается |
SIP ALG ломает TCP/TLS пакеты |
service-port sip, filter tcp 5061 |
/ip firewall filter print stats where dst-port~»5061″ |
| При failover звонки обрываются |
Connection tracking не сброшен, старый NAT |
Скрипт очистки connection tracking при failover |
/ip firewall connection remove [find dst-port=5060] |
Troubleshooting: детальный разбор
Нет звука совсем
# Шаг 1: проверить SIP ALG
/ip firewall service-port print
# sip должен иметь флаг X
# Шаг 2: посмотреть что дропается
/ip firewall filter print stats where action=drop
# Если счётчик растёт - смотри имя правила
# Шаг 3: захватить SIP-трафик и посмотреть SDP
/tool sniffer quick port=5060 ip-address=192.168.1.100
# В SDP ищи строку c= и m= - там должен быть правильный IP
# Шаг 4: проверить RTP
/ip firewall filter print where dst-port~"10000"
# Правило accept для 10000-20000 должно быть
Односторонний звук
Слышишь ты — тебя нет. Это значит исходящий RTP работает (твой голос уходит), входящий RTP не доходит (чужой голос не приходит).
# Проверить masquerade - он должен подставлять правильный внешний IP
/ip firewall nat print stats where action=masquerade
# Проверить что externip в Asterisk совпадает с внешним IP MikroTik
# На Asterisk: cat /etc/asterisk/sip.conf | grep externip
# Проверить DNAT для входящего RTP
/ip firewall nat print where chain=dstnat dst-port~"10000"
Звонок обрывается через 30 секунд
Классика. UDP timeout по умолчанию 10 секунд в старых версиях RouterOS, 30 секунд в новых. SIP re-INVITE приходит позже.
# Исправление
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# Проверить текущее значение
/ip firewall connection tracking print
# Смотри udp-timeout и udp-stream-timeout
# Посмотреть активные SIP соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
SIP работает по LTE, но не через провайдера
Часто это означает что провайдер тоже включил SIP ALG на своём оборудовании. Это его собственный ALG — ты его не отключишь.
Обходные пути: SIP TLS (порт 5061, зашифрован — провайдерский ALG не видит содержимое), нестандартный порт SIP (5080, 5090), VPN-туннель до АТС.
# Захватить трафик и посмотреть что происходит с SIP-заголовками
/tool sniffer quick port=5060 interface=ether1
# Если видишь пакеты с изменёнными заголовками - провайдер вмешивается
Инструменты диагностики
Packet Sniffer
# Захват SIP-пакетов
/tool sniffer quick port=5060
# Захват с фильтром по IP
/tool sniffer quick port=5060 ip-address=192.168.1.100
# Захват RTP трафика
/tool sniffer quick port=10000-20000 ip-address=192.168.1.100
# Остановить
/tool sniffer stop
Torch — реальное время
# Смотреть SIP-трафик на WAN
/tool torch interface=ether1 ip-protocol=udp
# С фильтром по порту
/tool torch interface=ether1 port=5060
Connection tracking
# Активные SIP соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
# Все UDP соединения
/ip firewall connection print where protocol=udp
# Количество активных соединений
/ip firewall connection print count-only
Шпаргалка команд
# ===== ДИАГНОСТИКА =====
# Статус SIP ALG
/ip firewall service-port print
# Таймауты connection tracking
/ip firewall connection tracking print
# Активные SIP соединения
/ip firewall connection print where dst-port=5060 or src-port=5060
# Что дропается
/ip firewall filter print stats where action=drop
# NAT правила
/ip firewall nat print
# Захват SIP
/tool sniffer quick port=5060
# ===== ИСПРАВЛЕНИЕ =====
# Отключить SIP ALG
/ip firewall service-port disable sip
# Увеличить UDP таймауты
/ip firewall connection tracking set udp-timeout=60s
/ip firewall connection tracking set udp-stream-timeout=120s
# DNAT SIP на Asterisk
/ip firewall nat add chain=dstnat in-interface=ether1 protocol=udp dst-port=5060 action=dst-nat to-addresses=192.168.1.100 to-ports=5060
# DNAT RTP на Asterisk
/ip firewall nat add chain=dstnat in-interface=ether1 protocol=udp dst-port=10000-20000 action=dst-nat to-addresses=192.168.1.100
# Разрешить RTP в filter
/ip firewall filter add chain=forward protocol=udp dst-port=10000-20000 action=accept comment="RTP VoIP" place-before=0
# Очистить SIP-соединения (при failover)
/ip firewall connection remove [find dst-port=5060]
# ===== ПРОВЕРКА =====
# SIP ALG отключён - должен быть флаг X
/ip firewall service-port print
# Masquerade работает - счётчик растёт
/ip firewall nat print stats where action=masquerade
# RTP открыт
/ip firewall filter print where dst-port~"10000"
# UDP timeout 60s или больше
/ip firewall connection tracking print
FAQ
Почему нет звука только в одну сторону?
Односторонний звук — классический признак NAT-проблемы. Одно направление RTP доходит, другое — нет. Чаще всего: externip в Asterisk не совпадает с внешним IP MikroTik, или нет DNAT для входящего RTP. Проверь /ip firewall nat print where chain=dstnat — правило для 10000-20000 должно быть. Проверь externip/external_media_address в конфиге Asterisk.
Почему звонок обрывается через 32 секунды?
UDP timeout. MikroTik закрыл NAT-запись раньше чем SIP прислал re-INVITE или keep-alive. Исправление одной командой: /ip firewall connection tracking set udp-timeout=60s. Значение 32 секунды специфично для старых версий RouterOS — в новых дефолт выше, но всё равно может не хватать.
Нужно ли открывать порт 5061?
Только если используешь SIP TLS. Обычный SIP работает на 5060/UDP. SIP TLS использует 5061/TCP. Если у тебя нет TLS — порт 5061 не нужен. Если есть — добавь DNAT для 5061/TCP.
Нужен ли STUN если отключён SIP ALG?
Зависит от настройки АТС. Если Asterisk настроен с правильным externip и localnet — STUN не нужен. Если используешь сторонние SIP-телефоны напрямую без АТС — STUN помогает телефону узнать свой внешний IP. Для АТС за MikroTik: настрой externip в Asterisk, STUN опционален.
Какой RTP range использовать для FreePBX?
По умолчанию FreePBX и Asterisk используют 10000-20000/UDP. Проверить в FreePBX: Admin — Asterisk SIP Settings — RTP Settings. Пробрасывай именно тот диапазон который указан там — не угадывай.
Почему SIP работает по LTE, но не работает через провайдера?
Провайдер включил SIP ALG на своём оборудовании. LTE-оператор этого не делает или делает меньше. Решение: SIP TLS (5061/TCP — провайдерский ALG не видит содержимое зашифрованного пакета) или VPN-туннель до АТС. Позвони провайдеру и попроси отключить SIP ALG — иногда это возможно.
Нужно ли отключать SIP ALG у провайдера или только на MikroTik?
В идеале — у всех на пути. На MikroTik ты управляешь сам. У провайдера — по запросу, не всегда дают. Если провайдер не отключает — используй SIP TLS или VPN, чтобы трафик был зашифрован и провайдерский ALG не мог вмешаться.
Нужно ли пробрасывать RTP если телефоны внутри сети и АТС тоже внутри?
Нет. DNAT для RTP нужен только для входящего трафика из интернета. Если и телефоны, и Asterisk в одной локальной сети — RTP идёт напрямую между ними без NAT. Проброс нужен когда внешний SIP-провайдер должен доставить RTP до твоего Asterisk за NAT.
Итог: три действия которые решают 90% проблем
Если SIP-телефония за MikroTik работает плохо — действуем по порядку:
- Отключить SIP ALG —
/ip firewall service-port disable sip. Первое и главное. В большинстве случаев уже это решает проблему.
- Открыть RTP-порты и настроить DNAT — если нужен входящий трафик. Без этого звук будет только исходящий.
- Увеличить UDP timeout —
/ip firewall connection tracking set udp-timeout=60s. Решает обрывы через 30 секунд и пропадание регистрации.
FastTrack, QoS, dual-WAN, SIP TLS — это тюнинг поверх рабочей базы. Сначала работающая телефония, потом оптимизация.
Если после всех настроек что-то не работает — пиши в комментарии схему подключения, версию RouterOS и симптомы. Разберёмся.
Официальная документация
MikroTik — SIP ALG и service-port: wiki.mikrotik.com/wiki/Manual:IP/Firewall/Service_Ports
MikroTik — Connection Tracking: wiki.mikrotik.com/wiki/Manual:IP/Firewall/Connection_tracking
Asterisk — NAT настройка: wiki.asterisk.org/wiki/display/AST/Configuring+res_pjsip+to+work+through+NAT
FreePBX — SIP Settings: wiki.freepbx.org/display/FPG/Asterisk+SIP+Settings+User+Guide
Добрый день, подскажите есть микрот, на нем два провайдера с переключением в случае отключения одного из них, после идёт ещё один микрот с настроенными виланами который получает адрес с первого микрота, после второго микрота стоит пирс, при переключении провайдеров теряется связь минуты на полторы, как сделать что бы переключение были быстрее и не разрывалась связь?
О! это хороший вопрос.
Судя по вашему описанию, сейчас, скорее всего, используется стандартная проверка шлюза (check-gateway=ping) или просто ожидание пропадания связи по линку. Первый микротик теряет провайдера, но роутер с вланами продолжает слать трафик на первый микротик, думая, что тот еще жив (либо ждет таймаута TCP, который как раз около 60-90 секунд).
Решение: Рекурсивная маршрутизация + Очистка соединений
Чтобы переключение происходило за секунды, нужно внедрить на первом микротике (который с двумя провайдерами) схему Recursive Routing (рекурсивная маршрутизация). Эта схема проверяет не просто «жив ли соседний шлюз», а реально ли есть интернет (например, доходит ли пинг до 8.8.8.8).
Шаг 1. Настройка рекурсивных маршрутов (на первом микротике)
Эта конфигурация заставит роутер держать активным только тот маршрут, через который есть реальный выход в интернет .
Создайте таблицы маршрутизации (Routing -> Tables):
to_ISP1
to_ISP2
Настройте маршруты для «якорей» (хосты для проверки):
Мы будем использовать DNS Google (8.8.8.8 и 8.8.4.4) в качестве цели для проверки. Им нужно задать scope=10 и явно указать шлюз провайдера.
bash
/ip route add dst-address=8.8.8.8/32 gateway=ШЛЮЗ_ISP1 scope=10
/ip route add dst-address=8.8.4.4/32 gateway=ШЛЮЗ_ISP2 scope=10
Настройте «Recursive» маршруты (ОСНОВНЫЕ):
Здесь мы говорим роутеру: «Иди к 8.8.8.8 через таблицу to_ISP1. Если 8.8.8.8 доступен — включай основной шлюз».
bash
# Основной маршрут (например, ISP1 — приоритет 1)
/ip route add dst-address=0.0.0.0/0 gateway=8.8.8.8 routing-table=to_ISP1 scope=10 target-scope=11 check-gateway=ping distance=1
# Резервный маршрут (ISP2 — приоритет 2)
/ip route add dst-address=0.0.0.0/0 gateway=8.8.4.4 routing-table=to_ISP2 scope=10 target-scope=11 check-gateway=ping distance=2
Как это работает: Роутер пингует 8.8.8.8 через ISP1. Как только пинги перестают проходить (пропал интернет у ISP1), маршрут до 8.8.8.8 пропадает, и следом автоматически пропадает основной маршрут 0.0.0.0/0. Трафик мгновенно переключается на маршрут с distance=2 (через ISP2 и 8.8.4.4) .
Шаг 2. Очистка старых соединений (Сброс TCP сессий)
Чтобы связь не рвалась на полторы минуты, а переключалась сразу, нужно принудительно убивать старые соединения, которые «залипли» в упавшем канале. Это делается через скрипты в Netwatch или в планировщике .
Добавьте в конфигурацию Netwatch (Tools -> Netwatch) проверку ваших шлюзов или тех же 8.8.8.8 с выполнением скрипта:
Down Script (при отключении канала ISP1):
bash
:log info «Failover: ISP1 DOWN. Cleaning connections.»
/ip route enable [find where comment=»ISP2_Route»] # Активируем бэкап (если он был отключен)
/ip firewall connection remove [find where routing-mark=to_ISP1]
Ключевой момент: команда /ip firewall connection remove принудительно рвет все сессии, которые шли через упавший канал. Клиентские компьютеры видят «обрыв», но тут же пересоздают соединение через новый канал (это занимает 1-2 секунды, вместо 90) .
Up Script (при восстановлении):
bash
:log info «Failover: ISP1 UP. Switching back.»
/ip route disable [find where comment=»ISP2_Route»]
/ip firewall connection remove [find where routing-mark=to_ISP2]
Шаг 3. Настройка второго микротика (с вланами)
Второе устройство должно просто «не мешать» и быстро реагировать на изменения на первом роутере.
Используйте DHCP-клиент на интерфейсе, который смотрит в сторону первого микротика. В настройках DHCP клиента обязательно снимите галочку «Add Default Route» (Не добавлять маршрут по умолчанию).
Назначьте шлюз вручную (IP -> Routes) — укажите IP-адрес первого микротика.
Включите проверку шлюза:
В окне добавления маршрута (0.0.0.0/0) в поле Gateway укажите IP первого микротика, а в поле Check Gateway выберите ping.
Это заставит второй микротик моментально понять, что первый микротик «упал» (как только пинг перестанет проходить), а не ждать, пока истечет таймаут соединения.
Итоговая схема работы
У провайдера пропадает интернет (линк с модемом может оставаться активным).
Первый микротик перестает получать ответ от 8.8.8.8 (через 2-3 секунды).
Рекурсивный маршрут до 0.0.0.0/0 через ISP1 исчезает автоматически. Активным становится ISP2.
Скрипт Netwatch вырезает все «висящие» TCP-сессии.
Второй микротик (так как он пингует первый) теряет шлюз и переключает свою маршрутизацию (если настроен check-gateway).
Весь процесс занимает 3-5 секунд. Пользователь заметит только небольшую «задержку» при загрузке страницы, а не полный разрыв связи.
Важно: Если на втором микротике настроен Masquerade (NAT), убедитесь, что в настройках NAT не прописан жестко IP-адрес первого микротика. Лучше оставить action=masquerade, чтобы адрес подхватывался автоматически.