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 в групповые политики, а локальную правку запрещаю. Алгоритм:
- Создаём GPO «FW-Workstations-Baseline».
- Computer Configuration → Policies → Windows Settings → Security Settings → Windows Defender Firewall with Advanced Security.
- В свойствах профиля: Firewall state = On, Inbound = Block, Outbound = Allow.
- В Settings → Apply local firewall rules = No — отключаем локальные правила, чтобы пользователь не открывал себе что попало.
- В 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
- Правило Allow All на всё. Никогда не создавайте правило Inbound Any-Any-Allow «чтобы работало» — это отключение firewall де-факто.
- Забыть про профиль. Правило без параметра Profile применяется во всех профилях, включая Public. На ноутбуке это дыра.
- Локальные правила вместо GPO. На 30+ машинах ручная настройка превращается в хаос, правила разъезжаются за полгода.
- Открытый SMB из интернета. Порты 139/445 никогда не должны быть доступны снаружи — это прямой вектор для шифровальщиков.
- Отсутствие логирования. Без лога расследование блокировки превращается в гадание на кофейной гуще.
Наведу порядок в 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 — лучше точечные разрешения.