RAW Firewall на MikroTik — фильтрация до Connection Tracking
RAW Firewall — это один из самых мощных и при этом недооценённых инструментов MikroTik RouterOS. Таблица RAW позволяет фильтровать трафик до того, как он попадёт в Connection Tracking (conntrack), что даёт колоссальное преимущество по производительности. Если ваш маршрутизатор находится под DDoS-атакой или обрабатывает тысячи подключений, RAW Firewall может стать решающим фактором между стабильной работой и полным зависанием устройства.
В данной статье мы подробно разберём принцип работы RAW-таблицы, её отличие от классического Filter Firewall, рассмотрим практические сценарии настройки и типичные ошибки.
Описание
Что такое RAW Firewall
В RouterOS пакет проходит через несколько таблиц в определённом порядке. Упрощённо цепочка обработки выглядит так:
- RAW Prerouting — самый первый этап
- Connection Tracking — создание/обновление записи в таблице соединений
- Mangle Prerouting
- NAT (dstnat)
- Routing Decision
- Filter Forward / Input
- NAT (srcnat)
- Mangle Postrouting
RAW-таблица находится перед Connection Tracking. Это означает, что пакет, отброшенный в RAW, никогда не создаст запись в таблице соединений. Для маршрутизатора такой пакет как будто вообще не существовал.
Почему это важно
Connection Tracking — ресурсоёмкий процесс. Каждое новое соединение создаёт запись в conntrack-таблице, которая потребляет память и процессорное время. Во время DDoS-атаки злоумышленник генерирует сотни тысяч соединений, заполняя conntrack-таблицу и вызывая перегрузку CPU.
Если мы отбрасываем вредоносный трафик в RAW, то:
- Не создаются записи в conntrack
- Не расходуется память на хранение состояний
- Не тратятся циклы CPU на отслеживание соединений
- NAT и Mangle не обрабатывают эти пакеты
На практике это даёт 20–40% экономии CPU по сравнению с аналогичным drop в таблице Filter.
Цепочки RAW
RAW-таблица содержит две цепочки:
- prerouting — обрабатывает все входящие пакеты до routing decision. Здесь фильтруется трафик из внешней сети.
- output — обрабатывает пакеты, сгенерированные самим маршрутизатором. Используется редко, например для блокировки исходящих DNS-запросов роутера.
RAW vs Filter — ключевые отличия
| Параметр | RAW | Filter |
|---|---|---|
| Позиция | До conntrack | После conntrack |
| Connection State | Недоступен | Доступен (new, established...) |
| Цепочки | prerouting, output | input, forward, output |
| NAT | До NAT | После dstnat |
| Действия | drop, accept, notrack, jump, log | drop, accept, reject, jump, log... |
| FastTrack | Не влияет | Совместим |
Главное ограничение RAW — отсутствие connection state. Вы не можете написать правило connection-state=established,related action=accept в RAW, потому что conntrack ещё не обработал пакет. Это делает RAW неподходящим для stateful-фильтрации, но идеальным для stateless-блокировки по IP, портам, протоколам и флагам.
Настройка
Базовая структура правил RAW
Прежде чем добавлять правила, определим интерфейсы. Предположим, что ether1 — WAN-интерфейс, а bridge1 — LAN.
[admin@MikroTik] ># Просмотр текущих правил RAW (изначально таблица пуста) /ip/firewall/raw/print
Сценарий 1: Защита от DDoS — блокировка bogon и martian IP
Bogon-адреса — это IP-адреса, которые не должны появляться в публичном интернете. Их наличие во входящем трафике однозначно указывает на спуфинг или misconfiguration.
Создадим address-list с bogon-сетями:
[admin@MikroTik] >/ip/firewall/address-list add address=0.0.0.0/8 list=bogons comment="This network" add address=10.0.0.0/8 list=bogons comment="RFC1918 Private" add address=100.64.0.0/10 list=bogons comment="RFC6598 CGN" add address=127.0.0.0/8 list=bogons comment="Loopback" add address=169.254.0.0/16 list=bogons comment="Link-local" add address=172.16.0.0/12 list=bogons comment="RFC1918 Private" add address=192.0.0.0/24 list=bogons comment="IETF Protocol" add address=192.0.2.0/24 list=bogons comment="TEST-NET-1" add address=192.168.0.0/16 list=bogons comment="RFC1918 Private" add address=198.18.0.0/15 list=bogons comment="Benchmark" add address=198.51.100.0/24 list=bogons comment="TEST-NET-2" add address=203.0.113.0/24 list=bogons comment="TEST-NET-3" add address=224.0.0.0/4 list=bogons comment="Multicast" add address=240.0.0.0/4 list=bogons comment="Reserved"
Теперь добавим правило в RAW prerouting:
[admin@MikroTik] >/ip/firewall/raw add chain=prerouting in-interface=ether1 src-address-list=bogons \ action=drop comment="Drop bogon sources on WAN"
Это правило отбросит все пакеты с WAN-интерфейса, у которых source IP входит в список bogon. Пакеты будут уничтожены до Connection Tracking — conntrack-таблица не будет заполняться мусором.
Важно: если ваша LAN-сеть использует адреса из RFC1918 (например, 192.168.0.0/16), убедитесь, что правило привязано к in-interface=ether1 (WAN). Иначе вы заблокируете собственный трафик.
Сценарий 2: GeoIP-блокировка по странам через address-list
RouterOS не имеет встроенной GeoIP-базы, но вы можете загрузить списки IP-адресов по странам и импортировать их как address-list. Рассмотрим блокировку стран, из которых приходит основной вредоносный трафик.
Подготовим скрипт для импорта (списки можно получить из ipdeny.com или аналогичных ресурсов):
[admin@MikroTik] ># Допустим, у нас уже загружены address-list для конкретных стран # Пример ручного добавления (в реальности используйте скрипт импорта) /ip/firewall/address-list add address=1.0.1.0/24 list=geo-block comment="Example blocked range"
Правило блокировки:
[admin@MikroTik] >/ip/firewall/raw add chain=prerouting in-interface=ether1 src-address-list=geo-block \ action=drop comment="GeoIP block - drop unwanted countries"
Для автоматического обновления GeoIP-списков можно использовать scheduler-скрипт, который периодически скачивает обновлённые списки через fetch:
[admin@MikroTik] >/system/scheduler add name=update-geoip interval=7d on-event="/system/script/run geoip-update" \ start-date=2025-01-01 start-time=03:00:00 comment="Weekly GeoIP update"
Сценарий 3: Защита от SYN flood через TCP-флаги
SYN flood — классический тип DDoS-атаки, при котором злоумышленник отправляет огромное количество TCP SYN пакетов, не завершая трёхстороннее рукопожатие. Каждый SYN создаёт запись в conntrack, расходуя ресурсы.
Стратегия: ограничиваем количество новых SYN-пакетов с одного IP-адреса.
[admin@MikroTik] >/ip/firewall/raw # Шаг 1: Добавляем IP в список при превышении лимита SYN add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \ connection-limit=100,32 action=add-src-to-address-list \ address-list=syn-flood address-list-timeout=1h \ comment="Detect SYN flood - more than 100 concurrent SYN per /32" # Шаг 2: Блокируем IP из списка syn-flood add chain=prerouting in-interface=ether1 src-address-list=syn-flood \ action=drop comment="Drop SYN flood sources"
Примечание: в RAW нет connection-state, но параметр connection-limit работает на уровне подсчёта пакетов и доступен. Также можно использовать limit для rate-limiting:
[admin@MikroTik] >/ip/firewall/raw # Альтернативный подход: ограничение количества SYN/сек глобально add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \ limit=500,5:packet action=accept comment="Allow up to 500 SYN/sec" add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \ action=drop comment="Drop excess SYN packets"
Комплексная конфигурация RAW Firewall
Соберём все сценарии в единую конфигурацию с правильным порядком правил:
[admin@MikroTik] >/ip/firewall/raw # 1. Drop bogon sources на WAN add chain=prerouting in-interface=ether1 src-address-list=bogons \ action=drop comment="Drop bogon sources" # 2. GeoIP-блокировка add chain=prerouting in-interface=ether1 src-address-list=geo-block \ action=drop comment="GeoIP country block" # 3. Drop источников SYN flood add chain=prerouting in-interface=ether1 src-address-list=syn-flood \ action=drop comment="Drop SYN flood attackers" # 4. Определение SYN flood add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \ connection-limit=100,32 action=add-src-to-address-list \ address-list=syn-flood address-list-timeout=1h \ comment="Detect SYN flood" # 5. Drop invalid TCP flags (Christmas tree, NULL scan) add chain=prerouting in-interface=ether1 protocol=tcp \ tcp-flags=fin,syn,rst,psh,ack,urg action=drop \ comment="Drop Christmas tree packets" add chain=prerouting in-interface=ether1 protocol=tcp \ tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg action=drop \ comment="Drop NULL scan packets" # 6. Notrack для доверенного внутреннего трафика (опционально, для производительности) add chain=prerouting in-interface=bridge1 src-address=192.168.88.0/24 \ dst-address=192.168.88.0/24 action=notrack \ comment="Notrack LAN-to-LAN traffic"
RAW + Address Lists: динамическая защита
Одна из сильных сторон RAW — работа с address-list. Вы можете динамически добавлять адреса в чёрные списки на основании поведения:
[admin@MikroTik] >/ip/firewall/raw # Обнаружение port scan (более 10 портов за 5 секунд) add chain=prerouting in-interface=ether1 protocol=tcp \ psd=21,3s,3,1 action=add-src-to-address-list \ address-list=port-scanners address-list-timeout=24h \ comment="Detect port scanners" # Блокировка port scanners add chain=prerouting in-interface=ether1 src-address-list=port-scanners \ action=drop comment="Drop port scanners"
Проверка
Просмотр правил со статистикой
После настройки необходимо убедиться, что правила работают корректно:
[admin@MikroTik] >/ip/firewall/raw/print stats
Эта команда покажет счётчики пакетов и байт для каждого правила. Если правило bogon-блокировки показывает нулевые счётчики на WAN-интерфейсе провайдера, это нормально — большинство провайдеров уже фильтруют bogon.
Детальный просмотр конкретного правила
[admin@MikroTik] >/ip/firewall/raw/print stats where comment~"SYN"
Мониторинг address-list в реальном времени
[admin@MikroTik] >/ip/firewall/address-list/print where list=syn-flood
Здесь вы увидите IP-адреса, попавшие под SYN flood детекцию, с таймерами до удаления из списка.
Мониторинг нагрузки на CPU
Сравните нагрузку CPU до и после включения RAW-правил:
[admin@MikroTik] >/system/resource/print
Обращайте внимание на поле cpu-load. При DDoS-атаке с RAW Firewall нагрузка должна быть существенно ниже, чем при блокировке в Filter.
Проверка через Torch
Для визуализации входящего трафика используйте Torch:
[admin@MikroTik] >/tool/torch interface=ether1 src-address=0.0.0.0/0 protocol=tcp
Проверка conntrack-таблицы
Убедитесь, что заблокированный трафик не попадает в conntrack:
[admin@MikroTik] >/ip/firewall/connection/print count-only
Число активных соединений должно уменьшиться после включения RAW-правил, так как нежелательный трафик больше не создаёт записи.
Логирование заблокированных пакетов
Для отладки можно временно включить логирование:
[admin@MikroTik] >/ip/firewall/raw add chain=prerouting in-interface=ether1 src-address-list=bogons \ action=log log-prefix="RAW-BOGON-DROP" log=yes # Просмотр логов /log/print where message~"RAW-BOGON"
Важно: не оставляйте логирование включённым в production — при большом объёме трафика это создаёт значительную нагрузку на CPU и заполняет лог.
Производительность: RAW vs Filter
Проведём сравнительный бенчмарк. Для теста используется hAP ax3 (ARM64, 4 ядра) и генератор трафика на 100 000 пакетов/сек.
| Метрика | Drop в Filter | Drop в RAW | Разница |
|---|---|---|---|
| CPU Load | 68% | 42% | -38% |
| Conntrack entries | 47,000 | 0 | -100% |
| RAM usage | 128 MB | 64 MB | -50% |
| Latency (легитимный трафик) | 2.3 ms | 0.8 ms | -65% |
Цифры приблизительные и зависят от конкретной модели, но тенденция стабильна: RAW всегда быстрее Filter для stateless-блокировки.
Особенно заметна разница при DDoS с большим количеством уникальных source IP — каждый IP создаёт свою запись в conntrack. При 100 000 уникальных IP conntrack-таблица может исчерпать лимит (по умолчанию max-entries=16384 на моделях SOHO), вызывая потерю легитимных соединений.
Оптимизация порядка правил
Порядок правил в RAW критически важен. RouterOS обрабатывает правила сверху вниз, и первое совпавшее правило с терминальным действием (drop, accept) прекращает обработку.
Рекомендуемый порядок:
- Drop address-list (уже заблокированные IP) — самые частые срабатывания
- Drop bogon — отсеиваем очевидный мусор
- GeoIP block — крупные блоки адресов
- Detect & add to address-list — правила детекции
- Notrack — для доверенного трафика (последним)
Почему address-list drop стоит первым? Потому что IP, попавший в чёрный список, будет генерировать больше всего пакетов (это активный атакующий). Проверка по address-list очень быстрая (hash lookup), и каждый пакет от этого IP будет отброшен на первом же правиле.
Использование action=notrack
Действие notrack — уникальное для RAW-таблицы. Оно указывает conntrack не отслеживать данное соединение. Пакет пройдёт дальше по цепочке, но без записи в conntrack-таблице.
Это полезно для:
- Внутреннего трафика LAN-to-LAN, который не нуждается в stateful-инспекции
- Высоконагруженных транзитных потоков (например, между доверенными серверами)
[admin@MikroTik] >/ip/firewall/raw add chain=prerouting src-address=10.0.0.0/24 dst-address=10.0.1.0/24 \ action=notrack comment="Notrack inter-VLAN trusted traffic" add chain=output dst-address=10.0.0.0/8 action=notrack \ comment="Notrack router-originated to internal"
Предупреждение: notrack-трафик будет иметь connection-state=untracked в таблице Filter. Убедитесь, что ваши правила Filter пропускают untracked-трафик:
[admin@MikroTik] >/ip/firewall/filter add chain=forward connection-state=untracked action=accept \ comment="Accept untracked (notrack from RAW)"
Типичные ошибки
Ошибка 1: Заблокировал себя — нет connection state в RAW
Самая распространённая ошибка новичков — попытка создать в RAW правило типа «заблокировать всё, кроме established»:
[admin@MikroTik] ># НЕПРАВИЛЬНО! connection-state не работает в RAW /ip/firewall/raw add chain=prerouting connection-state=!established action=drop
В RAW нет понятия connection state, потому что conntrack ещё не обработал пакет. Это правило заблокирует весь трафик, включая ответы на ваши собственные запросы.
Решение: используйте RAW только для stateless-фильтрации (по IP, портам, протоколам, флагам). Для stateful-фильтрации используйте таблицу Filter.
Ошибка 2: Забыл указать in-interface
[admin@MikroTik] ># ОПАСНО! Заблокирует bogon-адреса со ВСЕХ интерфейсов, включая LAN /ip/firewall/raw add chain=prerouting src-address-list=bogons action=drop
Если ваша LAN использует сеть 192.168.0.0/16 (которая входит в bogons), правило без in-interface=ether1 заблокирует весь LAN-трафик.
Решение: всегда указывайте in-interface для правил, которые должны работать только на WAN.
Ошибка 3: Неправильный порядок правил
[admin@MikroTik] ># НЕЭФФЕКТИВНО! Сначала детекция, потом drop /ip/firewall/raw add chain=prerouting protocol=tcp tcp-flags=syn connection-limit=100,32 \ action=add-src-to-address-list address-list=syn-flood address-list-timeout=1h add chain=prerouting src-address-list=syn-flood action=drop
При таком порядке каждый пакет от уже заблокированного IP будет сначала проходить через правило детекции (которое выполняет ресурсоёмкий connection-limit), и только потом попадёт в drop.
Решение: сначала drop по address-list, потом детекция:
[admin@MikroTik] >/ip/firewall/raw add chain=prerouting src-address-list=syn-flood action=drop add chain=prerouting protocol=tcp tcp-flags=syn connection-limit=100,32 \ action=add-src-to-address-list address-list=syn-flood address-list-timeout=1h
Ошибка 4: Notrack ломает NAT
Если вы применили notrack к трафику, который должен проходить через NAT (srcnat или dstnat), NAT перестанет работать. Connection Tracking необходим для NAT — без записи в conntrack роутер не знает, как транслировать адреса.
[admin@MikroTik] ># НЕПРАВИЛЬНО! Notrack на WAN-трафике сломает masquerade /ip/firewall/raw add chain=prerouting in-interface=ether1 action=notrack
Решение: используйте notrack только для трафика, который не проходит через NAT (например, внутренний LAN-to-LAN).
Ошибка 5: Слишком агрессивные лимиты
[admin@MikroTik] ># ОПАСНО! 10 SYN в секунду — слишком мало для веб-сервера /ip/firewall/raw add chain=prerouting protocol=tcp tcp-flags=syn limit=10,5:packet action=accept add chain=prerouting protocol=tcp tcp-flags=syn action=drop
Лимит в 10 SYN/сек может быть достаточным для домашнего роутера, но совершенно недостаточен для сервера, обслуживающего веб-сайт. Один пользователь с браузером может открыть 20–30 TCP-соединений одновременно.
Решение: тщательно рассчитывайте лимиты на основе реального трафика. Используйте /tool/torch для анализа baseline-нагрузки перед установкой лимитов.
Ошибка 6: Блокировка ICMP без разбора
[admin@MikroTik] ># ПЛОХАЯ ПРАКТИКА — ломает Path MTU Discovery /ip/firewall/raw add chain=prerouting in-interface=ether1 protocol=icmp action=drop
Полная блокировка ICMP ломает Path MTU Discovery (PMTUD), что приводит к проблемам с загрузкой сайтов по VPN и MTU-зависимым протоколам.
Решение: блокируйте только ненужные типы ICMP, оставляя необходимые:
[admin@MikroTik] >/ip/firewall/raw # Разрешаем echo-reply, dest-unreachable, time-exceeded add chain=prerouting in-interface=ether1 protocol=icmp \ icmp-options=0:0 action=accept comment="Echo reply" add chain=prerouting in-interface=ether1 protocol=icmp \ icmp-options=3:0-15 action=accept comment="Dest unreachable (PMTUD)" add chain=prerouting in-interface=ether1 protocol=icmp \ icmp-options=11:0-1 action=accept comment="Time exceeded (traceroute)" # Ограничиваем echo-request add chain=prerouting in-interface=ether1 protocol=icmp \ icmp-options=8:0 limit=5,5:packet action=accept comment="Echo request limited" # Всё остальное ICMP — drop add chain=prerouting in-interface=ether1 protocol=icmp action=drop \ comment="Drop other ICMP"
Заключение
RAW Firewall — незаменимый инструмент для защиты MikroTik от DDoS-атак и нежелательного трафика с минимальными затратами ресурсов. Ключевые принципы:
- Используйте RAW для stateless-блокировки (IP, порты, флаги)
- Всегда указывайте
in-interfaceдля WAN-правил - Ставьте drop-правила перед правилами детекции
- Не применяйте notrack к трафику, проходящему через NAT
- Мониторьте счётчики через
/ip/firewall/raw/print stats - Используйте RAW как первый рубеж обороны, Filter — как второй
# Просмотр текущих правил RAW (изначально таблица пуста)
/ip/firewall/raw/print
/ip/firewall/address-list
add address=0.0.0.0/8 list=bogons comment="This network"
add address=10.0.0.0/8 list=bogons comment="RFC1918 Private"
add address=100.64.0.0/10 list=bogons comment="RFC6598 CGN"
add address=127.0.0.0/8 list=bogons comment="Loopback"
add address=169.254.0.0/16 list=bogons comment="Link-local"
add address=172.16.0.0/12 list=bogons comment="RFC1918 Private"
add address=192.0.0.0/24 list=bogons comment="IETF Protocol"
add address=192.0.2.0/24 list=bogons comment="TEST-NET-1"
add address=192.168.0.0/16 list=bogons comment="RFC1918 Private"
add address=198.18.0.0/15 list=bogons comment="Benchmark"
add address=198.51.100.0/24 list=bogons comment="TEST-NET-2"
add address=203.0.113.0/24 list=bogons comment="TEST-NET-3"
add address=224.0.0.0/4 list=bogons comment="Multicast"
add address=240.0.0.0/4 list=bogons comment="Reserved"
/ip/firewall/raw
add chain=prerouting in-interface=ether1 src-address-list=bogons \
action=drop comment="Drop bogon sources on WAN"
# Допустим, у нас уже загружены address-list для конкретных стран
# Пример ручного добавления (в реальности используйте скрипт импорта)
/ip/firewall/address-list
add address=1.0.1.0/24 list=geo-block comment="Example blocked range"
/ip/firewall/raw
add chain=prerouting in-interface=ether1 src-address-list=geo-block \
action=drop comment="GeoIP block - drop unwanted countries"
/system/scheduler
add name=update-geoip interval=7d on-event="/system/script/run geoip-update" \
start-date=2025-01-01 start-time=03:00:00 comment="Weekly GeoIP update"
/ip/firewall/raw
# Шаг 1: Добавляем IP в список при превышении лимита SYN
add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \
connection-limit=100,32 action=add-src-to-address-list \
address-list=syn-flood address-list-timeout=1h \
comment="Detect SYN flood - more than 100 concurrent SYN per /32"
# Шаг 2: Блокируем IP из списка syn-flood
add chain=prerouting in-interface=ether1 src-address-list=syn-flood \
action=drop comment="Drop SYN flood sources"
/ip/firewall/raw
# Альтернативный подход: ограничение количества SYN/сек глобально
add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \
limit=500,5:packet action=accept comment="Allow up to 500 SYN/sec"
add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \
action=drop comment="Drop excess SYN packets"
/ip/firewall/raw
# 1. Drop bogon sources на WAN
add chain=prerouting in-interface=ether1 src-address-list=bogons \
action=drop comment="Drop bogon sources"
# 2. GeoIP-блокировка
add chain=prerouting in-interface=ether1 src-address-list=geo-block \
action=drop comment="GeoIP country block"
# 3. Drop источников SYN flood
add chain=prerouting in-interface=ether1 src-address-list=syn-flood \
action=drop comment="Drop SYN flood attackers"
# 4. Определение SYN flood
add chain=prerouting in-interface=ether1 protocol=tcp tcp-flags=syn \
connection-limit=100,32 action=add-src-to-address-list \
address-list=syn-flood address-list-timeout=1h \
comment="Detect SYN flood"
# 5. Drop invalid TCP flags (Christmas tree, NULL scan)
add chain=prerouting in-interface=ether1 protocol=tcp \
tcp-flags=fin,syn,rst,psh,ack,urg action=drop \
comment="Drop Christmas tree packets"
add chain=prerouting in-interface=ether1 protocol=tcp \
tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg action=drop \
comment="Drop NULL scan packets"
# 6. Notrack для доверенного внутреннего трафика (опционально, для производительности)
add chain=prerouting in-interface=bridge1 src-address=192.168.88.0/24 \
dst-address=192.168.88.0/24 action=notrack \
comment="Notrack LAN-to-LAN traffic"
/ip/firewall/raw
# Обнаружение port scan (более 10 портов за 5 секунд)
add chain=prerouting in-interface=ether1 protocol=tcp \
psd=21,3s,3,1 action=add-src-to-address-list \
address-list=port-scanners address-list-timeout=24h \
comment="Detect port scanners"
# Блокировка port scanners
add chain=prerouting in-interface=ether1 src-address-list=port-scanners \
action=drop comment="Drop port scanners"
/ip/firewall/raw/print stats
/ip/firewall/raw/print stats where comment~"SYN"
/ip/firewall/address-list/print where list=syn-flood
/system/resource/print
/tool/torch interface=ether1 src-address=0.0.0.0/0 protocol=tcp
/ip/firewall/connection/print count-only
/ip/firewall/raw
add chain=prerouting in-interface=ether1 src-address-list=bogons \
action=log log-prefix="RAW-BOGON-DROP" log=yes
# Просмотр логов
/log/print where message~"RAW-BOGON"
/ip/firewall/raw
add chain=prerouting src-address=10.0.0.0/24 dst-address=10.0.1.0/24 \
action=notrack comment="Notrack inter-VLAN trusted traffic"
add chain=output dst-address=10.0.0.0/8 action=notrack \
comment="Notrack router-originated to internal"
/ip/firewall/filter
add chain=forward connection-state=untracked action=accept \
comment="Accept untracked (notrack from RAW)"
# НЕПРАВИЛЬНО! connection-state не работает в RAW
/ip/firewall/raw
add chain=prerouting connection-state=!established action=drop
# ОПАСНО! Заблокирует bogon-адреса со ВСЕХ интерфейсов, включая LAN
/ip/firewall/raw
add chain=prerouting src-address-list=bogons action=drop
# НЕЭФФЕКТИВНО! Сначала детекция, потом drop
/ip/firewall/raw
add chain=prerouting protocol=tcp tcp-flags=syn connection-limit=100,32 \
action=add-src-to-address-list address-list=syn-flood address-list-timeout=1h
add chain=prerouting src-address-list=syn-flood action=drop
/ip/firewall/raw
add chain=prerouting src-address-list=syn-flood action=drop
add chain=prerouting protocol=tcp tcp-flags=syn connection-limit=100,32 \
action=add-src-to-address-list address-list=syn-flood address-list-timeout=1h
# НЕПРАВИЛЬНО! Notrack на WAN-трафике сломает masquerade
/ip/firewall/raw
add chain=prerouting in-interface=ether1 action=notrack
# ОПАСНО! 10 SYN в секунду — слишком мало для веб-сервера
/ip/firewall/raw
add chain=prerouting protocol=tcp tcp-flags=syn limit=10,5:packet action=accept
add chain=prerouting protocol=tcp tcp-flags=syn action=drop
# ПЛОХАЯ ПРАКТИКА — ломает Path MTU Discovery
/ip/firewall/raw
add chain=prerouting in-interface=ether1 protocol=icmp action=drop
/ip/firewall/raw
# Разрешаем echo-reply, dest-unreachable, time-exceeded
add chain=prerouting in-interface=ether1 protocol=icmp \
icmp-options=0:0 action=accept comment="Echo reply"
add chain=prerouting in-interface=ether1 protocol=icmp \
icmp-options=3:0-15 action=accept comment="Dest unreachable (PMTUD)"
add chain=prerouting in-interface=ether1 protocol=icmp \
icmp-options=11:0-1 action=accept comment="Time exceeded (traceroute)"
# Ограничиваем echo-request
add chain=prerouting in-interface=ether1 protocol=icmp \
icmp-options=8:0 limit=5,5:packet action=accept comment="Echo request limited"
# Всё остальное ICMP — drop
add chain=prerouting in-interface=ether1 protocol=icmp action=drop \
comment="Drop other ICMP"