透過Windows防火牆來限制遠端桌面只允許某些IP可連入

透過作業系統提供的遠端桌面可以大幅的提升在家辦公的工作效率,但也大幅的提升資安風險(會有一大堆人用工具去Try你的帳號與密碼)。對於這部分的兩難議題,我選擇的是只允許VPN連入,換句話說只允許特定的IP才可以通過遠端桌面 RDP的驗證連入。

如何設定遠端桌面只允許特定的IP連入

Step 1. 到Windows設定防火牆與網路保護,點選進階設定,進入到具有進階安全性的Windows Defender防火牆

Step 2. 在輸入規則中,找到下圖的3個防火牆設定檔

Step 3. 點選進入防火牆設定檔,在領域的頁籤中,設定遠端IP位址,例如如下圖代表著這台機器的遠端桌面,只允許192.168.1.2192.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中執行後,會得到下列顯示,我們就可以由此取得比較好設計為程式的屬性值,而不會受到中文編碼的影響,例如NameID都是不錯的選擇:

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介面偷懶,當你選擇輸入規則後,他會一次性把全部的防火牆設定檔與數值都載入,然後就不會再更新了。解決辦法就是先去點選一次輸出規則後再點選輸入規則強制重新載入防火牆設定檔,你就會看到新設定的數值了。

相關連結

Windows Firewall Rule RDP RemoteDesktopProtocol RemoteDesktop AllowIP DisallowAny VPN FastSetting RapidSetting