· 14 мин чтения

Windows Firewall через PowerShell: правила, профили и централизованное управление

Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет у меня накопилось правило: любую задачу по firewall, которую нужно выполнить больше чем на одной машине, я делаю через PowerShell. Щелчки мышкой в wf.msc уместны один раз на тестовом стенде — дальше только командлеты NetFirewall и групповые политики. Особенно это важно, когда речь про серверный парк на Dell с Xeon Platinum 8280 в дата-центре МТС: там любая ошибка руками умножается на 50 хостов.

Почему встроенный firewall нельзя выключать

Частая ошибка младших админов — «выключить firewall, чтобы не мешал». На рабочей станции в домене это оставляет открытыми SMB, RPC, RDP и десяток служебных портов. В худшем случае — живой шифровальщик пройдёт между машинами за минуты. Я всегда оставляю Windows Defender Firewall включённым и точечно разрешаю нужные правила.

Базовые командлеты NetFirewall

Семейство cmdlet-ов NetSecurity включает пару десятков команд. Запомните восемь — этого хватит на 95% задач:

КомандаНазначение
Get-NetFirewallProfileПоказать состояние профилей Domain/Private/Public
Set-NetFirewallProfileИзменить параметры профиля
Get-NetFirewallRuleСписок правил
New-NetFirewallRuleСоздать правило
Set-NetFirewallRuleИзменить параметры правила
Remove-NetFirewallRuleУдалить правило
Enable-NetFirewallRule / Disable-NetFirewallRuleВключить / отключить
Get-NetFirewallPortFilter / AddressFilterПолучить детали фильтров портов и адресов

Проверка состояния и профилей

Get-NetFirewallProfile | Format-Table Name, Enabled, DefaultInboundAction, DefaultOutboundAction

# Правильное состояние для рабочей станции в домене:
# Domain   Enabled=True   Inbound=Block  Outbound=Allow
# Private  Enabled=True   Inbound=Block  Outbound=Allow
# Public   Enabled=True   Inbound=Block  Outbound=Allow

Если видите Enabled=False — кто-то выключил firewall. Включайте сразу:

Set-NetFirewallProfile -All -Enabled True

Создание входящих правил

Рабочий пример — открыть RDP только из офисной подсети:

New-NetFirewallRule -DisplayName "RDP from office LAN" `
  -Direction Inbound `
  -Action Allow `
  -Protocol TCP `
  -LocalPort 3389 `
  -RemoteAddress 192.168.10.0/24 `
  -Profile Domain,Private `
  -Group "IT-Admins"

Параметр Group удобен — по нему потом массово править, выключать и удалять связанные правила. Я всегда объединяю логически связанные правила в группы вида «App-Exchange», «App-1C», «Management-RDP».

Массовая настройка на парке серверов

Если нужно развернуть правила на десятке хостов, комбинируем Invoke-Command с -Session. Это даёт один сеанс WinRM на машину, а не переоткрытие соединения для каждой команды:

$servers  = 'SQL01','SQL02','APP01','APP02','APP03'
$sessions = New-PSSession -ComputerName $servers

Invoke-Command -Session $sessions -ScriptBlock {
  New-NetFirewallRule -DisplayName "Monitoring from Zabbix" `
    -Direction Inbound -Protocol TCP -LocalPort 10050 `
    -RemoteAddress 10.0.5.20 -Action Allow -Group "Monitoring"
}

Remove-PSSession $sessions

Централизованное управление через GPO

На практике в доменной среде я всегда выношу правила firewall в групповые политики, а локальную правку запрещаю. Алгоритм:

  1. Создаём GPO «FW-Workstations-Baseline».
  2. Computer Configuration → Policies → Windows Settings → Security Settings → Windows Defender Firewall with Advanced Security.
  3. В свойствах профиля: Firewall state = On, Inbound = Block, Outbound = Allow.
  4. В Settings → Apply local firewall rules = No — отключаем локальные правила, чтобы пользователь не открывал себе что попало.
  5. В Inbound Rules добавляем нужные правила для сценариев Helpdesk RDP, мониторинга и резервного копирования.

Политика применяется при gpupdate или через 90 минут автоматически. Я всегда проверяю результат на тестовой машине через gpresult /h report.html перед раскаткой на продакшн.

Логирование и расследование блокировок

По умолчанию firewall не пишет лог — это надо включать явно:

Set-NetFirewallProfile -Name Domain,Private,Public `
  -LogFileName '%SystemRoot%\System32\LogFiles\Firewall\pfirewall.log' `
  -LogMaxSizeKilobytes 32767 `
  -LogAllowed True `
  -LogBlocked True

Далее — анализ лога удобнее через PowerShell:

Get-Content "$env:SystemRoot\System32\LogFiles\Firewall\pfirewall.log" |
  Where-Object { $_ -match 'DROP' } |
  Select-Object -Last 50

Мини-кейс: диагностика недоступности 1С-сервера

У одного из наших клиентов — торговая компания из Химок, 46 рабочих мест — после обновления Windows Server 2022 пользователи перестали подключаться к 1С. Я зашёл по WinRM на сервер через 40G канал в дата-центре МТС, запустил:

Get-NetFirewallRule -DisplayGroup "1C" |
  Select DisplayName, Enabled, Action, Direction

Выяснилось: после обновления правило для порта 1541 было автоматически переведено в Disabled. Включаем обратно одной командой Enable-NetFirewallRule -DisplayName "1C Server 1541", и через 15 секунд вся бухгалтерия снова работает. Весь инцидент занял 7 минут от звонка клиента до закрытия заявки. Такие кейсы у нас на практике — норма жизни.

Типичные ошибки при работе с firewall

Наведу порядок в Windows Firewall на вашем парке

Аудит действующих правил, перенос в GPO, настройка логирования и стандартизация baseline для серверов и рабочих мест. Работа удалённо и на площадке клиента, Москва и область.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы

Чем PowerShell лучше netsh advfirewall?
Командлеты NetFirewall возвращают объекты и работают через WinRM. Netsh остаётся для скриптов совместимости, но у него плоский вывод и меньше возможностей для автоматизации.
Как быстро открыть порт для конкретного IP?
New-NetFirewallRule с параметрами -LocalPort, -Protocol и -RemoteAddress. Правило применяется мгновенно, удаление через Remove-NetFirewallRule.
Можно ли задать правила через групповую политику?
Да, и я всегда так и делаю на доменной среде. Локальные правила при этом запрещаю — так парк остаётся однородным.
Куда писать логи firewall?
В стандартный %SystemRoot%\System32\LogFiles\Firewall\pfirewall.log, максимум 32 МБ. Пишите и Allowed, и Blocked — это сильно помогает при расследованиях.
Как массово отключить firewall только на серверах в DMZ?
Выделенная OU + GPO только на неё. Полное отключение не рекомендую никому, даже в DMZ — лучше точечные разрешения.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.