Windows Server 23 марта 2026 10 мин чтения ...
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

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

windows-firewall-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

Командлеты, с которыми будем работать чаще всего:

Профили брандмауэра: Domain, Private, Public

Windows Firewall работает с тремя профилями. Какой из них применяется — зависит от того, в какой сети сейчас находится машина:

Смотрим текущее состояние всех трёх профилей:

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
Важно: при изменении DefaultInboundAction на Block все входящие соединения, для которых нет явного разрешающего правила, будут заблокированы. Убедитесь, что правило для RDP (порт 3389) создано заранее, иначе потеряете доступ к серверу.

Просмотр и фильтрация существующих правил

На обычном 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, возвращаться в графический интерфейс не хочется. Вот почему:

Командлеты модуля 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-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах.

15+лет опыта
25+клиентов
40Gсвоя сеть
24/7поддержка

Комментарии