====== MikroTik: Webhook Telegram через VPN ======
Решение проблемы, когда Telegram webhook не доходит до сервера при использовании policy routing для заворачивания трафика Telegram в VPN.
===== Описание проблемы =====
При настройке MikroTik для отправки трафика Telegram через VPN возникает проблема с входящими webhook:
* Webhook от Telegram приходит на WAN-интерфейс
* Запрос доходит до сервера (n8n, бот и т.д.)
* Сервер отвечает
* MikroTik видит dst=IP_Telegram → маркирует → отправляет в VPN
* Telegram не получает ответ (другой src IP) → timeout
==== Схема проблемы ====
Telegram ──► WAN:443 ──► DNAT ──► Сервер ──► Ответ
│
▼
dst = IP Telegram
│
▼
Правило VPN: dst в to-vpn? ── ДА
│
▼
Ответ уходит в VPN ──► Telegram DROP
===== Решение =====
Используем **connection-mark** для пометки входящих соединений от Telegram. Conntrack запоминает метку и применяет ко всем пакетам соединения, включая ответы.
==== Шаг 1: Создаём address-list для webhook ====
/ip firewall address-list
add list=telegram-webhook address=149.154.160.0/20 comment="telegram webhook src"
add list=telegram-webhook address=91.108.4.0/22 comment="telegram webhook src"
add list=telegram-webhook address=91.108.8.0/22 comment="telegram webhook src"
add list=telegram-webhook address=91.108.12.0/22 comment="telegram webhook src"
add list=telegram-webhook address=91.108.16.0/22 comment="telegram webhook src"
add list=telegram-webhook address=91.108.20.0/22 comment="telegram webhook src"
add list=telegram-webhook address=91.108.56.0/22 comment="telegram webhook src"
add list=telegram-webhook address=91.105.192.0/23 comment="telegram webhook src"
add list=telegram-webhook address=185.76.151.0/24 comment="telegram webhook src"
add list=telegram-webhook address=95.161.64.0/20 comment="telegram webhook src"
==== Шаг 2: Добавляем правила mangle ====
# Помечаем входящие соединения от Telegram (в начало цепочки!)
/ip firewall mangle add chain=prerouting \
in-interface-list=wan \
connection-state=new \
protocol=tcp \
src-address-list=telegram-webhook \
dst-port=443 \
action=mark-connection \
new-connection-mark=wan_webhook \
passthrough=yes \
comment="Mark incoming Telegram webhooks" \
place-before=0
# Пропускаем помеченные соединения мимо VPN
/ip firewall mangle add chain=prerouting \
connection-mark=wan_webhook \
action=accept \
passthrough=no \
comment="Skip VPN for Telegram webhook responses" \
place-before=1
Правила должны быть **выше** правила маркировки трафика в VPN!
==== Шаг 3: Проверка ====
Проверяем порядок правил:
/ip firewall mangle print
Ожидаемый результат:
0 mark-connection wan_webhook src-address-list=telegram-webhook
1 accept connection-mark=wan_webhook passthrough=no
...
N mark-routing to_vpn dst-address-list=to-vpn
Проверяем счётчики после отправки тестового webhook:
/ip firewall mangle print stats where connection-mark=wan_webhook
===== Принцип работы =====
ВХОДЯЩИЙ WEBHOOK:
Telegram ──► WAN ──► Правило 0: src=telegram-webhook? ── ДА
│
▼
connection-mark = wan_webhook
│
▼
Правило 1: connection-mark=wan_webhook? ── ДА
│
▼
accept ──► ВЫХОД ИЗ MANGLE
│
▼
DNAT ──► Сервер ──► Ответ
│
▼
connection-mark=wan_webhook (conntrack)
│
▼
Правило 1: accept ──► WAN ──► Telegram ✅
ИСХОДЯЩИЙ ЗАПРОС (бот → Telegram API):
Сервер ──► dst=Telegram ──► Правило 0: src=telegram-webhook? ── НЕТ
│
▼
Правило 1: connection-mark? ── НЕТ
│
▼
Правило VPN: dst=to-vpn? ── ДА
│
▼
mark-routing=to_vpn ──► VPN ✅
^ Тип трафика ^ Connection-mark ^ Маршрут ^
| Webhook Telegram → Сервер | wan_webhook | WAN |
| Ответ Сервер → Telegram | wan_webhook | WAN |
| Бот → Telegram API | нет | VPN |
===== Диагностика =====
==== tcpdump на сервере ====
# Замените IP на ваш WAN
tcpdump -ni any host and port 443
Правильный вывод — ответ уходит с вашего WAN IP:
eth0 In IP 149.154.x.x.443 > 192.168.0.x.xxxxx # входящий
eth0 Out IP 192.168.0.x.xxxxx > 149.154.x.x.443 # ответ через WAN ✅
==== Проверка conntrack ====
/ip firewall connection print where connection-mark=wan_webhook
===== Ссылки =====
* [[https://wiki.mikrotik.com/wiki/Manual:IP/Firewall/Mangle|MikroTik Mangle Manual]]
* [[https://core.telegram.org/bots/webhooks|Telegram Webhook Documentation]]