透過Windows防火牆來限制遠端桌面只允許某些IP可連入
透過作業系統提供的遠端桌面可以大幅的提升在家辦公
的工作效率,但也大幅的提升資安風險(會有一大堆人用工具去Try你的帳號與密碼)。對於這部分的兩難議題,我選擇的是只允許VPN
連入,換句話說只允許特定的IP
才可以通過遠端桌面 RDP
的驗證連入。
如何設定遠端桌面只允許特定的IP連入
Step 1. 到Windows設定
>防火牆與網路保護
,點選進階設定
,進入到具有進階安全性的Windows Defender防火牆
。
Step 2. 在輸入規則
中,找到下圖的3個防火牆設定檔
。
Step 3. 點選進入防火牆設定檔,在領域
的頁籤中,設定遠端IP位址
,例如如下圖代表著這台機器的遠端桌面,只允許192.168.1.2
與192.168.1.3
這兩個IP連入。
透過Powershell快速設定遠端桌面只允許特定的IP連入
透過上面的防護理論上就可以讓遠端桌面高枕無憂了,但有時候會遇到必須在異地場合(且不是用你的筆電)連入你的遠端桌面進行某種簡報展示,這時候不太可能讓客戶在那邊等你慢慢設定這些屬性數值,因此我們可以把這些操作撰寫成Powershell script,透過指令來快速切換自己的遠端桌面是否要允許特定的IP才可以連入。
Step 1. 我們可以透過下列指令先逐一檢查這些防火牆規則,他的DisplayName後面真正的Name屬性值為何?例如:
$ruleName = "遠端桌面 - 使用者模式 (TCP-In)"
$rule = Get-NetFirewallRule -DisplayName $ruleName
$rule | Format-List *
在Powershell中執行後,會得到下列顯示,我們就可以由此取得比較好設計為程式的屬性值,而不會受到中文編碼的影響,例如Name
、ID
都是不錯的選擇:
Name : RemoteDesktop-UserMode-In-TCP
ID : RemoteDesktop-UserMode-In-TCP
DisplayName: 遠端桌面 - 使用者模式 (TCP-In)
...略...
Step 2. 透過逐一取得防火牆規則真正的屬性值後,我們可以得到下列對應:
遠端桌面 - 使用者模式 (TCP-In): RemoteDesktop-UserMode-In-TCP
遠端桌面 - 使用者模式 (UDP-In): RemoteDesktop-UserMode-In-UDP
遠端桌面 - 陰影 (TCP-In): RemoteDesktop-Shadow-In-TCP
Step 3. 接著我們就針對這些防火牆規則進行powershell script設計,當遠端IP位址
為Any
就改成指定的IP,當遠端IP位址
不為Any
時就改回Any
,特別提醒,如果你要將這個存成*.ps1
執行檔,記得執行的時候必須賦予系統管理員
a.k.a.Administrator
的權限才可以順利運作喔。
# Define the firewall rules
$ruleNames = @(
"RemoteDesktop-UserMode-In-TCP",
"RemoteDesktop-UserMode-In-UDP",
"RemoteDesktop-Shadow-In-TCP"
)
# Define new IP addresses
$newAddresses = @("192.168.1.2", "192.168.1.3")
# Function to toggle a single rule
function Toggle-FirewallRule($ruleName) {
$rule = Get-NetFirewallRule -Name $ruleName
$filter = $rule | Get-NetFirewallAddressFilter
$currentAddress = $filter.RemoteAddress
Write-Host "Current remote IP address setting for $ruleName : $currentAddress"
if ($currentAddress -eq "Any") {
$rule | Set-NetFirewallRule -RemoteAddress $newAddresses
Write-Host "Rule changed from 'Any' to specific IPs: $($newAddresses -join ', ')"
} else {
$rule | Set-NetFirewallRule -RemoteAddress "Any"
Write-Host "Rule changed to 'Any'"
}
$updatedFilter = $rule | Get-NetFirewallAddressFilter
Write-Host "Updated remote IP address setting: $($updatedFilter.RemoteAddress)"
Write-Host "---"
}
# Apply changes to all specified rules
foreach ($ruleName in $ruleNames) {
Toggle-FirewallRule $ruleName
}
Write-Host "All specified firewall rules have been updated."
Step 4. 透過Powershell執行後,再去具有進階安全性的Windows Defender防火牆
看設定有可能會看不到變更後的數值
,會發生這樣的原因是因為這個UI介面偷懶,當你選擇輸入規則
後,他會一次性把全部的防火牆設定檔與數值都載入,然後就不會再更新了。解決辦法就是先去點選一次輸出規則
後再點選輸入規則
強制重新載入防火牆設定檔,你就會看到新設定的數值了。