Best practices Firewall на MikroTik
Best practices Firewall на MikroTik — продвинутые шаблоны
Firewall MikroTik — главный рубеж защиты сети. Неправильно настроенный firewall хуже, чем его отсутствие: он создаёт ложное чувство безопасности. В этой статье представлен полный эталонный набор правил для RouterOS 7, оптимизированный по производительности, с поддержкой dual-WAN, VPN и гостевых VLAN. Все правила даны в формате copy-paste — можно сразу применять через терминал.
Описание
Архитектура firewall MikroTik
Firewall MikroTik обрабатывает пакеты через цепочки (chains):
- input — пакеты, адресованные самому роутеру (SSH, WinBox, DNS, VPN)
- forward — пакеты, проходящие через роутер между интерфейсами (LAN → WAN, WAN → LAN)
- output — пакеты, отправляемые самим роутером (обычно не фильтруются)
Ключевые принципы:
- Default deny — всё, что не разрешено явно, запрещено
- Stateful firewall — используем connection tracking (established/related/invalid)
- Performance first — самые частые совпадения в начале цепочки
- FastTrack — аппаратное ускорение для established-соединений
- Address Lists — группировка адресов для удобства управления
- Logging — логируем drop, но не злоупотребляем (лог на каждый пакет = перегрузка)
Оптимизация производительности
Порядок правил критически важен. Firewall проверяет правила сверху вниз, и первое совпавшее правило определяет действие. Статистика типичного домашнего/офисного трафика:
- ~90% пакетов — established/related (существующие соединения)
- ~5% пакетов — новые соединения (new)
- ~3% пакетов — invalid
- ~2% пакетов — всё остальное
Поэтому правило connection-state=established,related action=accept должно быть первым — оно обработает 90% трафика за одну проверку. Все остальные правила будут обрабатывать оставшиеся 10%.
FastTrack дополнительно ускоряет обработку established-соединений, перенося их из software firewall в hardware offload (на поддерживаемых устройствах).
Настройка
Предварительная подготовка: Interface Lists
Прежде чем создавать правила firewall, настройте списки интерфейсов:
[admin@MikroTik] ># Создаём Interface Lists /interface/list add name=WAN comment="Internet-facing interfaces" add name=LAN comment="Trusted local network" add name=MGMT comment="Management access" add name=GUEST comment="Guest/untrusted network" add name=VPN comment="VPN tunnels" # Добавляем интерфейсы /interface/list/member add list=WAN interface=ether1 comment="Primary ISP" add list=LAN interface=bridge comment="LAN bridge" add list=MGMT interface=bridge comment="Management via LAN"
Для dual-WAN:
[admin@MikroTik] >/interface/list/member add list=WAN interface=ether1 comment="ISP1" add list=WAN interface=ether2 comment="ISP2"
Для VPN-интерфейсов:
[admin@MikroTik] >/interface/list/member add list=VPN interface=wireguard1 comment="WireGuard VPN" add list=LAN interface=wireguard1 comment="VPN as trusted"
Для гостевой сети:
[admin@MikroTik] >/interface/list/member add list=GUEST interface=vlan-guest comment="Guest VLAN"
Address Lists
Создайте списки адресов для использования в firewall:
[admin@MikroTik] >/ip/firewall/address-list # Bogon-адреса (не должны приходить из интернета) add list=bogons address=0.0.0.0/8 comment="RFC 1122 this network" add list=bogons address=10.0.0.0/8 comment="RFC 1918 private" add list=bogons address=100.64.0.0/10 comment="RFC 6598 CGN" add list=bogons address=127.0.0.0/8 comment="RFC 1122 loopback" add list=bogons address=169.254.0.0/16 comment="RFC 3927 link-local" add list=bogons address=172.16.0.0/12 comment="RFC 1918 private" add list=bogons address=192.0.0.0/24 comment="RFC 6890 IETF protocol" add list=bogons address=192.0.2.0/24 comment="RFC 5737 TEST-NET-1" add list=bogons address=192.168.0.0/16 comment="RFC 1918 private" add list=bogons address=198.18.0.0/15 comment="RFC 2544 benchmark" add list=bogons address=198.51.100.0/24 comment="RFC 5737 TEST-NET-2" add list=bogons address=203.0.113.0/24 comment="RFC 5737 TEST-NET-3" add list=bogons address=224.0.0.0/4 comment="RFC 5771 multicast" add list=bogons address=240.0.0.0/4 comment="RFC 1112 reserved" # DNS-серверы (для ограничения DNS-запросов) add list=dns-servers address=1.1.1.1 comment="Cloudflare" add list=dns-servers address=1.0.0.1 comment="Cloudflare" add list=dns-servers address=8.8.8.8 comment="Google" add list=dns-servers address=8.8.4.4 comment="Google" add list=dns-servers address=9.9.9.9 comment="Quad9" # Управляющие адреса (доступ к роутеру) add list=management address=192.168.88.0/24 comment="LAN subnet"
Эталонный Firewall: Input Chain
Input chain защищает сам роутер. Правила от самого частого к самому редкому:
[admin@MikroTik] >/ip/firewall/filter # === INPUT CHAIN === # 1. Established/Related — 90% трафика add chain=input action=accept \ connection-state=established,related \ comment="Accept established/related" # 2. Drop invalid add chain=input action=drop \ connection-state=invalid \ comment="Drop invalid" # 3. ICMP — разрешаем пинг (с лимитом) add chain=input action=accept \ protocol=icmp icmp-options=0:0 limit=5,10:packet \ comment="Accept ICMP echo reply (limited)" add chain=input action=accept \ protocol=icmp icmp-options=8:0 limit=5,10:packet \ comment="Accept ICMP echo request (limited)" add chain=input action=accept \ protocol=icmp icmp-options=3:0-15 limit=5,10:packet \ comment="Accept ICMP destination unreachable" add chain=input action=accept \ protocol=icmp icmp-options=11:0-1 limit=5,10:packet \ comment="Accept ICMP time exceeded" add chain=input action=drop \ protocol=icmp \ comment="Drop all other ICMP" # 4. Разрешаем доступ из LAN к сервисам роутера add chain=input action=accept \ in-interface-list=LAN \ comment="Accept all from LAN" # 5. Разрешаем VPN-подключения из WAN add chain=input action=accept \ protocol=udp dst-port=13231 in-interface-list=WAN \ comment="Accept WireGuard from WAN" # 6. Разрешаем DNS только для LAN (если MikroTik — DNS-сервер) add chain=input action=accept \ protocol=udp dst-port=53 in-interface-list=LAN \ comment="Accept DNS from LAN" add chain=input action=accept \ protocol=tcp dst-port=53 in-interface-list=LAN \ comment="Accept DNS TCP from LAN" # 7. Разрешаем DHCP add chain=input action=accept \ protocol=udp dst-port=67 in-interface-list=LAN \ comment="Accept DHCP from LAN" # 8. Разрешаем доступ из VPN add chain=input action=accept \ in-interface-list=VPN \ comment="Accept all from VPN" # 9. Логируем и дропаем всё остальное add chain=input action=log \ log=yes log-prefix="FW:input:drop:" \ comment="Log dropped input" add chain=input action=drop \ comment="Drop all other input"
Эталонный Firewall: Forward Chain
Forward chain контролирует трафик между интерфейсами:
[admin@MikroTik] ># === FORWARD CHAIN === # 1. FastTrack established/related (ПЕРВЫМ!) add chain=forward action=fasttrack-connection \ connection-state=established,related \ hw-offload=yes \ comment="FastTrack established/related" add chain=forward action=accept \ connection-state=established,related \ comment="Accept established/related" # 2. Drop invalid add chain=forward action=drop \ connection-state=invalid \ comment="Drop invalid forward" # 3. Drop bogon src из WAN add chain=forward action=drop \ in-interface-list=WAN \ src-address-list=bogons \ comment="Drop bogon sources from WAN" # 4. LAN → WAN — разрешаем add chain=forward action=accept \ in-interface-list=LAN out-interface-list=WAN \ connection-state=new \ comment="Accept LAN to WAN (new)" # 5. LAN → VPN — разрешаем add chain=forward action=accept \ in-interface-list=LAN out-interface-list=VPN \ connection-state=new \ comment="Accept LAN to VPN (new)" # 6. VPN → LAN — разрешаем (если нужен доступ из VPN в LAN) add chain=forward action=accept \ in-interface-list=VPN out-interface-list=LAN \ connection-state=new \ comment="Accept VPN to LAN (new)" # 7. Guest → WAN — разрешаем только интернет add chain=forward action=accept \ in-interface-list=GUEST out-interface-list=WAN \ connection-state=new \ comment="Accept Guest to WAN (new)" # 8. Guest → LAN — запрещаем! add chain=forward action=drop \ in-interface-list=GUEST out-interface-list=LAN \ comment="Drop Guest to LAN" # 9. Guest → Guest — запрещаем (изоляция гостей) add chain=forward action=drop \ in-interface-list=GUEST out-interface-list=GUEST \ comment="Drop Guest to Guest" # 10. Логируем и дропаем всё остальное add chain=forward action=log \ log=yes log-prefix="FW:forward:drop:" \ comment="Log dropped forward" add chain=forward action=drop \ comment="Drop all other forward"
Jump Chains для сложных правил
При большом количестве правил используйте jump chains для логической группировки:
[admin@MikroTik] ># Создаём специализированные цепочки # === ICMP Chain === add chain=input action=jump jump-target=icmp-chain \ protocol=icmp comment="Jump to ICMP rules" add chain=icmp-chain action=accept \ icmp-options=0:0 limit=5,10:packet \ comment="Echo reply" add chain=icmp-chain action=accept \ icmp-options=8:0 limit=5,10:packet \ comment="Echo request" add chain=icmp-chain action=accept \ icmp-options=3:0-15 limit=5,10:packet \ comment="Destination unreachable" add chain=icmp-chain action=accept \ icmp-options=11:0-1 limit=5,10:packet \ comment="Time exceeded" add chain=icmp-chain action=drop \ comment="Drop all other ICMP" # === WAN-INPUT Chain === add chain=input action=jump jump-target=wan-input \ in-interface-list=WAN comment="Jump to WAN input rules" add chain=wan-input action=accept \ protocol=udp dst-port=13231 \ comment="WireGuard" add chain=wan-input action=drop \ comment="Drop all other WAN input" # === GUEST-FORWARD Chain === add chain=forward action=jump jump-target=guest-forward \ in-interface-list=GUEST comment="Jump to Guest rules" add chain=guest-forward action=accept \ out-interface-list=WAN connection-state=new \ comment="Guest to WAN" add chain=guest-forward action=drop \ comment="Drop all other Guest traffic"
Jump chains упрощают чтение, отладку и модификацию firewall. Пакет, попавший в jump chain и не совпавший ни с одним правилом, возвращается в основную цепочку.
Firewall для Dual-WAN
При использовании двух провайдеров нужны дополнительные правила:
[admin@MikroTik] ># NAT для обоих WAN /ip/firewall/nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT ISP1" add chain=srcnat out-interface=ether2 action=masquerade comment="NAT ISP2" # Firewall — оба WAN в списке WAN, правила одинаковые # Дополнительно: блокируем трафик между WAN-интерфейсами /ip/firewall/filter add chain=forward \ in-interface-list=WAN out-interface-list=WAN \ action=drop \ comment="Drop WAN to WAN transit" \ place-before=[find where chain=forward action=drop comment~"Drop all"]
Firewall для VPN-сервера
Если MikroTik работает как VPN-сервер (WireGuard, L2TP/IPsec):
[admin@MikroTik] ># WireGuard (UDP 13231) /ip/firewall/filter/add chain=input \ protocol=udp dst-port=13231 in-interface-list=WAN \ action=accept \ comment="Accept WireGuard" \ place-before=[find where chain=input action=log] # L2TP/IPsec /ip/firewall/filter add chain=input protocol=udp dst-port=500 in-interface-list=WAN \ action=accept comment="Accept IKE" \ place-before=[find where chain=input action=log] add chain=input protocol=udp dst-port=4500 in-interface-list=WAN \ action=accept comment="Accept NAT-T" \ place-before=[find where chain=input action=log] add chain=input protocol=ipsec-esp in-interface-list=WAN \ action=accept comment="Accept IPsec ESP" \ place-before=[find where chain=input action=log] # Разрешаем трафик из VPN в LAN и обратно /ip/firewall/filter add chain=forward in-interface-list=VPN out-interface-list=LAN \ action=accept connection-state=new \ comment="VPN to LAN" \ place-before=[find where chain=forward action=log] add chain=forward in-interface-list=LAN out-interface-list=VPN \ action=accept connection-state=new \ comment="LAN to VPN" \ place-before=[find where chain=forward action=log]
Firewall для Hotspot/Guest VLAN
Гостевая сеть должна иметь доступ только в интернет, без доступа к LAN и другим гостям:
[admin@MikroTik] >/ip/firewall/filter # Guest → LAN: полный запрет add chain=forward in-interface-list=GUEST \ dst-address=192.168.88.0/24 \ action=drop \ comment="Block Guest to LAN" # Guest → роутер: только DNS и DHCP add chain=input in-interface-list=GUEST \ protocol=udp dst-port=53,67 \ action=accept \ comment="Guest: DNS + DHCP only" add chain=input in-interface-list=GUEST \ action=drop \ comment="Guest: drop all other to router" # Guest → Guest: изоляция add chain=forward in-interface-list=GUEST \ out-interface-list=GUEST \ action=drop \ comment="Isolate guests from each other" # Guest → WAN: разрешаем только HTTP/HTTPS/DNS add chain=forward in-interface-list=GUEST \ out-interface-list=WAN \ protocol=tcp dst-port=80,443 \ connection-state=new \ action=accept \ comment="Guest: HTTP/HTTPS only" add chain=forward in-interface-list=GUEST \ out-interface-list=WAN \ protocol=udp dst-port=53 \ action=accept \ comment="Guest: DNS" add chain=forward in-interface-list=GUEST \ action=drop \ comment="Guest: drop all other"
Logging Best Practices
Правила логирования должны быть перед финальными drop-правилами:
[admin@MikroTik] ># Настройка логирования /system/logging add topics=firewall action=disk add topics=firewall action=remote target=10.0.0.100 # Логируем drop в input (с лимитом, чтобы не перегрузить) /ip/firewall/filter/set [find where chain=input action=log] \ log=yes log-prefix="FW:input:drop:" limit=10,20:packet # Логируем drop в forward /ip/firewall/filter/set [find where chain=forward action=log] \ log=yes log-prefix="FW:forward:drop:" limit=10,20:packet
Параметр limit=10,20:packet означает: логировать максимум 10 пакетов в секунду с burst 20. Это предотвращает переполнение лога при DDoS или сканировании портов.
Просмотр логов firewall:
[admin@MikroTik] >/log/print where message~"FW:"
Защита от port scan и brute force
[admin@MikroTik] ># Обнаружение сканирования портов /ip/firewall/filter add chain=input protocol=tcp tcp-flags=fin,syn \ action=add-src-to-address-list \ address-list=port-scanners address-list-timeout=2w \ comment="Detect SYN+FIN scan" add chain=input protocol=tcp tcp-flags=syn,rst \ action=add-src-to-address-list \ address-list=port-scanners address-list-timeout=2w \ comment="Detect SYN+RST scan" add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \ action=add-src-to-address-list \ address-list=port-scanners address-list-timeout=2w \ comment="Detect XMAS scan" add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \ action=add-src-to-address-list \ address-list=port-scanners address-list-timeout=2w \ comment="Detect NULL scan" # Блокируем port-scanners add chain=input src-address-list=port-scanners \ action=drop \ comment="Drop port scanners" # Brute force protection для SSH/WinBox add chain=input protocol=tcp dst-port=22,8291 \ connection-state=new \ src-address-list=bruteforce-stage3 \ action=drop \ comment="Drop brute force stage 3" add chain=input protocol=tcp dst-port=22,8291 \ connection-state=new \ src-address-list=bruteforce-stage2 \ action=add-src-to-address-list \ address-list=bruteforce-stage3 address-list-timeout=1d \ comment="Brute force stage 2 → 3" add chain=input protocol=tcp dst-port=22,8291 \ connection-state=new \ src-address-list=bruteforce-stage1 \ action=add-src-to-address-list \ address-list=bruteforce-stage2 address-list-timeout=4m \ comment="Brute force stage 1 → 2" add chain=input protocol=tcp dst-port=22,8291 \ connection-state=new \ action=add-src-to-address-list \ address-list=bruteforce-stage1 address-list-timeout=1m \ comment="Brute force stage 0 → 1"
Эта система progressive delay блокирует IP после 4 попыток подключения за минуту.
Проверка
Проверка правил и счётчиков
[admin@MikroTik] >/ip/firewall/filter/print stats
Посмотрите счётчики packets и bytes. Правило Accept established/related должно иметь наибольшее количество пакетов — это подтверждает правильный порядок.
Проверка FastTrack
[admin@MikroTik] >/ip/firewall/filter/print stats where action=fasttrack-connection
Счётчик FastTrack должен расти. Если он нулевой, проверьте:
[admin@MikroTik] >/ip/settings/print
Убедитесь, что allow-fast-path=yes. Также FastTrack не работает с некоторыми функциями (mangle routing-mark, layer7 protocol, queue tree и т.д.).
Проверка connection tracking
[admin@MikroTik] >/ip/firewall/connection/print
[admin@MikroTik] >/ip/firewall/connection/print count-only
Если количество connections аномально велико (десятки тысяч), возможна DDoS-атака или утечка.
Тестирование firewall извне
Используйте онлайн-сканер портов (ShieldsUp, nmap) для проверки, что WAN-порты закрыты:
codenmap -sS -p 1-65535 <ваш внешний IP>
Все порты должны быть в состоянии filtered или closed, кроме явно открытых (VPN).
Проверка address-list
[admin@MikroTik] >/ip/firewall/address-list/print where list=port-scanners /ip/firewall/address-list/print where list=bruteforce-stage3
Если списки наполняются — защита работает.
Проверка логов
[admin@MikroTik] >/log/print where message~"FW:input:drop" /log/print where message~"FW:forward:drop"
Анализируйте, что дропается. Если видите легитимный трафик — скорректируйте правила.
Полный export эталонного firewall
Готовый набор правил для копирования. Перед применением удалите существующие правила:
[admin@MikroTik] ># ВНИМАНИЕ: это удалит ВСЕ текущие правила firewall! # Выполняйте только если понимаете последствия. # Рекомендуется сначала создать backup. /system/backup/save name=before-firewall-reset # Очистка /ip/firewall/filter/remove [find] /ip/firewall/nat/remove [find] /ip/firewall/address-list/remove [find] # === Interface Lists === /interface/list add name=WAN add name=LAN add name=VPN add name=GUEST /interface/list/member add list=WAN interface=ether1 add list=LAN interface=bridge # === Address Lists === /ip/firewall/address-list add list=bogons address=0.0.0.0/8 add list=bogons address=10.0.0.0/8 add list=bogons address=100.64.0.0/10 add list=bogons address=127.0.0.0/8 add list=bogons address=169.254.0.0/16 add list=bogons address=172.16.0.0/12 add list=bogons address=192.0.0.0/24 add list=bogons address=192.0.2.0/24 add list=bogons address=192.168.0.0/16 add list=bogons address=198.18.0.0/15 add list=bogons address=198.51.100.0/24 add list=bogons address=203.0.113.0/24 add list=bogons address=224.0.0.0/4 add list=bogons address=240.0.0.0/4 # === NAT === /ip/firewall/nat add chain=srcnat out-interface-list=WAN action=masquerade \ comment="NAT to WAN" # === Filter: Input === /ip/firewall/filter add chain=input connection-state=established,related action=accept \ comment="INPUT: established/related" add chain=input connection-state=invalid action=drop \ comment="INPUT: drop invalid" add chain=input protocol=icmp icmp-options=8:0 limit=5,10:packet action=accept \ comment="INPUT: ICMP echo request" add chain=input protocol=icmp icmp-options=0:0 action=accept \ comment="INPUT: ICMP echo reply" add chain=input protocol=icmp icmp-options=3:0-15 action=accept \ comment="INPUT: ICMP dest unreachable" add chain=input protocol=icmp icmp-options=11:0-1 action=accept \ comment="INPUT: ICMP time exceeded" add chain=input protocol=icmp action=drop \ comment="INPUT: drop other ICMP" add chain=input in-interface-list=LAN action=accept \ comment="INPUT: accept all from LAN" add chain=input in-interface-list=VPN action=accept \ comment="INPUT: accept all from VPN" add chain=input in-interface-list=GUEST protocol=udp dst-port=53,67 action=accept \ comment="INPUT: Guest DNS+DHCP" add chain=input in-interface-list=GUEST action=drop \ comment="INPUT: drop Guest to router" add chain=input in-interface-list=WAN protocol=udp dst-port=13231 action=accept \ comment="INPUT: WireGuard from WAN" add chain=input action=log log=yes log-prefix="FW:input:drop:" \ limit=10,20:packet \ comment="INPUT: log dropped" add chain=input action=drop \ comment="INPUT: drop all" # === Filter: Forward === add chain=forward connection-state=established,related action=fasttrack-connection \ hw-offload=yes \ comment="FORWARD: FastTrack established" add chain=forward connection-state=established,related action=accept \ comment="FORWARD: accept established" add chain=forward connection-state=invalid action=drop \ comment="FORWARD: drop invalid" add chain=forward in-interface-list=WAN src-address-list=bogons action=drop \ comment="FORWARD: drop bogon src from WAN" add chain=forward in-interface-list=LAN out-interface-list=WAN \ connection-state=new action=accept \ comment="FORWARD: LAN→WAN" add chain=forward in-interface-list=LAN out-interface-list=VPN \ connection-state=new action=accept \ comment="FORWARD: LAN→VPN" add chain=forward in-interface-list=VPN out-interface-list=LAN \ connection-state=new action=accept \ comment="FORWARD: VPN→LAN" add chain=forward in-interface-list=GUEST out-interface-list=WAN \ connection-state=new action=accept \ comment="FORWARD: Guest→WAN" add chain=forward in-interface-list=GUEST out-interface-list=LAN action=drop \ comment="FORWARD: block Guest→LAN" add chain=forward in-interface-list=GUEST out-interface-list=GUEST action=drop \ comment="FORWARD: isolate guests" add chain=forward in-interface-list=WAN out-interface-list=WAN action=drop \ comment="FORWARD: block WAN transit" add chain=forward action=log log=yes log-prefix="FW:forward:drop:" \ limit=10,20:packet \ comment="FORWARD: log dropped" add chain=forward action=drop \ comment="FORWARD: drop all"
Типичные ошибки
1. Правило established/related не первое
Если established/related стоит не в начале цепочки, каждый пакет существующего соединения проверяется множеством правил. На загруженном роутере это вызывает рост CPU и задержки.
Проверьте порядок:
[admin@MikroTik] >/ip/firewall/filter/print where chain=input
Первое правило должно быть connection-state=established,related action=accept.
2. FastTrack не работает
FastTrack несовместим с некоторыми функциями:
- Queue Tree (simple queues работают)
- Mangle routing-mark
- Layer7 protocol matching
- IPsec policy matching
- Connection tracking helper
Если вы используете эти функции для конкретного трафика, добавьте исключение перед FastTrack:
[admin@MikroTik] >/ip/firewall/filter/add chain=forward \ src-address=192.168.88.0/24 \ dst-address-list=vpn-destinations \ action=accept \ comment="Skip FastTrack for policy-routed traffic" \ place-before=[find where action=fasttrack-connection]
3. Забыли masquerade
Без NAT трафик из LAN уходит в WAN с приватным src-address, и ответы не возвращаются. Убедитесь:
[admin@MikroTik] >/ip/firewall/nat/print where chain=srcnat
4. Заблокировали себя
Частая ситуация: добавили drop-правило до accept для LAN. Решение — используйте Safe Mode в WinBox (Ctrl+X) или подключитесь по MAC:
[admin@MikroTik] ># Безопасное добавление правила — сначала accept для LAN /ip/firewall/filter/add chain=input in-interface-list=LAN action=accept \ place-before=0 comment="Emergency LAN access"
5. Bogon-фильтр блокирует локальный трафик
Address-list bogons содержит приватные диапазоны (10.0.0.0/8, 192.168.0.0/16). Убедитесь, что bogon-фильтр применяется только к трафику из WAN:
[admin@MikroTik] ># Правильно: фильтр только для WAN add chain=forward in-interface-list=WAN src-address-list=bogons action=drop # НЕПРАВИЛЬНО: фильтр для всего трафика (заблокирует LAN!) # add chain=forward src-address-list=bogons action=drop
6. Guest VLAN имеет доступ к роутеру
Без явного ограничения гости могут обращаться к DNS, WinBox, SSH и другим сервисам на самом роутере. Добавьте в input chain:
[admin@MikroTik] >add chain=input in-interface-list=GUEST protocol=udp dst-port=53,67 action=accept add chain=input in-interface-list=GUEST action=drop
Порядок: сначала разрешаем DNS+DHCP, потом дропаем всё остальное.
7. Слишком много logging — перегрузка
Логирование каждого пакета при DDoS или сканировании портов генерирует тысячи записей в секунду, перегружая CPU и flash-память. Всегда используйте limit в log-правилах:
[admin@MikroTik] >add chain=input action=log log=yes log-prefix="FW:drop:" limit=10,20:packet
8. Не обновляют bogon-list
Список bogon-адресов может меняться (IANA выделяет новые блоки). Проверяйте актуальность списка раз в год. Основные изменения происходят при выделении новых /8 блоков.
9. Порядок NAT-правил
Если у вас есть dst-nat (port forwarding) и srcnat (masquerade), порядок имеет значение:
[admin@MikroTik] >/ip/firewall/nat/print
dst-nat правила обрабатываются до routing decision, src-nat — после. Убедитесь, что dst-nat правила имеют соответствующие forward-правила:
[admin@MikroTik] ># Port forward: WAN:8080 → 192.168.88.100:80 /ip/firewall/nat/add chain=dstnat \ in-interface-list=WAN protocol=tcp dst-port=8080 \ action=dst-nat to-addresses=192.168.88.100 to-ports=80 # Разрешаем этот трафик в forward /ip/firewall/filter/add chain=forward \ in-interface-list=WAN \ dst-address=192.168.88.100 dst-port=80 protocol=tcp \ connection-state=new \ action=accept \ comment="Allow port forward to web server" \ place-before=[find where chain=forward action=log]
10. Не тестируют firewall после изменений
После любых изменений в firewall проверьте:
- Доступ в интернет из LAN
- Доступ к роутеру из LAN (WinBox, SSH)
- Что WAN-порты закрыты (внешний port scan)
- Что VPN работает (если настроен)
- Что гостевая сеть изолирована
[admin@MikroTik] ># Быстрая проверка — счётчики правил /ip/firewall/filter/print stats
Если после изменений трафик не ходит — проверьте логи:
[admin@MikroTik] >/log/print where message~"FW:"
Заключение
Эталонный firewall MikroTik строится на принципах stateful-фильтрации, оптимизации порядка правил и строгого разделения зон (LAN, WAN, VPN, Guest). FastTrack обеспечивает производительность для established-соединений, а connection-state=established,related первым правилом обрабатывает 90% трафика. Address Lists и Interface Lists упрощают управление, а jump chains помогают структурировать сложные наборы правил. Всегда тестируйте firewall после изменений и регулярно проверяйте логи на предмет аномалий.
# Создаём Interface Lists
/interface/list
add name=WAN comment="Internet-facing interfaces"
add name=LAN comment="Trusted local network"
add name=MGMT comment="Management access"
add name=GUEST comment="Guest/untrusted network"
add name=VPN comment="VPN tunnels"
# Добавляем интерфейсы
/interface/list/member
add list=WAN interface=ether1 comment="Primary ISP"
add list=LAN interface=bridge comment="LAN bridge"
add list=MGMT interface=bridge comment="Management via LAN"
/interface/list/member
add list=WAN interface=ether1 comment="ISP1"
add list=WAN interface=ether2 comment="ISP2"
/interface/list/member
add list=VPN interface=wireguard1 comment="WireGuard VPN"
add list=LAN interface=wireguard1 comment="VPN as trusted"
/interface/list/member
add list=GUEST interface=vlan-guest comment="Guest VLAN"
/ip/firewall/address-list
# Bogon-адреса (не должны приходить из интернета)
add list=bogons address=0.0.0.0/8 comment="RFC 1122 this network"
add list=bogons address=10.0.0.0/8 comment="RFC 1918 private"
add list=bogons address=100.64.0.0/10 comment="RFC 6598 CGN"
add list=bogons address=127.0.0.0/8 comment="RFC 1122 loopback"
add list=bogons address=169.254.0.0/16 comment="RFC 3927 link-local"
add list=bogons address=172.16.0.0/12 comment="RFC 1918 private"
add list=bogons address=192.0.0.0/24 comment="RFC 6890 IETF protocol"
add list=bogons address=192.0.2.0/24 comment="RFC 5737 TEST-NET-1"
add list=bogons address=192.168.0.0/16 comment="RFC 1918 private"
add list=bogons address=198.18.0.0/15 comment="RFC 2544 benchmark"
add list=bogons address=198.51.100.0/24 comment="RFC 5737 TEST-NET-2"
add list=bogons address=203.0.113.0/24 comment="RFC 5737 TEST-NET-3"
add list=bogons address=224.0.0.0/4 comment="RFC 5771 multicast"
add list=bogons address=240.0.0.0/4 comment="RFC 1112 reserved"
# DNS-серверы (для ограничения DNS-запросов)
add list=dns-servers address=1.1.1.1 comment="Cloudflare"
add list=dns-servers address=1.0.0.1 comment="Cloudflare"
add list=dns-servers address=8.8.8.8 comment="Google"
add list=dns-servers address=8.8.4.4 comment="Google"
add list=dns-servers address=9.9.9.9 comment="Quad9"
# Управляющие адреса (доступ к роутеру)
add list=management address=192.168.88.0/24 comment="LAN subnet"
/ip/firewall/filter
# === INPUT CHAIN ===
# 1. Established/Related — 90% трафика
add chain=input action=accept \
connection-state=established,related \
comment="Accept established/related"
# 2. Drop invalid
add chain=input action=drop \
connection-state=invalid \
comment="Drop invalid"
# 3. ICMP — разрешаем пинг (с лимитом)
add chain=input action=accept \
protocol=icmp icmp-options=0:0 limit=5,10:packet \
comment="Accept ICMP echo reply (limited)"
add chain=input action=accept \
protocol=icmp icmp-options=8:0 limit=5,10:packet \
comment="Accept ICMP echo request (limited)"
add chain=input action=accept \
protocol=icmp icmp-options=3:0-15 limit=5,10:packet \
comment="Accept ICMP destination unreachable"
add chain=input action=accept \
protocol=icmp icmp-options=11:0-1 limit=5,10:packet \
comment="Accept ICMP time exceeded"
add chain=input action=drop \
protocol=icmp \
comment="Drop all other ICMP"
# 4. Разрешаем доступ из LAN к сервисам роутера
add chain=input action=accept \
in-interface-list=LAN \
comment="Accept all from LAN"
# 5. Разрешаем VPN-подключения из WAN
add chain=input action=accept \
protocol=udp dst-port=13231 in-interface-list=WAN \
comment="Accept WireGuard from WAN"
# 6. Разрешаем DNS только для LAN (если MikroTik — DNS-сервер)
add chain=input action=accept \
protocol=udp dst-port=53 in-interface-list=LAN \
comment="Accept DNS from LAN"
add chain=input action=accept \
protocol=tcp dst-port=53 in-interface-list=LAN \
comment="Accept DNS TCP from LAN"
# 7. Разрешаем DHCP
add chain=input action=accept \
protocol=udp dst-port=67 in-interface-list=LAN \
comment="Accept DHCP from LAN"
# 8. Разрешаем доступ из VPN
add chain=input action=accept \
in-interface-list=VPN \
comment="Accept all from VPN"
# 9. Логируем и дропаем всё остальное
add chain=input action=log \
log=yes log-prefix="FW:input:drop:" \
comment="Log dropped input"
add chain=input action=drop \
comment="Drop all other input"
# === FORWARD CHAIN ===
# 1. FastTrack established/related (ПЕРВЫМ!)
add chain=forward action=fasttrack-connection \
connection-state=established,related \
hw-offload=yes \
comment="FastTrack established/related"
add chain=forward action=accept \
connection-state=established,related \
comment="Accept established/related"
# 2. Drop invalid
add chain=forward action=drop \
connection-state=invalid \
comment="Drop invalid forward"
# 3. Drop bogon src из WAN
add chain=forward action=drop \
in-interface-list=WAN \
src-address-list=bogons \
comment="Drop bogon sources from WAN"
# 4. LAN → WAN — разрешаем
add chain=forward action=accept \
in-interface-list=LAN out-interface-list=WAN \
connection-state=new \
comment="Accept LAN to WAN (new)"
# 5. LAN → VPN — разрешаем
add chain=forward action=accept \
in-interface-list=LAN out-interface-list=VPN \
connection-state=new \
comment="Accept LAN to VPN (new)"
# 6. VPN → LAN — разрешаем (если нужен доступ из VPN в LAN)
add chain=forward action=accept \
in-interface-list=VPN out-interface-list=LAN \
connection-state=new \
comment="Accept VPN to LAN (new)"
# 7. Guest → WAN — разрешаем только интернет
add chain=forward action=accept \
in-interface-list=GUEST out-interface-list=WAN \
connection-state=new \
comment="Accept Guest to WAN (new)"
# 8. Guest → LAN — запрещаем!
add chain=forward action=drop \
in-interface-list=GUEST out-interface-list=LAN \
comment="Drop Guest to LAN"
# 9. Guest → Guest — запрещаем (изоляция гостей)
add chain=forward action=drop \
in-interface-list=GUEST out-interface-list=GUEST \
comment="Drop Guest to Guest"
# 10. Логируем и дропаем всё остальное
add chain=forward action=log \
log=yes log-prefix="FW:forward:drop:" \
comment="Log dropped forward"
add chain=forward action=drop \
comment="Drop all other forward"
# Создаём специализированные цепочки
# === ICMP Chain ===
add chain=input action=jump jump-target=icmp-chain \
protocol=icmp comment="Jump to ICMP rules"
add chain=icmp-chain action=accept \
icmp-options=0:0 limit=5,10:packet \
comment="Echo reply"
add chain=icmp-chain action=accept \
icmp-options=8:0 limit=5,10:packet \
comment="Echo request"
add chain=icmp-chain action=accept \
icmp-options=3:0-15 limit=5,10:packet \
comment="Destination unreachable"
add chain=icmp-chain action=accept \
icmp-options=11:0-1 limit=5,10:packet \
comment="Time exceeded"
add chain=icmp-chain action=drop \
comment="Drop all other ICMP"
# === WAN-INPUT Chain ===
add chain=input action=jump jump-target=wan-input \
in-interface-list=WAN comment="Jump to WAN input rules"
add chain=wan-input action=accept \
protocol=udp dst-port=13231 \
comment="WireGuard"
add chain=wan-input action=drop \
comment="Drop all other WAN input"
# === GUEST-FORWARD Chain ===
add chain=forward action=jump jump-target=guest-forward \
in-interface-list=GUEST comment="Jump to Guest rules"
add chain=guest-forward action=accept \
out-interface-list=WAN connection-state=new \
comment="Guest to WAN"
add chain=guest-forward action=drop \
comment="Drop all other Guest traffic"
# NAT для обоих WAN
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT ISP1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT ISP2"
# Firewall — оба WAN в списке WAN, правила одинаковые
# Дополнительно: блокируем трафик между WAN-интерфейсами
/ip/firewall/filter
add chain=forward \
in-interface-list=WAN out-interface-list=WAN \
action=drop \
comment="Drop WAN to WAN transit" \
place-before=[find where chain=forward action=drop comment~"Drop all"]
# WireGuard (UDP 13231)
/ip/firewall/filter/add chain=input \
protocol=udp dst-port=13231 in-interface-list=WAN \
action=accept \
comment="Accept WireGuard" \
place-before=[find where chain=input action=log]
# L2TP/IPsec
/ip/firewall/filter
add chain=input protocol=udp dst-port=500 in-interface-list=WAN \
action=accept comment="Accept IKE" \
place-before=[find where chain=input action=log]
add chain=input protocol=udp dst-port=4500 in-interface-list=WAN \
action=accept comment="Accept NAT-T" \
place-before=[find where chain=input action=log]
add chain=input protocol=ipsec-esp in-interface-list=WAN \
action=accept comment="Accept IPsec ESP" \
place-before=[find where chain=input action=log]
# Разрешаем трафик из VPN в LAN и обратно
/ip/firewall/filter
add chain=forward in-interface-list=VPN out-interface-list=LAN \
action=accept connection-state=new \
comment="VPN to LAN" \
place-before=[find where chain=forward action=log]
add chain=forward in-interface-list=LAN out-interface-list=VPN \
action=accept connection-state=new \
comment="LAN to VPN" \
place-before=[find where chain=forward action=log]
/ip/firewall/filter
# Guest → LAN: полный запрет
add chain=forward in-interface-list=GUEST \
dst-address=192.168.88.0/24 \
action=drop \
comment="Block Guest to LAN"
# Guest → роутер: только DNS и DHCP
add chain=input in-interface-list=GUEST \
protocol=udp dst-port=53,67 \
action=accept \
comment="Guest: DNS + DHCP only"
add chain=input in-interface-list=GUEST \
action=drop \
comment="Guest: drop all other to router"
# Guest → Guest: изоляция
add chain=forward in-interface-list=GUEST \
out-interface-list=GUEST \
action=drop \
comment="Isolate guests from each other"
# Guest → WAN: разрешаем только HTTP/HTTPS/DNS
add chain=forward in-interface-list=GUEST \
out-interface-list=WAN \
protocol=tcp dst-port=80,443 \
connection-state=new \
action=accept \
comment="Guest: HTTP/HTTPS only"
add chain=forward in-interface-list=GUEST \
out-interface-list=WAN \
protocol=udp dst-port=53 \
action=accept \
comment="Guest: DNS"
add chain=forward in-interface-list=GUEST \
action=drop \
comment="Guest: drop all other"
# Настройка логирования
/system/logging
add topics=firewall action=disk
add topics=firewall action=remote target=10.0.0.100
# Логируем drop в input (с лимитом, чтобы не перегрузить)
/ip/firewall/filter/set [find where chain=input action=log] \
log=yes log-prefix="FW:input:drop:" limit=10,20:packet
# Логируем drop в forward
/ip/firewall/filter/set [find where chain=forward action=log] \
log=yes log-prefix="FW:forward:drop:" limit=10,20:packet
/log/print where message~"FW:"
# Обнаружение сканирования портов
/ip/firewall/filter
add chain=input protocol=tcp tcp-flags=fin,syn \
action=add-src-to-address-list \
address-list=port-scanners address-list-timeout=2w \
comment="Detect SYN+FIN scan"
add chain=input protocol=tcp tcp-flags=syn,rst \
action=add-src-to-address-list \
address-list=port-scanners address-list-timeout=2w \
comment="Detect SYN+RST scan"
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
action=add-src-to-address-list \
address-list=port-scanners address-list-timeout=2w \
comment="Detect XMAS scan"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
action=add-src-to-address-list \
address-list=port-scanners address-list-timeout=2w \
comment="Detect NULL scan"
# Блокируем port-scanners
add chain=input src-address-list=port-scanners \
action=drop \
comment="Drop port scanners"
# Brute force protection для SSH/WinBox
add chain=input protocol=tcp dst-port=22,8291 \
connection-state=new \
src-address-list=bruteforce-stage3 \
action=drop \
comment="Drop brute force stage 3"
add chain=input protocol=tcp dst-port=22,8291 \
connection-state=new \
src-address-list=bruteforce-stage2 \
action=add-src-to-address-list \
address-list=bruteforce-stage3 address-list-timeout=1d \
comment="Brute force stage 2 → 3"
add chain=input protocol=tcp dst-port=22,8291 \
connection-state=new \
src-address-list=bruteforce-stage1 \
action=add-src-to-address-list \
address-list=bruteforce-stage2 address-list-timeout=4m \
comment="Brute force stage 1 → 2"
add chain=input protocol=tcp dst-port=22,8291 \
connection-state=new \
action=add-src-to-address-list \
address-list=bruteforce-stage1 address-list-timeout=1m \
comment="Brute force stage 0 → 1"
/ip/firewall/filter/print stats
/ip/firewall/filter/print stats where action=fasttrack-connection
/ip/settings/print
/ip/firewall/connection/print
/ip/firewall/connection/print count-only
nmap -sS -p 1-65535 <ваш внешний IP>
/ip/firewall/address-list/print where list=port-scanners
/ip/firewall/address-list/print where list=bruteforce-stage3
/log/print where message~"FW:input:drop"
/log/print where message~"FW:forward:drop"
# ВНИМАНИЕ: это удалит ВСЕ текущие правила firewall!
# Выполняйте только если понимаете последствия.
# Рекомендуется сначала создать backup.
/system/backup/save name=before-firewall-reset
# Очистка
/ip/firewall/filter/remove [find]
/ip/firewall/nat/remove [find]
/ip/firewall/address-list/remove [find]
# === Interface Lists ===
/interface/list
add name=WAN
add name=LAN
add name=VPN
add name=GUEST
/interface/list/member
add list=WAN interface=ether1
add list=LAN interface=bridge
# === Address Lists ===
/ip/firewall/address-list
add list=bogons address=0.0.0.0/8
add list=bogons address=10.0.0.0/8
add list=bogons address=100.64.0.0/10
add list=bogons address=127.0.0.0/8
add list=bogons address=169.254.0.0/16
add list=bogons address=172.16.0.0/12
add list=bogons address=192.0.0.0/24
add list=bogons address=192.0.2.0/24
add list=bogons address=192.168.0.0/16
add list=bogons address=198.18.0.0/15
add list=bogons address=198.51.100.0/24
add list=bogons address=203.0.113.0/24
add list=bogons address=224.0.0.0/4
add list=bogons address=240.0.0.0/4
# === NAT ===
/ip/firewall/nat
add chain=srcnat out-interface-list=WAN action=masquerade \
comment="NAT to WAN"
# === Filter: Input ===
/ip/firewall/filter
add chain=input connection-state=established,related action=accept \
comment="INPUT: established/related"
add chain=input connection-state=invalid action=drop \
comment="INPUT: drop invalid"
add chain=input protocol=icmp icmp-options=8:0 limit=5,10:packet action=accept \
comment="INPUT: ICMP echo request"
add chain=input protocol=icmp icmp-options=0:0 action=accept \
comment="INPUT: ICMP echo reply"
add chain=input protocol=icmp icmp-options=3:0-15 action=accept \
comment="INPUT: ICMP dest unreachable"
add chain=input protocol=icmp icmp-options=11:0-1 action=accept \
comment="INPUT: ICMP time exceeded"
add chain=input protocol=icmp action=drop \
comment="INPUT: drop other ICMP"
add chain=input in-interface-list=LAN action=accept \
comment="INPUT: accept all from LAN"
add chain=input in-interface-list=VPN action=accept \
comment="INPUT: accept all from VPN"
add chain=input in-interface-list=GUEST protocol=udp dst-port=53,67 action=accept \
comment="INPUT: Guest DNS+DHCP"
add chain=input in-interface-list=GUEST action=drop \
comment="INPUT: drop Guest to router"
add chain=input in-interface-list=WAN protocol=udp dst-port=13231 action=accept \
comment="INPUT: WireGuard from WAN"
add chain=input action=log log=yes log-prefix="FW:input:drop:" \
limit=10,20:packet \
comment="INPUT: log dropped"
add chain=input action=drop \
comment="INPUT: drop all"
# === Filter: Forward ===
add chain=forward connection-state=established,related action=fasttrack-connection \
hw-offload=yes \
comment="FORWARD: FastTrack established"
add chain=forward connection-state=established,related action=accept \
comment="FORWARD: accept established"
add chain=forward connection-state=invalid action=drop \
comment="FORWARD: drop invalid"
add chain=forward in-interface-list=WAN src-address-list=bogons action=drop \
comment="FORWARD: drop bogon src from WAN"
add chain=forward in-interface-list=LAN out-interface-list=WAN \
connection-state=new action=accept \
comment="FORWARD: LAN→WAN"
add chain=forward in-interface-list=LAN out-interface-list=VPN \
connection-state=new action=accept \
comment="FORWARD: LAN→VPN"
add chain=forward in-interface-list=VPN out-interface-list=LAN \
connection-state=new action=accept \
comment="FORWARD: VPN→LAN"
add chain=forward in-interface-list=GUEST out-interface-list=WAN \
connection-state=new action=accept \
comment="FORWARD: Guest→WAN"
add chain=forward in-interface-list=GUEST out-interface-list=LAN action=drop \
comment="FORWARD: block Guest→LAN"
add chain=forward in-interface-list=GUEST out-interface-list=GUEST action=drop \
comment="FORWARD: isolate guests"
add chain=forward in-interface-list=WAN out-interface-list=WAN action=drop \
comment="FORWARD: block WAN transit"
add chain=forward action=log log=yes log-prefix="FW:forward:drop:" \
limit=10,20:packet \
comment="FORWARD: log dropped"
add chain=forward action=drop \
comment="FORWARD: drop all"
/ip/firewall/filter/print where chain=input
/ip/firewall/filter/add chain=forward \
src-address=192.168.88.0/24 \
dst-address-list=vpn-destinations \
action=accept \
comment="Skip FastTrack for policy-routed traffic" \
place-before=[find where action=fasttrack-connection]
/ip/firewall/nat/print where chain=srcnat
# Безопасное добавление правила — сначала accept для LAN
/ip/firewall/filter/add chain=input in-interface-list=LAN action=accept \
place-before=0 comment="Emergency LAN access"
# Правильно: фильтр только для WAN
add chain=forward in-interface-list=WAN src-address-list=bogons action=drop
# НЕПРАВИЛЬНО: фильтр для всего трафика (заблокирует LAN!)
# add chain=forward src-address-list=bogons action=drop
add chain=input in-interface-list=GUEST protocol=udp dst-port=53,67 action=accept
add chain=input in-interface-list=GUEST action=drop
add chain=input action=log log=yes log-prefix="FW:drop:" limit=10,20:packet
/ip/firewall/nat/print
# Port forward: WAN:8080 → 192.168.88.100:80
/ip/firewall/nat/add chain=dstnat \
in-interface-list=WAN protocol=tcp dst-port=8080 \
action=dst-nat to-addresses=192.168.88.100 to-ports=80
# Разрешаем этот трафик в forward
/ip/firewall/filter/add chain=forward \
in-interface-list=WAN \
dst-address=192.168.88.100 dst-port=80 protocol=tcp \
connection-state=new \
action=accept \
comment="Allow port forward to web server" \
place-before=[find where chain=forward action=log]
# Быстрая проверка — счётчики правил
/ip/firewall/filter/print stats
/log/print where message~"FW:"