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

Лишний порт — это не «nmap нашёл что-то интересное», а listen плюс разрешающее правило, которого нет в матрице «порт — сервис — владелец — обоснование». Снимите факт с своего WAN 203.0.113.10 с хоста вне офиса (LTE, не Wi‑Fi LAN 10.0.10.0/24). Сверьте с матрицей. Закройте на периметре и на хосте. Не делайте nft flush ruleset, не ставьте policy accept «на пять минут» и не отключайте firewall.

Сканируйте только адреса, которые организация явно считает своими. Чужие диапазоны, «соседний офис», клиент провайдера — не ваша цель.

Типичный периметр: Linux с nftables (Ubuntu 22.04/24.04) как шлюз или хост, MikroTik RouterOS 7 на edge, stateful firewall (логика pfSense/OPNsense: first-match, интерфейс WAN/LAN/DMZ). Команды ниже — nft и RouterOS; GUI периметра читайте как «правило WAN, источник any, порт X».

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

С улицы (не из 10.0.10.0/24 и не из VPN) на 203.0.113.10 отвечают порты, которых нет в матрице: 21, 23, 80 без сайта, 445, 3389, 8291, 161, 5060. С LAN всё «работает», поэтому годами никто не смотрит WAN.

Что видитеЭто не «лишний порт периметра»Куда
Порт open только из LANнормальный listen на внутреннем NICматрица LAN, не WAN
Connection refused с улицыничего не слушает, фильтр может быть acceptуберите listen или поставьте drop
Timeout / filtereddrop/reject без RST, порт может быть закрытвсё равно сверьте матрицу
Open 443 и это ваш reverse proxyожидаемо, если есть обоснованиедокументировать порты
Open 3389/445проброс, не «случайный listen»port forwarding

Отличите от any-any: там политика дырявая целиком. Здесь конкретные лишние listener’ы при в целом живом фильтре.

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

От частых к редким:

  1. DNAT/port-forward «на карантин» забыли снять: WAN:3389 → хост в 10.0.10.0/24.
  2. Сервис слушает 0.0.0.0, у узла есть белый IP на NIC, хостовый фильтр не режет WAN.
  3. RouterOS /ip service winbox/www/ssh без address= и без drop на input с WAN.
  4. UPnP или «помощник» пробросил порт сам — отдельно UPnP.
  5. IPv6 AAAA на том же узле открыт, IPv4 уже закрыли.
  6. Второй WAN, старый белый, Cloudflare DNS указывает не туда — сканируете не тот IP из матрицы.

Диагностика

Работайте с заявки: дата, с какого внешнего IP сканируете, список своих белых. Backup конфига до правок.

1. Скан только своего WAN

С LTE или с VPS, который организация контролирует:

# только свой адрес из матрицы, не чужие сети
nmap -Pn -sS -p 21,22,23,25,53,80,110,139,143,443,445,993,995,1723,3389,5060,8291,161 \
  203.0.113.10
ss -lntup

2. Что реально слушает на шлюзе Ubuntu

sudo ss -lntup
sudo nft list ruleset > /root/nft-$(date +%F).nft
ip -4 addr show
ip -6 addr show

Ищите 0.0.0.0:22, :8291, :3389, :445. Сопоставьте с iifname в nft: accept на ens18 (WAN) vs только ens19 (LAN).

3. RouterOS 7

/ip address print
/ip service print
/ip firewall filter print stats where chain=input
/ip firewall nat print where chain=dstnat
/ip upnp print

dst-nat на 3389/445/22 с in-interface-list=WAN — это и есть лишний порт, даже если на самом MikroTik сервис выключен.

4. Хосты за NAT

Проброс прячет listener в LAN. Матрица должна содержать DNAT как отдельную строку. Без этого ревизия врёт.

На периметре pfSense/OPNsense концептуально: WAN-правила first-match, затем default deny. Открытый порт = явное pass на WAN или NAT + pass. Не выключайте пакетный фильтр, чтобы «увидеть, слушает ли демон» — смотрите ss на хосте и counters на правиле.

Решение

Сценарий A. Лишний DNAT на MikroTik

С консоли/LAN, не с единственной сессии WinBox с WAN:

/system backup save name=before-close-ports
/export file=before-close-ports
/ip firewall nat print where chain=dstnat

Удалите (или disable на час с таймером заявки) правило WAN→RDP/SMB/WinBox. Оставьте точечный UDP VPN, если он в матрице.

Сценарий B. nftables на Ubuntu-шлюзе

Не nft flush ruleset. Добавьте drop на WAN для порта, которого нет в матрице, ниже established/related:

sudo cp /etc/nftables.conf /root/nftables.conf.bak.$(date +%F)
# пример: WAN nic ens18, запрет 3389 с улицы; SSH только из mgmt
sudo nft add rule inet filter input iifname "ens18" tcp dport 3389 counter drop
sudo nft list ruleset > /etc/nftables.conf
sudo nft -c -f /etc/nftables.conf

Политика input должна остаться drop для нового с WAN, кроме явно разрешённого. Проверка синтаксиса -c до systemctl reload nftables.

Сценарий C. Хост с белым IP

Уберите белый с сервера приложений или режьте на хосте:

sudo ss -lntup | awk 'NR==1 || /:22|:3389|:445|:8291/'
sudo nft list ruleset

SSH с WAN 203.0.113.10 — только если матрица это разрешает (обычно нет). Норма: SSH с 10.0.99.0/24.

Сценарий D. Службы RouterOS на input

/ip service set telnet disabled=yes
/ip service set ftp disabled=yes
/ip service set www disabled=yes
/ip service set www-ssl disabled=yes
/ip service set api disabled=yes
/ip service set winbox address=10.0.99.0/24,10.0.10.0/24
/ip service set ssh address=10.0.99.0/24

Плюс filter input drop с WAN на 8291/22/80/443. Address-list не заменяет filter, если пакет всё же доходит.

Сценарий E. IPv6

Повторите скан по AAAA своего узла. Закройте те же порты в ip6/inet table, не только ip.

После закрытия обновите матрицу: статус «закрыт», дата, кто подтвердил скан с LTE. Иначе через месяц порт откроют снова «как было».

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

  1. С LTE повторный скан своего 203.0.113.10: в матрице только ожидаемые (обычно 443 и VPN UDP).
  2. С LAN 10.0.10.0/24 нужные сервисы живы.
  3. С mgmt 10.0.99.0/24 админка жива.
  4. Counters на новых drop растут при скане, на allow VPN — при рукопожатии.
nmap -Pn -p 22,80,443,445,3389,8291 203.0.113.10

22/445/3389/8291 — не open. 443 — только если сайт/VPN-TCP в матрице.

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

  • Закрыли IPv4, AAAA открыт — скан по IPv6.
  • CDN/DNS указывает на другой белый — сверьте A-запись с договором.
  • Хост в DMZ 10.0.30.0/24 с публичным IP мимо шлюза — фильтруйте на самом хосте.
  • Сканер в той же L2, что WAN — вы не «с улицы». Возьмите LTE.
  • open на 443 из‑за панели — это админка с WAN, не «сайт».

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

  • Матрица портов с владельцем, квартальный внешний периметр.
  • Запрет DNAT на 3389/445/22 в политике, исключения только с заявкой и датой снятия.
  • Мониторинг: алерт, если ss/nmap своего WAN расходится с матрицей.
  • Отключить UPnP на офисном маршрутизаторе.
  • Не держать белые IP на серверах приложений без отдельного фильтра.

FAQ

Можно ли оставить порт «пока никто не стучится»?

Нет. Сканеры стучатся всегда. Отсутствие логов = не включено журналирование, не «тишина».

nmap показывает filtered — это уже закрыто?

Часто да (drop). Для матрицы filtered на лишнем порте приемлемо. open — нет.

Нужно ли закрывать ICMP?

Отдельное решение. Echo с WAN можно ограничить rate; не путайте с TCP listen. Не отключайте firewall ради ping.

Скан с рабочей станции в LAN показывает open 445 — это инцидент периметра?

Нет, это LAN. Периметр проверяют с улицы. 445 на WAN — уже инцидент.

Кто владелец порта, которого «все используют»?

Пока нет ФИО в матрице, порт не легитимен. Назначьте владельца или закройте.