Mô tả lỗi
Bạn khởi động một ứng dụng — dev server local, game, công cụ database — và Windows hiện thông báo:
Windows Defender Firewall has blocked some features of this app
Đôi khi bạn click "Allow" nhưng app vẫn không nhận được kết nối. Đôi khi hộp thoại không xuất hiện và app âm thầm không thể bind. Dù thế nào, traffic cũng không đi qua được.
Nguyên nhân
Mặc định, Windows Defender Firewall chặn tất cả kết nối inbound đối với các app chưa được cho phép rõ ràng. Lần đầu tiên app cố lắng nghe trên một port, Windows sẽ hỏi bạn. Click "Cancel" — hoặc chạy app qua service không có desktop session — thì không có quy tắc nào được tạo. App bị chặn âm thầm từ đó trở đi.
Các tình huống phổ biến:
- Dev server Node.js / Python / Go trên port 3000 hoặc 8080 mà các thiết bị khác trong mạng không thể kết nối tới
- Game hoặc ứng dụng peer-to-peer không nhận được kết nối đến
- Database local (PostgreSQL trên port 5432, Redis trên 6379) không truy cập được từ máy khác trong cùng LAN
- App được cài lại vào đường dẫn mới — quy tắc firewall cũ vẫn trỏ vào vị trí cũ và không bao giờ khớp
- Script hoặc scheduler khởi chạy app không có desktop session, nên hộp thoại chưa từng hiện ra
Cách 1 — Cho phép App qua Firewall GUI
Bắt đầu ở đây nếu bạn muốn mở chặn một app cụ thể mà không cần dùng PowerShell:
- Mở Windows Security → Firewall & network protection → Allow an app through firewall
- Click Change settings (cần quyền admin)
- Tìm app của bạn trong danh sách. Tích vào Private và/hoặc Public tùy nhu cầu
- Không có trong danh sách? Click Allow another app… → duyệt tới file .exe → Add
Windows sẽ tạo một quy tắc firewall gắn với đường dẫn của file thực thi đó.
Cách 2 — Thêm Inbound Rule cho Port Cụ thể (PowerShell)
Có server chạy trên port cố định? Quy tắc theo port chặt chẽ hơn là cho phép toàn bộ executable.
# Cho phép TCP port 3000 inbound (ví dụ: dev server)
New-NetFirewallRule `
-DisplayName "Dev Server Port 3000" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 3000 `
-Action Allow `
-Profile Any
Với UDP hoặc dải port:
# UDP, dải port 7000-7100
New-NetFirewallRule `
-DisplayName "Game Ports UDP" `
-Direction Inbound `
-Protocol UDP `
-LocalPort 7000-7100 `
-Action Allow `
-Profile Private
Chạy PowerShell với quyền Administrator cho cả hai lệnh.
Cách 3 — Thêm Inbound Rule cho Executable (PowerShell)
Port động? Cho phép bản thân executable thay vì gắn cố định số port:
New-NetFirewallRule `
-DisplayName "Allow MyApp" `
-Direction Inbound `
-Program "C:\Program Files\MyApp\myapp.exe" `
-Action Allow `
-Profile Any
Thích dùng cmd truyền thống? netsh cũng hoạt động và chạy được trên các phiên bản Windows cũ:
netsh advfirewall firewall add rule ^
name="Allow MyApp" ^
dir=in ^
action=allow ^
program="C:\Program Files\MyApp\myapp.exe" ^
enable=yes
Cách 4 — Kiểm tra Quy tắc Đã Tồn tại nhưng Bị Tắt
Trước khi tạo mới bất cứ thứ gì, hãy kiểm tra xem quy tắc đã tồn tại và chỉ đang bị tắt:
# Liệt kê tất cả quy tắc inbound
Get-NetFirewallRule -Direction Inbound | Select-Object DisplayName, Enabled, Action
# Lọc theo từ khóa tên
Get-NetFirewallRule -Direction Inbound | Where-Object { $_.DisplayName -like "*MyApp*" }
Tìm thấy quy tắc đang bị tắt? Một lệnh để bật lại:
Set-NetFirewallRule -DisplayName "Allow MyApp" -Enabled True
Cách 5 — Tắt Tạm thời Firewall để Kiểm tra
Chưa chắc firewall có phải nguyên nhân không? Tắt tạm thời để xác nhận, rồi bật lại ngay.
# Tắt firewall trên tất cả profile (chỉ để kiểm tra)
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
# Bật lại ngay sau khi kiểm tra
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
App hoạt động khi tắt firewall? Đó là xác nhận. Thêm quy tắc phù hợp và bật lại — đừng để tắt mãi.
Xác minh
Sau khi thêm quy tắc, hãy xác nhận nó thực sự hoạt động:
# App có đang lắng nghe trên port mong muốn không?
netstat -ano | findstr :3000
# Kiểm tra tương tự qua PowerShell
Get-NetTCPConnection -LocalPort 3000
Từ máy khác trong cùng mạng:
# Windows (PowerShell)
Test-NetConnection -ComputerName 192.168.1.100 -Port 3000
# Linux / macOS
nc -zv 192.168.1.100 3000
TcpTestSucceeded : True nghĩa là port đã mở và có thể truy cập. Xong.
Phòng ngừa
Một vài thói quen nhỏ giúp tránh lặp lại vấn đề này:
- Quy tắc firewall gắn với đường dẫn executable. Nếu bạn cài lại app vào thư mục khác hoặc đổi tên thư mục, quy tắc cũ sẽ không còn khớp — âm thầm. Ghi lại những quy tắc bạn đã thêm và thời điểm thêm, để việc dọn dẹp sau này dễ dàng hơn.
- Giới hạn quy tắc vào mạng Private nếu có thể. Dev server trên port 3000 không cần truy cập được trên profile Public. Giữ mức độ phơi bày ở mức tối thiểu.
- Dùng tên hiển thị cụ thể. "Dev Server Port 3000" dễ kiểm tra hơn sau sáu tháng so với "New Rule 4". Rất hữu ích khi dọn dẹp các quy tắc cũ.
- Giới hạn quy tắc cho một subnet cụ thể? Subnet Calculator trên ToolCraft tính toán dải CIDR ngay lập tức — hữu ích khi bạn muốn chỉ cho phép 192.168.1.0/24 thay vì bất kỳ nguồn nào. Chạy trên trình duyệt, không có dữ liệu nào rời khỏi máy bạn.
Dọn dẹp Quy tắc Cũ
Quy tắc firewall tích lũy nhanh. Kiểm tra và xóa những quy tắc không còn áp dụng:
# Xóa quy tắc theo display name
Remove-NetFirewallRule -DisplayName "Old Dev Server"
# Tìm quy tắc gắn với chương trình cụ thể
Get-NetFirewallRule -Direction Inbound | `
Get-NetFirewallApplicationFilter | `
Where-Object { $_.Program -like "*node*" }

