Короткий ответ

Any-any — правило, у которого источник, назначение и часто порт не ограничены: accept с 0.0.0.0/0, пустые src/dst в RouterOS, pass in on wan from any to any. Его нельзя «просто удалить» в пятницу без съёма потоков: вы уроните почту, VPN и мониторинг. Сначала инвентаризация: counters, conntrack, логи, матрица. Затем замена на узкие 5-tuple. Firewall остаётся включённым всё время.

Ищите не только WAN inbound. Исходящий any-any с серверов — отдельная дыра, см. egress.

Плейсхолдеры: WAN 203.0.113.10, LAN 10.0.10.0/24, DMZ 10.0.30.0/24, mgmt 10.0.99.0/24.

Симптомы и как отличить

В выгрузке на видном месте:

add chain=forward action=accept comment="temp 2023"

без src/dst/port — это any-any. В nft: ip saddr 0.0.0.0/0 ip daddr 0.0.0.0/0 accept или просто accept без матчей в цепи с policy accept.

ВидРискНе путать с
accept established,related без адресовнорма statefulany-any new
accept iif LAN без портаLAN→anywhere newпочти any
accept WAN tcp 443 к VIPпубликацияузкое, ок в матрице
accept WAN без портакатастрофаэта статья

Скан своего 203.0.113.10 показывает кучу open — следствие, не определение. Определение — текст правила.

Возможные причины

  1. Временный доступ подрядчику, заявку закрыли, правило нет.
  2. Миграция с «роутера из коробки» (accept forward).
  3. «Чтобы VPN заработал» вместо разбора AllowedIPs.
  4. Копипаст с стенда, где policy accept.
  5. Shadow: думали, что нижний drop закрывает, верхний any съедает всё — порядок.
  6. Интерфейсный pass any на LAN в pf «как в мастере», без разделения DMZ/mgmt.

Диагностика

1. Найти кандидатов

sudo nft list ruleset -a | grep -n -iE 'accept|drop|0.0.0.0'

Ищите линии accept без dport/saddr/iifname в input/forward. Established — исключите из травли.

/ip firewall filter print where action=accept

Пустые src-address, dst-address, dst-port, in-interface на new — кандидат. Цепь output шлюза тоже просмотрите.

2. Что реально ходит через правило

Не гадайте. Снимите:

sudo conntrack -L -o extended | awk '{print $1,$3,$4,$5}' | sort | uniq -c | sort -nr | head
/ip firewall connection print without-paging
/ip firewall filter print stats

Включите временный log только на этом правиле (prefix ANYANY), на час рабочего дня. Соберите уникальные dst-port и dst-address. Это черновик новой матрицы.

3. Разделите направления

  • inbound WAN → LAN/DMZ
  • LAN → WAN (пользователи в интернет часто широкие — это не то же, что WAN→LAN)
  • LAN → DMZ
  • DMZ → LAN (должно быть почти пусто)
  • mgmt → rest

WAN→LAN any-any снимают в первую очередь. LAN→WAN «весь интернет» для пользователей — отдельное продуктовое решение, не маскируйте его тем же правилом, что открывает RDP с улицы.

4. Концептуальный периметр

В GUI: правило WAN с source any, dest any, port any, action pass — удалять после списка реально занятых портов. Floating any pass выше интерфейсных — тоже.

Решение

Сценарий A. WAN inbound any-any

  1. Backup: nft list в файл, RouterOS backup+export.
  2. По log/conntrack составьте список нужных публикаций (обычно 443 на VIP, UDP VPN).
  3. Добавьте узкие allow выше any-any.
  4. Проверьте бизнесом.
  5. Disable any-any (не delete) на 24–72 часа.
  6. Если тихо — delete, обновите матрицу портов.

nft-идея (WAN nic ens18):

sudo cp /etc/nftables.conf /root/nftables.conf.bak.anyany
# выше leftover: только 443 на опубликованный VIP и WG
# leftover затем disable: закомментировать accept без матчей
sudo nft -c -f /etc/nftables.conf

RouterOS:

/system backup save name=before-anyany
/ip firewall filter add chain=input action=accept connection-state=established,related place-before=0
/ip firewall filter add chain=input in-interface-list=WAN protocol=udp dst-port=51820 action=accept comment="WG from matrix"
/ip firewall filter add chain=forward in-interface-list=WAN dst-address=10.0.30.10 protocol=tcp dst-port=443 action=accept comment="web DMZ"

Затем disable на any-any. Не action=drop всей цепи без established — убьёте сессии.

Сценарий B. LAN→DMZ any

Замените на списки: 443 к 10.0.30.10, 25 к почтовому, DNS к резолверу. Остальное drop. Пользователи не должны ходить на SMB/RDP серверов «потому что any».

Сценарий C. DMZ→LAN any

Считайте инцидентом. Разрешите только явно нужное (например SQL с 10.0.30.10 на 10.0.10.20:5432 если так задумано — лучше не так, см. DMZ). Остальное запретите.

Сценарий D. Mgmt any

Админы любят any из 10.0.99.0/24. Сузьте до протоколов админки (22, 443, WinBox 8291, гипервизор) и до целевых сетей. Не оставляйте mgmt→WAN any без учёта утечек.

После замены прогоните ревизию и внешний скан своего IP.

Как проверить, что проблема устранена

  1. В filter нет accept без адреса/порта для new в input/forward с WAN.
  2. С LTE: лишние порты на 203.0.113.10 закрыты.
  3. Бизнес-потоки из чеклиста (VPN, сайт, почта, RDP из LAN/VPN) живы.
  4. Counter бывшего any-any после disable = 0 (если правило ещё висит disabled — ок).
  5. Conntrack не показывает новые WAN→LAN 3389/445.

Если не помогло

  • Упал «неизвестный» интеграционный хост — верните disable→enable любого leftover только на этот 5-tuple, не весь any. Допишите в матрицу.
  • Сломался IPv6: отдельный any в ip6.
  • NAT hide: смотрите dstnat плюс forward, не только filter.
  • Скрипт каждую ночь возвращает any — убейте источник.
  • Пользователи ждут «весь интернет с серверов» — это уже egress policy, не откат any inbound.

Профилактика

  • Политика: любое 0.0.0.0/0 на new с WAN — запрещено без CISO/владельца периметра.
  • Срок жизни temp-правил в комментарии, календарь снятия.
  • CI/выгрузка: grep any-any в export.
  • Разделение цепей LAN-in / WAN-in / DMZ-in, чтобы any не «прилип» не туда.
  • Квартальный отчёт counters топ-правил: одно правило 90% трафика new — подозрительно.

FAQ

Established any — это any-any?

Нет. Это state. Травите new/invalid без адресов.

Пользователям в интернет тоже any?

Исход 10.0.10.0/24 → WAN часто широк по портам. Это не WAN inbound any. Всё равно лучше не 25/445 исходящие с клиентского VLAN без нужды.

Можно ли заменить any-any на GeoIP allow своей страны?

Слабая замена, не эквивалент матрицы. См. GeoIP. Сначала 5-tuple.

Disable vs drop на leftover

Disable безопаснее на переход: видно в конфиге. После окна — delete, чтобы не включили обратно.

Что писать в заявке на снятие?

Снимок правила, топ dst из log, список новых allow, план отката (enable leftover), кто тестировал VPN и 443.