Короткий ответ
Матрица открытых портов — таблица, по которой можно проверить периметр: белый IP, proto, порт, куда DNAT (если есть), сервис, зона (WAN/LAN/DMZ/mgmt), кто владелец, заявка, обоснование, срок. Сверяйте с ss/nft/nat print и с nmap своих адресов. Нет строки — порт нелегален, закрывайте. Не держите матрицу в личном чате. Не отключайте firewall ради «честного listen».
WAN 203.0.113.10, LAN 10.0.10.0/24, DMZ 10.0.30.0/24, mgmt 10.0.99.0/24.
Симптомы и как отличить
Аудитор спрашивает, зачем 8291. Ответ «наверное WinBox». NAT есть, в Confluence нет. Три белых, матрица на один. Внутренние порты DC смешаны с WAN в одной простыне без колонки zone.
Отличие от ревизии правил: ревизия — каждое правило filter. Матрица — экспозиция сервисов (listen+allow), меньше строк, понятна бизнесу.
Возможные причины
- Документ завели при внедрении и бросили.
- Облако/второй шлюз не внесли.
- UPnP плодил порты.
- IPv6 не включили в таблицу.
- Путают «порт слушает на сервере» и «порт открыт с улицы».
Диагностика
Соберите факты, не мнения.
1. Белые IP организации
Договор провайдера, A-записи, ip addr на edge, облачные EIP. Только они — цели скана.
2. Слушатели и NAT
sudo ss -lntup
sudo nft list ruleset/ip address print
/ip firewall nat print where chain=dstnat
/ip service print3. Скан с улицы
nmap -Pn -sS -p 21,22,25,53,80,110,143,443,445,993,995,3389,51820,8291 203.0.113.10Полный -p- своего одного IP — по окну. Результаты приложите к матрице датой.
4. Внутренние зоны
Отдельные вкладки: WAN inbound, LAN services (не все 65k, а то, что разрешено меж VLAN), DMZ, mgmt. Иначе таблица врёт, что 445 «открыт» как периметр.
Решение
Шаблон строки:
| Поле | Пример |
|---|---|
| asset_ip | 203.0.113.10 |
| proto/port | tcp/443 |
| direction | WAN inbound |
| dest | 10.0.30.10 |
| service | nginx contoso.example |
| owner | Иванов, IT-web |
| ticket | INC-441 |
| justification | публичный сайт |
| expires | бессрочно / 2026-12-01 |
| last_verified | 2026-09-08 LTE nmap |
Сценарий A. Первичное заполнение
- Скан WAN → строки.
- NAT → сопоставить dest.
- Пустые owner — назначить за 5 рабочих дней или закрыть порт.
- Внутренние allow LAN→DMZ — вторая таблица.
- Egress серверов — третья, см. egress.
Сценарий B. Расхождение скан vs таблица
Лишний open — закрыть. Лишняя строка без open — поправить документ (или скан не с улицы).
Сценарий C. Хранение
Git/wiki с контролем доступа, не пароли в той же таблице. NAT secrets не нужны. Review PR на изменение порта = тот же процесс, что change FW.
Сценарий D. Автосверка
Скрипт: nmap XML своего IP vs CSV. Алерт на diff. Не авто-закрытие портов скриптом без человека.
Сценарий E. Облако
Security group = те же колонки. Скрин/export SG в ту же матрицу. 0.0.0.0/0:3389 — красный.
Концепция pf: GUI aliases не заменяют матрицу. Выгрузка правил + таблица владельцев.
Как вести матрицу так, чтобы скан её не стыдил
Каждое изменение DNAT/allow WAN начинается с черновика строки матрицы в том же тикете, что и diff nft/RouterOS. После выкладки — LTE nmap своих IP, поле last_verified. Раз в квартал полный проход: реестр белых из договора, короткий TCP-профиль, UDP 53/123/161/500/4500/51820, IPv6 AAAA.
Колонка justification для 3389/445 с WAN не может быть «удобно». Для 443 — FQDN, backend 10.0.30.10, сертификат. Owner — ФИО, не «IT». Срок expires на temp. Файлы nmap XML рядом с ограниченным доступом, не в публичном wiki. Автосверка CSV vs nmap — алерт, закрытие порта человеком. Облачные SG в той же таблице: 0.0.0.0/0 на admin-портах = красный, как dstnat на MikroTik.
Как проверить, что проблема устранена
- Для каждого open на своём WAN есть строка.
- Для каждой строки WAN есть подтверждающий скан или осознанный filtered.
- Owner не «IT общий».
- Дата last_verified ≤ 90 дней.
- Изменение порта проходит через матрицу до или вместе с правилом, не после года.
- IPv6 покрыт или явно «IPv6 нет».
Повтор LTE-скана = отчёт в тикете ревизии.
Не смешивайте в одной строке WAN inbound и east-west: 445 на DC для users — не «открытый порт периметра». Цветовая/поле zone обязательно. Для публикаций укажите SNI/FQDN, чтобы 443 сайта не путали с 443 GUI. Раз в изменение DNS A-записи сверьте, не появился ли новый белый без строки. Матрица без IPv6 при живом AAAA — дыра в процессе, добавьте явную пометку «IPv6 не используется» только после ip -6 addr на edge = пусто.
Версия матрицы: дата, автор, hash nmap. При споре «порт нужен» требуют строку и тикет, не голосование в чате. Пустая justification на WAN admin-порту автоматически эскалируется как инцидент экспозиции, не как «допишем потом».
Колонка last_verified заполняется только после LTE-скана или документированного filtered, не после «глянул WinBox». Если сканер недоступен, дата не рисуется задним числом. Это единственный способ не превратить матрицу в художественный текст.
Если не помогло
- CDN: скан origin vs скан hostname — две строки.
- Port knocking/скрытые — всё равно строка.
- UDP не смотрели — добавьте 53/500/4500/51820.
- Команда боится Excel — используйте любой табличный git.
- Владелец уволился — переназначить, не удалять строку молча.
Профилактика
- Change template: обязательные поля матрицы.
- Квартальный скан периметра.
- UPnP off.
- Новые белые IP сразу в реестр.
- Связь с CMDB серверов.
FAQ
Нужно ли документировать исходящие 443 пользователей?
Как политика («разрешён интернет 80/443»), не каждый dst. Серверный egress — да, списком.
Порт filtered — в матрицу?
Если ожидаемый deny — можно сводной политикой «все прочие WAN drop», не 65535 строк.
Кто утверждает обоснование?
Владелец сервиса + владелец периметра. Одному админу «так надо» мало для 3389.
Хранить nmap XML?
Да, рядом с датой, доступ ограничен.
Матрица vs диаграмма сети
Оба. Диаграмма без портов не проходит аудит экспозиции.