Управление брандмауэром Windows через PowerShell: полное руководство администратора

Брандмауэр Windows (Windows Defender Firewall) — это первое, что встаёт на пути атаки на любой сервер или рабочую станцию в сети. Графический интерфейс wf.msc вполне годится, если нужно разово щёлкнуть пару правил. Но когда у тебя двадцать серверов, плановое развёртывание или firewall-конфиг как часть CI/CD — PowerShell безальтернативен.
Разберём весь рабочий арсенал модуля NetSecurity: включение и отключение профилей, создание правил с фильтрацией по приложению, порту, IP-адресу и сетевому интерфейсу. Все примеры я проверял вживую на Windows Server 2019/2022 и Windows 10/11.
Модуль NetSecurity: что входит в состав
Начиная с Windows 8 и Windows Server 2012 управление брандмауэром через PowerShell идёт через встроенный модуль NetSecurity. Ничего дополнительно ставить не нужно — он уже есть на всех актуальных версиях Windows.
Сначала убедимся, что модуль доступен, и посмотрим, что в нём есть:
# Проверка наличия модуля
Get-Module -ListAvailable -Name NetSecurity
# Список всех командлетов модуля
Get-Command -Module NetSecurity
Командлеты, с которыми будем работать чаще всего:
Get-NetFirewallProfile— смотрим и меняем профили (Domain, Private, Public)Get-NetFirewallRule— просматриваем существующие правилаNew-NetFirewallRule— создаём новое правилоSet-NetFirewallRule— правим существующее правилоRemove-NetFirewallRule— удаляем правилоEnable-NetFirewallRule/Disable-NetFirewallRule— включаем или выключаем правило
Профили брандмауэра: Domain, Private, Public
Windows Firewall работает с тремя профилями. Какой из них применяется — зависит от того, в какой сети сейчас находится машина:
- Domain — компьютер в домене Active Directory
- Private — домашняя или доверенная сеть
- Public — незнакомая или публичная сеть, правила здесь самые жёсткие
Смотрим текущее состояние всех трёх профилей:
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction
Включаем или отключаем нужный профиль:
# Отключить публичный профиль (например, на изолированном сервере)
Set-NetFirewallProfile -Profile Public -Enabled False
# Включить все профили сразу
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True
# Задать политику по умолчанию: блокировать входящие, разрешать исходящие
Set-NetFirewallProfile -Profile Domain,Private,Public `
-DefaultInboundAction Block `
-DefaultOutboundAction Allow
Просмотр и фильтрация существующих правил
На обычном Windows-сервере предустановлено несколько сотен правил. Вот как с ними нормально работать:
# Все включённые входящие правила
Get-NetFirewallRule -Direction Inbound -Enabled True | Select-Object DisplayName, Action, Profile
# Только правила с действием Block
Get-NetFirewallRule -Action Block | Select-Object DisplayName, Direction, Enabled
# Поиск по части имени
Get-NetFirewallRule -DisplayName "*RDP*" | Select-Object DisplayName, Enabled, Action
# Правила для конкретного профиля
Get-NetFirewallRule -Profile Domain | Where-Object {$_.Enabled -eq $true} | Select-Object DisplayName
Информация о портах в правило не входит напрямую — её нужно запрашивать отдельным объектом:
# Посмотреть порты и протоколы для правила по его имени
Get-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)" |
Get-NetFirewallPortFilter | Select-Object Protocol, LocalPort, RemotePort
Создание правил: New-NetFirewallRule
Создание правил — пожалуй, самая частая задача. Разберём на реальных сценариях из практики.
Разрешить входящий трафик на конкретный порт
# Открыть порт 8080 для входящих TCP-соединений
New-NetFirewallRule `
-DisplayName "Allow HTTP Alt 8080" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 8080 `
-Action Allow `
-Profile Domain,Private `
-Enabled True
Разрешить трафик от конкретного IP-адреса или подсети
# Разрешить SSH только с адреса управляющей рабочей станции
New-NetFirewallRule `
-DisplayName "Allow SSH from Admin Workstation" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 22 `
-RemoteAddress 192.168.1.10 `
-Action Allow `
-Profile Domain `
-Enabled True
# Разрешить трафик из всей подсети 10.0.0.0/24
New-NetFirewallRule `
-DisplayName "Allow Internal Network" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 443 `
-RemoteAddress 10.0.0.0/24 `
-Action Allow `
-Enabled True
Создать правило для конкретного приложения
# Разрешить исходящий трафик только для конкретного exe
New-NetFirewallRule `
-DisplayName "Allow Chrome Outbound" `
-Direction Outbound `
-Program "C:\Program Files\Google\Chrome\Application\chrome.exe" `
-Action Allow `
-Profile Domain,Private `
-Enabled True
Блокировать диапазон портов
# Заблокировать входящие соединения на диапазон портов
New-NetFirewallRule `
-DisplayName "Block Ports 137-139 Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 137-139 `
-Action Block `
-Enabled True
-DisplayName и используйте параметр -Description для документирования назначения правила. Это сильно упрощает аудит через 6 месяцев.Изменение и удаление правил
Поменять параметры уже существующего правила — это Set-NetFirewallRule:
# Отключить правило по имени
Disable-NetFirewallRule -DisplayName "Allow HTTP Alt 8080"
# Изменить действие правила с Allow на Block
Set-NetFirewallRule -DisplayName "Allow HTTP Alt 8080" -Action Block
# Изменить порт в существующем правиле
Set-NetFirewallRule -DisplayName "Allow HTTP Alt 8080" -LocalPort 8081
# Удалить правило
Remove-NetFirewallRule -DisplayName "Allow HTTP Alt 8080"
# Удалить все отключённые правила (осторожно!)
Get-NetFirewallRule -Enabled False | Remove-NetFirewallRule
Remove-NetFirewallRule не запрашивает подтверждения. Перед массовым удалением используйте параметр -WhatIf для предварительного просмотра.Экспорт и импорт правил брандмауэра
Когда нужно раскатить одинаковые правила на несколько серверов, удобнее всего экспортировать конфигурацию в XML и импортировать её на целевых машинах. Руками это делать незачем.
# Экспорт всей конфигурации брандмауэра в XML
netsh advfirewall export "C:\Backup\firewall-rules.xml"
# Импорт конфигурации (заменяет текущие правила!)
netsh advfirewall import "C:\Backup\firewall-rules.xml"
Если XML кажется слишком жёстким форматом — можно экспортировать правила в CSV через PowerShell:
# Экспорт всех правил в CSV для анализа
Get-NetFirewallRule | Select-Object `
DisplayName, Direction, Action, Enabled, Profile, Description |
Export-Csv -Path "C:\Backup\firewall-rules.csv" -NoTypeInformation -Encoding UTF8
# Экспорт только включённых правил
Get-NetFirewallRule -Enabled True | Select-Object `
DisplayName, Direction, Action, Profile |
Export-Csv -Path "C:\Backup\firewall-active.csv" -NoTypeInformation -Encoding UTF8
Настройка журналирования брандмауэра
По умолчанию Windows Firewall молча блокирует или пропускает пакеты, не оставляя следов. Для нормальной диагностики включаем журналирование:
# Включить журналирование для профиля Domain
Set-NetFirewallProfile -Profile Domain `
-LogFileName "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" `
-LogMaxSizeKilobytes 32767 `
-LogBlocked True `
-LogAllowed True
# Проверить настройки журналирования
Get-NetFirewallProfile -Profile Domain | Select-Object LogFileName, LogBlocked, LogAllowed, LogMaxSizeKilobytes
Последние записи лога можно читать прямо из PowerShell, не открывая файл руками:
# Прочитать последние 50 строк лога брандмауэра
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" -Tail 50
# Найти все заблокированные соединения на порт 3389
Select-String -Path "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" `
-Pattern "DROP.*3389"
LogMaxSizeKilobytes до 65536 (64 МБ) или настройте ротацию через Task Scheduler.Практический сценарий: быстрая блокировка атакующего IP
Один из самых частых запросов, которые мы получаем — как быстро заблокировать IP, с которого ломятся брутфорсом. Вот готовый скрипт, который мы используем сами:
# Скрипт блокировки IP-адреса
param(
[Parameter(Mandatory=$true)]
[string]$IPAddress,
[string]$Reason = "Blocked by admin"
)
$ruleName = "BLOCK_$($IPAddress -replace '\.','_')_$(Get-Date -Format 'yyyyMMdd')"
# Проверить, не заблокирован ли уже
$existing = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
if ($existing) {
Write-Host "IP $IPAddress уже заблокирован: $ruleName" -ForegroundColor Yellow
exit
}
New-NetFirewallRule `
-DisplayName $ruleName `
-Direction Inbound `
-RemoteAddress $IPAddress `
-Action Block `
-Enabled True `
-Description "Blocked: $Reason. Date: $(Get-Date)"
Write-Host "IP $IPAddress заблокирован. Правило: $ruleName" -ForegroundColor Green
# Запись в лог
Add-Content -Path "C:\Logs\blocked-ips.log" `
-Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | BLOCKED | $IPAddress | $Reason"
Как использовать скрипт:
.\Block-IP.ps1 -IPAddress "185.220.101.45" -Reason "SSH brute force"
Массовое развёртывание правил через GPO и PowerShell
В доменной среде firewall-правила логичнее распространять через GPO. Но если GPO не вариант, а правила нужны на нескольких серверах прямо сейчас — PowerShell Remoting решает задачу за минуты:
# Список серверов
$servers = @("SRV-WEB01", "SRV-WEB02", "SRV-APP01")
# Блок кода, который выполняем на каждом сервере
$scriptBlock = {
# Разрешить HTTPS
New-NetFirewallRule -DisplayName "Allow HTTPS Inbound" `
-Direction Inbound -Protocol TCP -LocalPort 443 `
-Action Allow -Enabled True -ErrorAction SilentlyContinue
# Разрешить мониторинг (ICMP)
New-NetFirewallRule -DisplayName "Allow ICMPv4 Echo" `
-Direction Inbound -Protocol ICMPv4 `
-IcmpType 8 -Action Allow -Enabled True `
-ErrorAction SilentlyContinue
Write-Output "$env:COMPUTERNAME: правила применены"
}
# Выполнить на всех серверах
Invoke-Command -ComputerName $servers -ScriptBlock $scriptBlock
-ErrorAction SilentlyContinue с последующей проверкой через $Error, чтобы не прерывать выполнение при уже существующих правилах.Аудит конфигурации: проверка безопасности брандмауэра
Регулярный аудит правил — это не паранойя, а привычка. Особенно интересны правила с Action Allow и RemoteAddress Any на чувствительных портах — именно они чаще всего оказываются незакрытыми дырами:
# Найти все разрешающие правила без ограничения по IP (потенциально опасные)
Get-NetFirewallRule -Direction Inbound -Action Allow -Enabled True |
ForEach-Object {
$portFilter = $_ | Get-NetFirewallPortFilter
$addrFilter = $_ | Get-NetFirewallAddressFilter
[PSCustomObject]@{
Name = $_.DisplayName
LocalPort = $portFilter.LocalPort
RemoteAddr = $addrFilter.RemoteAddress
Profile = $_.Profile
}
} |
Where-Object { $_.RemoteAddr -eq "Any" -and $_.LocalPort -ne "Any" } |
Sort-Object LocalPort |
Format-Table -AutoSize
Скрипт покажет все правила, открытые для любого источника. Именно с них начинаем проверку.
Итоги: PowerShell vs GUI для управления брандмауэром
Если честно, после того как начинаешь управлять firewall через PowerShell, возвращаться в графический интерфейс не хочется. Вот почему:
- Автоматизация — одни и те же правила за секунды летят на сотни машин, без ручного тыканья мышью
- Аудит — скрипты сами проверяют конфигурацию по расписанию и присылают отчёты
- Воспроизводимость — правила живут в коде, лежат в Git, деплоятся через CI/CD
- Скорость — в консоли это занимает секунды, в GUI — минуты, особенно когда правил много
- Интеграция — легко цепляется к Event Log, SIEM, алертам и любой другой автоматике
Командлеты модуля NetSecurity, которые мы разобрали, закрывают процентов 95 повседневных задач администратора. Для более хитрых сценариев — динамической блокировки по событиям в журнале или работы с внешними IP-блэклистами — их легко расширить до полноценных скриптов мониторинга.
Официальная документация: Microsoft Learn — Windows Server, Microsoft Learn — PowerShell
Часто задаваемые вопросы
Что такое Управление брандмауэром Windows через PowerShell: полное руководство администратора?
Управление брандмауэром Windows через PowerShell: полное руководство администратора — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.
Как правильно настроить Управление брандмауэром Windows через PowerShell: полное руководство администратора?
Для корректной настройки Управление брандмауэром Windows через PowerShell: полное руководство администратора необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.
Какие типичные ошибки возникают при работе с Управление брандмауэром Windows через PowerShell: полное руководство администратора?
Наиболее частые ошибки при работе с Управление брандмауэром Windows через PowerShell: полное руководство администратора: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.
ООО «АйТи Фреш» возьмёт это на себя
Настройка брандмауэра, групповых политик, мониторинга и безопасности Windows Server — наша ежедневная работа. Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах.
Комментарии