mikrotik-wiki.ru
Главная
Загрузка...

Best practices Firewall на MikroTik

RouterOS 7.xIP14 мин430 мар. 2026 г.
TelegramVK

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 — пакеты, отправляемые самим роутером (обычно не фильтруются)

Ключевые принципы:

  1. Default deny — всё, что не разрешено явно, запрещено
  2. Stateful firewall — используем connection tracking (established/related/invalid)
  3. Performance first — самые частые совпадения в начале цепочки
  4. FastTrack — аппаратное ускорение для established-соединений
  5. Address Lists — группировка адресов для удобства управления
  6. 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-порты закрыты:

code
nmap -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 проверьте:

  1. Доступ в интернет из LAN
  2. Доступ к роутеру из LAN (WinBox, SSH)
  3. Что WAN-порты закрыты (внешний port scan)
  4. Что VPN работает (если настроен)
  5. Что гостевая сеть изолирована
[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 после изменений и регулярно проверяйте логи на предмет аномалий.

[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"
/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:"
IP / Best practices Firewall на MikroTik