
به اشتراک بگذارید

به اشتراک بگذارید
باز کردن پورت یک خط New-NetFirewallRule است، به شرط اینکه قانون روی پروفایل درست بنشیند. فایروال ویندوز سرور سه پروفایل Domain، Private و Public دارد و ستون NetworkCategory در Get-NetConnectionProfile پروفایل فعال را نشان میدهد. پورتی که قانون دارد و جواب نمیدهد، در یکی از این پلهها مانده است:
💡 پروفایل فعال و Block همپوشان
قانون ورودی فقط وقتی کار میکند که پروفایلش فعال باشد، و هر قانون Block همپوشان بر آن غلبه میکند.
✅ پیش از محدود کردن ریموت دسکتاپ، کنسول VNC را باز کنید.
✅ پورت جواب نمیدهد؟ از پله اول نردبان عیبیابی شروع کنید.
قانون را ساختهاید، سرویس روشن است و اتصال از بیرون باز هم قطع میشود؛ نردبان پایین لایهای را پیدا میکند که بسته را نگه داشته. احراز هویت سطح شبکه و بقیه کارهای روز تحویل با کانفیگ اولیه سرور مجازی ویندوز تمام شدهاند؛ نردبان از بعد آن شروع میشود.
🧭 پروفایل، قانون، IP و پنج پله
◀️ سه پروفایل و پروفایل فعال سرور
◀️ ساخت قانون در PowerShell و wf.msc
◀️ محدود کردن پورت به یک IP
◀️ نردبان عیبیابی پورت

پروفایل فعال را Get-NetConnectionProfile نشان میدهد: DomainAuthenticated با پروفایل Domain متناظر است و Private و Public با پروفایل همنام خودشان. تا پروفایل یک قانون فعال نشود، فایروال ویندوز سرور آن قانون را اجرا نمیکند.
Get-NetConnectionProfile
جدول زیر از صفحه معرفی Windows Firewall است:
| پروفایل | چه وقت فعال میشود | تغییر دستی | روی سرور بیرون از دامنه |
|---|---|---|---|
| Domain | عضویت در دامنه و دیدن Domain Controller | ممکن نیست | فعال نمیشود |
| Private | مدیر شبکه را Private اعلام کرده | با Set-NetConnectionProfile | اگر دستی یا با سیاست تنظیم شده باشد |
| Public | پیشفرض شبکههای شناسایینشده | با Set-NetConnectionProfile | حالت پیشفرض |
اگر در New-NetFirewallRule پارامتر -Profile را ننویسید، پیشفرض Any است و قانون روی هر سه پروفایل کار میکند. اما نمونه رسمی Microsoft برای پورت تازه ریموت دسکتاپ -Profile Public دارد و روی اتصال Private بیاثر است. دسته شبکه را برای یک پورت عوض نکنید؛ قانونهای فعال کل سرور عوض میشوند.
یک قانون ورودی تازه در فایروال ویندوز سرور چهار چیز میخواهد: جهت، Action، پروتکل و پورت محلی. مرجع New-NetFirewallRule همه را در یک خط میگیرد و خط دوم پورت ثبتشده را نشان میدهد.
New-NetFirewallRule -DisplayName "App-TCP-8080-In" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8080
Get-NetFirewallRule -DisplayName "App-TCP-8080-In" | Get-NetFirewallPortFilter
پیشفرضها: جهت Inbound، پروفایل Any و Enabled برابر True. نوع -Enabled بولی نیست و طبق همان مرجع، $true و $false را نمیپذیرد؛ متن True یا False بنویسید.
عبارت wf.msc را در منوی Start تایپ کنید. در Inbound Rules گزینه New Rule را بزنید؛ نوع Port، پروتکل و شماره پورت، بعد Allow the connection. اگر در صفحه بعد تیک پروفایل فعال را بردارید، قانون ساخته میشود و کار نمیکند.
| راه (فقط یکی) | دستور | نتیجه |
|---|---|---|
| غیرفعال کردن | Set-NetFirewallRule -DisplayName "App-TCP-8080-In" -Enabled False | قانون میماند و با True برمیگردد |
| قانون Block | New-NetFirewallRule -DisplayName "Block-TCP-8080-In" -Direction Inbound -Action Block -Protocol TCP -LocalPort 8080 | پورت برای همه بسته میشود |
| حذف | Remove-NetFirewallRule -DisplayName "App-TCP-8080-In" -WhatIf | اول پیشنمایش، بعد بدون -WhatIf |
فقط یکی را انتخاب کنید. اگر Block را ساختید و بعد سراغ بخش بعد رفتید، اول آن را حذف کنید؛ وگرنه بر قانون محدود به IP هم غلبه میکند. اجرای Remove-NetFirewallRule بدون پارامتر، طبق مرجعش، همه قانونهای محلی ایستا را پاک میکند.

با -RemoteAddress قانون فقط آدرسهایی را راه میدهد که خودتان مینویسید و بقیه به بستن پیشفرض فایروال ویندوز سرور میخورند. این پارامتر یک IP، زیرشبکه مثل 198.51.100.0/24، بازهای مثل 198.51.100.10-198.51.100.20 یا کلیدواژه LocalSubnet را میپذیرد.
New-NetFirewallRule -DisplayName "App-TCP-8080-Office" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8080 -RemoteAddress 203.0.113.10,198.51.100.0/24
اگر قانون App-TCP-8080-In با آدرس Any هنوز روشن است، غیرفعالش کنید تا این محدودیت معنی پیدا کند. برای تغییر بعدی، Set-NetFirewallRule -RemoteAddress فهرست قبلی را کامل جایگزین میکند و چیزی به آن اضافه نمیکند.
⚖️ وقتی دو قانون سر یک پورت اختلاف دارند
در مستند قانونهای Windows Firewall، Allow صریح بر بستن پیشفرض غلبه میکند و Block صریح بر هر Allow متعارض؛ ترتیب دستی هم وجود ندارد.
پس برای محدود کردن پورت، دامنه Allow را تنگ کنید؛ Block با آدرس Any خودتان را هم بیرون میگذارد.
ریموت دسکتاپ بهطور پیشفرض روی 3389 گوش میدهد و اشتباه در این بخش شما را از سرور بیرون میگذارد. ترتیب قدمها را عوض نکنید.
⚠️ نشست باز راه برگشت نیست
طبق مستند ALE در Windows Filtering Platform، بعد از هر تغییر سیاست اولین بسته هر اتصال موجود دوباره بررسی میشود. نشست بازتان هم ممکن است قطع شود. با IP متغیر، این محدودیت دیر یا زود خود شما را بیرون میگذارد.
🔶 قدم صفر: کنسول VNC
پیش از قدم ۱، کنسول VNC در پنل وبداده را باز کنید و وارد ویندوز شوید؛ این ورود از ریموت دسکتاپ جداست و برگشت قدم ۴ از همینجاست.
قدم ۱. آدرسی را که سرور از شما میبیند بخوانید؛ ستون RemoteAddress در ردیف نشست خودتان جواب است.
Get-NetTCPConnection -LocalPort 3389 -State Established
قدم ۲. قانون محدود را برای TCP و UDP بسازید. پارامتر -Name شناسه ثابت قانون است و قدم بعد با همین نام قانونهای تازه را کنار میگذارد.
New-NetFirewallRule -Name "RDP-MyIP-TCP" -DisplayName "RDP-MyIP-TCP" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3389 -RemoteAddress 203.0.113.10
New-NetFirewallRule -Name "RDP-MyIP-UDP" -DisplayName "RDP-MyIP-UDP" -Direction Inbound -Action Allow -Protocol UDP -LocalPort 3389 -RemoteAddress 203.0.113.10
قدم ۳. بقیه قانونهای 3389 را غیرفعال کنید. اول دو خط اول را اجرا کنید؛ نامی با RDP-MyIP نباید در فهرست باشد. بعد خط سوم را بزنید.
$old = Get-NetFirewallPortFilter | Where-Object -Property LocalPort -EQ 3389 | Get-NetFirewallRule | Where-Object -Property Name -NotLike "RDP-MyIP-*"
$old | Select-Object Name, DisplayName, Enabled
$old | Set-NetFirewallRule -Enabled False
قدم ۴. یک اتصال ریموت تازه بزنید. اگر وصل نشد، این خط را در کنسول VNC اجرا کنید تا همه قانونهای 3389 دوباره روشن شوند، بعد IP را دوباره بررسی کنید:
Get-NetFirewallPortFilter | Where-Object -Property LocalPort -EQ 3389 | Get-NetFirewallRule | Set-NetFirewallRule -Enabled True
قانون قدیمی را حذف نکنید، وگرنه این خط چیزی برای برگرداندن ندارد. قالب IP:پورت در راهنمای اتصال به سرور مجازی ویندوز آمده است.

از بیرون شروع کنید: روی یک کامپیوتر ویندوزی دیگر دستور Test-NetConnection را با IP سرور و شماره پورت اجرا کنید. اگر TcpTestSucceeded برابر False بود، پلهها را به ترتیب بالا بروید؛ پلههای ۲ تا ۴ داخل فایروال ویندوز سرور را میگردند و پلههای ۱ و ۵ بیرون آن را.
Test-NetConnection -ComputerName 203.0.113.50 -Port 8080 -InformationLevel Detailed
این تست فقط TCP را میسنجد. پلههای ۲ و ۳ دنبال قانونی روی پروفایل اشتباه و Block همپوشان میگردند. مأمور ورزشگاه هم بلیت جایگاه شرقی را جلوی در غربی قبول نمیکند و اسمی را که در فهرست محرومان باشد با هیچ بلیتی راه نمیدهد.
Get-NetTCPConnection -State Listen -LocalPort 8080
اگر چیزی گوش ندهد، پیغام خطای پیدا نشدن میگیرید و فایروال تقصیری ندارد. LocalAddress برابر 127.0.0.1 (loopback) یعنی برنامه فقط از داخل سرور در دسترس است؛ آدرس گوشدادن را در تنظیمات برنامه عوض کنید. آدرس دیگری دیدید؟ ← پله ۲.
Get-NetFirewallPortFilter | Where-Object -Property LocalPort -EQ 8080 | Get-NetFirewallRule | Select-Object DisplayName, Enabled, Profile
ستون Profile باید Any یا پروفایل فعال باشد و Enabled برابر True. این فهرست فقط قانونهای محلی با همین پورت دقیق را میآورد؛ قانونی با بازه پورت یا Any در آن نیست. قانونی که به یک برنامه بسته شده، باید مسیر همان فایل اجرایی در حال کار را داشته باشد؛ Get-NetFirewallApplicationFilter آن را نشان میدهد. همه درست بود؟ ← پله ۳.
Get-NetFirewallRule -PolicyStore ActiveStore -Direction Inbound -Action Block -Enabled True | Select-Object DisplayName, Profile
گزینه -PolicyStore ActiveStore قانونهای Group Policy را هم میآورد. قانون مشکوک را به Get-NetFirewallPortFilter بدهید؛ اگر LocalPort آن پورت شما یا Any باشد، مقصر همین قانون است. چیزی نبود؟ ← پله ۴.
Set-NetFirewallProfile -Name Public -LogBlocked True
# test again from outside, then:
Set-NetFirewallProfile -Name Public -LogBlocked False
بهجای Public پروفایل فعال خودتان را بگذارید. به گفته مرجع Set-NetFirewallProfile، با این گزینه هر اتصالی که سیاست فایروال رد کند در %windir%\system32\logfiles\firewall\pfirewall.log ثبت میشود. تست بیرونی را تکرار کنید: خطی با IP شما و شماره پورت یعنی ویندوز بسته را انداخته؛ به پله ۲ و ۳ برگردید. خطی نبود؟ ← پله ۵. اگر فایل اصلاً ساخته نشد، سرویس mpssvc به اجازه نوشتن در آن پوشه نیاز دارد.
لاگ خالی یعنی بسته پیش از ویندوز متوقف شده. یک بار از شبکه دیگری تست کنید؛ گاهی شبکه سمت شما خروجی آن پورت را میبندد. اگر ارائهدهنده فایروال شبکه جدا دارد، تنظیمش را ببینید یا خروجی تست و لاگ خالی را برای پشتیبانی بفرستید.
وسط عیبیابی، معمولاً یکی از این بنبستها جلوی راه است؛ اگر هیچکدام نبود، از پله ۱ دوباره شروع کنید.
این کار همه پورتهای گوشدهنده را رو به اینترنت باز میکند. لاگ پله ۴ همان جواب را بیخطر میدهد.
دستور Get-NetFirewallRule -PolicyStore ActiveStore قانونهای محلی و Group Policy را با هم نشان میدهد.
نوع این پارامتر بولی نیست. بهجای متغیرهای $true و $false متن True یا False را بنویسید.
خیر. Domain فقط برای سرور عضو دامنهای فعال میشود که Domain Controller را ببیند و Set-NetConnectionProfile انتخاب DomainAuthenticated را نمیپذیرد.
آدرسها را با ویرگول به -RemoteAddress بدهید، یا زیرشبکه را با /24 و بازه را با خط تیره بنویسید.
در مستند تغییر پورت Microsoft، ساختن دو قانون TCP و UDP برای پورت تازه جزو مراحل است.
قانون غیرفعال میماند و با -Enabled True برمیگردد؛ Remove-NetFirewallRule آن را برای همیشه پاک میکند.
جمعبندی؛ فایروال ویندوز سرور را با مدرک عیبیابی کنید. پورتی که با وجود قانون جواب نمیدهد پشت یکی از پنج لایه مانده است: برنامهای که گوش نمیدهد، قانونی روی پروفایل دیگر، یک Block پنهان، بستهای که ویندوز انداخته یا بستهای که نرسیده. از Test-NetConnection بیرونی شروع کنید و پلهبهپله تا pfirewall.log جلو بروید. برای محدود کردن دسترسی، دامنه قانون Allow را با -RemoteAddress تنگ کنید و Block را برای بستن کامل پورت نگه دارید. روی ریموت دسکتاپ ترتیب این است: کنسول VNC باز، قانون محدود، خاموش کردن قانون قدیمی، اتصال تازه، و خط برگشت آماده. LogBlocked را هم بعد از تست به False برگردانید.
🚀 فایروال تنها کار روز تحویل نیست
فایروال در فهرست کارهای بعد از تحویل سرور ویندوز است، کنار رمز Administrator و اولین بکاپ.
پورت شما روی کدام پله پیدا شد؟ بعد از اصلاح، TcpTestSucceeded بالاخره True شد؟
مستندهایی که دستورها از آنها آمده