บทความนี้ให้พื้นฐานเกี่ยวกับวิธีจัดการการตั้งค่าและกฎของ Windows Defender Firewall with Advanced Security สำหรับการใช้งานโดยใช้ PowerShell เราจะพิจารณาวิธีเปิด/ปิดไฟร์วอลล์สำหรับโปรไฟล์เครือข่ายต่างๆ สร้างหรือลบกฎไฟร์วอลล์ และเขียนสคริปต์ PS ขนาดเล็กเพื่อรับตารางที่สะดวกแสดงชุดกฎไฟร์วอลล์ที่ใช้งานอยู่ปัจจุบัน
คุณสามารถจัดการการตั้งค่า Windows Firewall จาก graphic console: Control Panel → System and Security → Windows Defender Firewall อย่างไรก็ตาม เริ่มจาก Windows 8.1 (Windows Server 2012 R2) คุณสามารถใช้ built-in NetSecurity PowerShell module เพื่อจัดการไฟร์วอลล์ได้
ก่อนหน้านี้ คำสั่งต่อไปนี้ถูกใช้เพื่อจัดการกฎและการตั้งค่า Windows Firewall: netsh advfirewall firewall
มีคำสั่ง 85 คำสั่งในโมดูล NetSecurity บน Windows 10 คุณสามารถแสดงรายการทั้งหมด:
Get-Command -Module NetSecurity
วิธีจัดการโปรไฟล์เครือข่าย Windows Firewall จาก PowerShell
มีสามประเภทของโปรไฟล์เครือข่ายใน Windows Firewall:
- Domain – ใช้กับคอมพิวเตอร์ในโดเมน Active Directory
- Private – เครือข่ายบ้านหรือองค์กร
- Public – เครือข่ายสาธารณะ

Network Location Awareness (NLA) เก็บข้อมูลเกี่ยวกับประเภทเครือข่ายในฐานข้อมูลของมัน คุณสามารถเปลี่ยนโปรไฟล์เครือข่าย (location) ของคุณได้หากถูกตรวจจับอย่างไม่ถูกต้อง
แต่ละโปรไฟล์เครือข่าย (location) อาจแตกต่างกันไปในชุดกฎไฟร์วอลล์ที่ใช้ โดยค่าเริ่มต้น อินเทอร์เฟซเครือข่ายทั้งหมดของคอมพิวเตอร์ได้รับการปกป้องโดยไฟร์วอลล์ และทั้งสามประเภทของโปรไฟล์ถูกนำไปใช้กับพวกเขา
เพื่อเปิดใช้งานทั้งสามโปรไฟล์เครือข่าย: Domain, Public และ Private ให้ใช้คำสั่งนี้:
Set-NetFirewallProfile -All -Enabled True
หรือตั้งค่าโปรไฟล์เฉพาะแทน All:
Set-NetFirewallProfile -Profile Public -Enabled True
เพื่อปิดใช้งานไฟร์วอลล์สำหรับทั้งสาม network location ให้ใช้คำสั่ง:
Set-NetFirewallProfile -All -Enabled False
โดยใช้ Set-NetFirewallProfile cmdlet คุณสามารถเปลี่ยนตัวเลือกโปรไฟล์ (การดำเนินการเริ่มต้น, logging, เส้นทางและขนาดของไฟล์ log, การตั้งค่าการแจ้งเตือน ฯลฯ)
คุณอาจรู้ว่าในเวอร์ชัน OS สมัยใหม่ Windows Firewall เปิดใช้งานสำหรับทุกโปรไฟล์ การเชื่อมต่อออก (outbound) ทั้งหมดได้รับอนุญาต และการเชื่อมต่อเข้า (inbound) ถูกบล็อก (ยกเว้นที่อนุญาต) ในการตั้งค่าโปรไฟล์
ลองเปลี่ยนการดำเนินการเริ่มต้นสำหรับโปรไฟล์ Public ให้บล็อกการเชื่อมต่อเข้าทั้งหมด
Set-NetFirewallProfile –Name Public –DefaultInboundAction Block
คุณสามารถแสดงการตั้งค่าโปรไฟล์ปัจจุบันได้ดังนี้:
Get-NetFirewallProfile -Name Public

หากคุณจัดการการตั้งค่า Windows Firewall โดยใช้ GPO คุณสามารถแสดงการตั้งค่าโปรไฟล์ที่ได้ผลลัพธ์ได้ดังนี้:
Get-NetFirewallProfile -policystore activestore
ตรวจสอบให้แน่ใจว่าการตั้งค่าไฟร์วอลล์ทั้งหมดถูกนำไปใช้กับอินเทอร์เฟซเครือข่ายทั้งหมดของคอมพิวเตอร์
Get-NetFirewallProfile -Name Public | fl DisabledInterfaceAliases
หากอินเทอร์เฟซทั้งหมดได้รับการปกป้อง คำสั่งจะคืนค่าดังนี้:
DisabledInterfaceAliases : {NotConfigured}

คุณสามารถปิดใช้งานโปรไฟล์อินเทอร์เฟซเฉพาะได้ (เพื่อแสดงรายการชื่ออินเทอร์เฟซ ใช้ Get-NetIPInterface):
Set-NetFirewallProfile -Name Public -DisabledInterfaceAliases "Ethernet0"
如你所見 Public profile ไม่ได้ถูกนำไปใช้กับ Ethernet0 อีกต่อไป:
DisabledInterfaceAliases : {Ethernet0}

คุณสามารถตั้งค่าตัวเลือกการบันทึกการเชื่อมต่อเครือข่ายที่ระดับโปรไฟล์ได้ โดยค่าเริ่มต้น Windows Firewall logs จะถูกเก็บไว้ที่ %systemroot%\system32\LogFiles\Firewall และขนาดไฟล์คือ 4MB คุณสามารถเปิดใช้งานการบันทึกการเชื่อมต่อทั้งหมดและเปลี่ยนขนาดไฟล์สูงสุดได้:
Set-NetFireWallProfile -Profile Domain -LogBlocked True -LogMaxSize 20000 -LogFileName ‘%systemroot%\system32\LogFiles\Firewall\pfirewall.log’
วิธีสร้าง แก้ไข หรือลบกฎ Windows Firewall ด้วย PowerShell
มี 9 cmdlets สำหรับจัดการกฎไฟร์วอลล์ของคุณ:
- New-NetFirewallRule
- Copy-NetFirewallRule
- Disable-NetFirewallRule
- Enable-NetFirewallRule
- Get-NetFirewallRule
- Remove-NetFirewallRule
- Rename-NetFirewallRule
- Set-NetFirewallRule
- Show-NetFirewallRule
มาพิจารณาตัวอย่างง่ายๆ ของวิธีเปิดพอร์ตใน Windows Firewall
ตัวอย่างเช่น หากคุณต้องการอนุญาตการเชื่อมต่อ TCP เข้า (inbound) ไปยังพอร์ต 80 และ 443 สำหรับโปรไฟล์ Domain และ Private ให้ใช้คำสั่งนี้:
New-NetFirewallRule -DisplayName 'HTTP-Inbound' -Profile @('Domain', 'Private') -Direction Inbound -Action Allow -Protocol TCP -LocalPort @('80', '443')

คุณสามารถอนุญาตหรือบล็อกการเข้าถึงเครือข่ายสำหรับแอป ตัวอย่างเช่น คุณต้องการบล็อกการเชื่อมต่อออก (outbound) สำหรับ Firefox:
New-NetFirewallRule -Program “C:\Program Files (x86)\Mozilla Firefox\firefox.exe” -Action Block -Profile Domain, Private -DisplayName “Block Firefox browser” -Description “Block Firefox browser” -Direction Outbound
เพื่ออนุญาตการเชื่อมต่อ RDP เข้า (inbound) บนพอร์ต 3389 จากที่อยู่ IP เดียวเท่านั้น:
New-NetFirewallRule -DisplayName "AllowRDP" –RemoteAddress 192.168.2.200 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Allow
เพื่ออนุญาต ping (ICMP) สำหรับที่อยู่จาก subnet หรือช่วง IP ที่ระบุ ให้ใช้คำสั่งเหล่านี้:
$ips = @("192.168.2.15-192.168.2.40", "192.168.100.15-192.168.100.200", ”10.1.0.0/16”)
New-NetFirewallRule -DisplayName "Allow inbound ICMPv4" -Direction Inbound -Protocol ICMPv4 -IcmpType 8 -RemoteAddress $ips -Action Allow
New-NetFirewallRule -DisplayName "Allow inbound ICMPv6" -Direction Inbound -Protocol ICMPv6 -IcmpType 8 -RemoteAddress $ips -Action Allow
ในบทความก่อนหน้า เราแสดงวิธีการบล็อกการเข้าถึงไซต์ทั้งโดยที่อยู่ IP และโดยชื่อ DNS ของไซต์/โดเมนโดยใช้ PowerShell
เพื่อแก้ไขกฎไฟร์วอลล์ที่มีอยู่ ใช้ cmdlet Set-NetFirewallRule ตัวอย่างเช่น เพื่ออนุญาตการเชื่อมต่อเข้าจากที่อยู่ IP ที่ระบุสำหรับกฎที่สร้างไว้ก่อนหน้านี้:
Get-NetFirewallrule -DisplayName 'HTTP-Inbound' | Get-NetFirewallAddressFilter | Set-NetFirewallAddressFilter -RemoteAddress 192.168.1.10
หากคุณต้องการเพิ่มที่อยู่ IP หลายรายการเข้าไปในกฎไฟร์วอลล์ ให้ใช้สคริปต์นี้:
$ips = @("192.168.2.15", "192.168.2.17",”192.168.100.15”)
Get-NetFirewallrule -DisplayName 'WEB-Inbound'|Set-NetFirewallRule -RemoteAddress $ips
เพื่อแสดงที่อยู่ IP ทั้งหมดในกฎไฟร์วอลล์:
Get-NetFirewallrule -DisplayName 'Allow inbound ICMPv4'|Get-NetFirewallAddressFilter

คุณสามารถเปิด/ปิดกฎไฟร์วอลล์โดยใช้ cmdlets Disable-NetFirewallRule และ Enable-NetFirewallRule
Disable-NetFirewallRule –DisplayName 'WEB-Inbound'
เพื่ออนุญาต ICMP (ping) ให้รันคำสั่งนี้:
Enable-NetFirewallRule -Name FPS-ICMP4-ERQ-In
เพื่อลบกฎไฟร์วอลล์ ให้ใช้ cmdlet Remove-NetFirewallRule
การแสดงรายการกฎ Windows Firewall ด้วย PowerShell
คุณสามารถแสดงรายการกฎไฟร์วอลล์ที่ใช้งานอยู่สำหรับ traffic เข้า (inbound) ได้ดังนี้:
Get-NetFirewallRule | where {($_.enabled -eq $True) -and ($_.Direction -eq "Inbound")} |ft
หากคุณต้องการแสดงรายการกฎบล็อกออก (outbound blocking):
Get-NetFirewallRule -Action Block -Enabled True -Direction Outbound
เพื่อแสดงชื่อแอปในกฎ:
Get-NetFirewallRule -Action Block -Enabled True -Direction Outbound | %{$_.Name; $_ | Get-NetFirewallApplicationFilter}

如你所見 Get-NetFirewallRule cmdlet ไม่แสดงพอร์ตเครือข่ายและที่อยู่ IP สำหรับกฎไฟร์วอลล์ของคุณ เพื่อแสดงข้อมูลโดยละเอียดเกี่ยวกับการเชื่อมต่อที่อนุญาตเข้า (ออก) ในวิธีที่สะดวกกว่าที่แสดงหมายเลขพอร์ต ให้ใช้สคริปต์ PowerShell ต่อไปนี้:
Get-NetFirewallRule -Action Allow -Enabled True -Direction Inbound |
Format-Table -Property Name,
@{Name='Protocol';Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}},
@{Name='LocalPort';Expression={($PSItem | Get-NetFirewallPortFilter).LocalPort}},
@{Name='RemotePort';Expression={($PSItem | Get-NetFirewallPortFilter).RemotePort}},
@{Name='RemoteAddress';Expression={($PSItem | Get-NetFirewallAddressFilter).RemoteAddress}},
Enabled,Profile,Direction,Action

PowerShell ให้โอกาสมากมายในการจัดการกฎ Windows Firewall จาก command prompt คุณสามารถรันสคริปต์ PowerShell เพื่อเปิด/ปิดพอร์ตโดยอัตโนมัติหากเกิดเหตุการณ์บางอย่าง ในบทความต่อไป เราจะพิจารณาวิธีแก้ปัญหาแบบง่ายๆ ที่ใช้ PowerShell และ Windows Firewall เพื่อบล็อกที่อยู่ IP ที่พยายาม brute-force รหัสผ่านผ่าน RDP บน Windows VDS server ของคุณโดยอัตโนมัติ