在 Azure VM 中禁用来宾 OS 防火墙

本文提供了有关你怀疑来宾操作系统防火墙正在筛选虚拟机 (VM) 的部分或完整流量的情况的参考。 如果故意对导致 RDP 连接失败的防火墙进行更改,则可能会发生这种情况。

解决方案

本文中所述的过程旨在用作解决方法,以便你可以专注于解决实际问题,即如何正确设置防火墙规则。 启用 Windows 防火墙组件是 Microsoft 最佳做法。 如何配置防火墙规则取决于对所需 VM 的访问级别。

联机解决方案

如果 VM 处于联机状态,并且可以在同一虚拟网络上的另一个 VM 上访问,则可以使用其他 VM 进行这些缓解。

缓解 1:自定义脚本扩展或运行命令功能

如果 Azure 代理正常工作,则可以使用自定义脚本扩展运行命令功能, (资源管理器 仅) VM 远程运行以下脚本。

注意

  • 如果防火墙是在本地设置的,请运行以下脚本:

    Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\DomainProfile' -name "EnableFirewall" -Value 0
    Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile' -name "EnableFirewall" -Value 0
    Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\Standardprofile' -name "EnableFirewall" -Value 0 
    Restart-Service -Name mpssvc
    
  • 如果防火墙是通过 Active Directory 策略设置的,则可以使用运行以下脚本进行临时访问。

    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile' -name "EnableFirewall" -Value 0
    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall\PublicProfile' -name "EnableFirewall" -Value 0
    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile' -name "EnableFirewall" -Value 0
    Restart-Service -Name mpssvc
    

    但是,一旦再次应用该策略,就会被踢出远程会话。 此问题的永久修复是修改在此计算机上应用的策略。

缓解措施 2:远程 PowerShell

  1. 连接到与使用 RDP 连接无法访问的 VM 位于同一虚拟网络上的 VM。

  2. 打开 PowerShell 控制台窗口。

  3. 运行以下命令:

    Enter-PSSession (New-PSSession -ComputerName "<HOSTNAME>" -Credential (Get-Credential) -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)) 
    netsh advfirewall set allprofiles state off
    Restart-Service -Name mpssvc 
    exit
    

注意

如果防火墙是通过 组策略 对象设置的,则此方法可能不起作用,因为此命令仅更改本地注册表项。 如果策略已到位,它将覆盖此更改。

缓解措施 3:PSTools 命令

  1. 在 VM 故障排除中,下载 PSTools

  2. 打开 CMD 实例,然后通过其 DIP 访问 VM。

  3. 运行以下命令:

    psexec \\<DIP> ​-u <username> cmd
    netsh advfirewall set allprofiles state off
    psservice restart mpssvc
    

缓解措施 4:远程注册表

按照以下步骤使用远程注册表。

  1. 在故障排除 VM 上,启动注册表编辑器,然后转到 “文件>连接网络注册表”。

  2. 打开 TARGET MACHINE\SYSTEM 分支,并指定以下值:

    <TARGET MACHINE>\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\EnableFirewall           -->        0 
    <TARGET MACHINE>\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile\EnableFirewall           -->        0 
    <TARGET MACHINE>\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\EnableFirewall         -->        0
    
  3. 重启服务。 由于无法使用远程注册表执行此操作,因此必须使用远程服务控制台。

  4. 打开 Services.msc 的实例。

  5. 单击“ 服务” (“”本地) ”。

  6. 选择“ 连接到另一台计算机”。

  7. 输入问题 VM 的专用 IP 地址 (DIP)

  8. 重启本地防火墙策略。

  9. 再次尝试从本地计算机通过 RDP 连接到 VM。

脱机解决方案

如果出现无法通过任何方法访问 VM 的情况,自定义脚本扩展将失败,并且必须直接通过系统磁盘在 OFFLINE 模式下工作。 为此,可执行以下步骤:

  1. 将系统磁盘附加到恢复 VM

  2. 启动到恢复 VM 的远程桌面连接。

  3. 确保在磁盘管理控制台中将磁盘标记为联机。 记下分配给附加系统磁盘的驱动器号。

  4. 在进行任何更改之前,请创建 \windows\system32\config 文件夹的副本,以防需要回滚更改。

  5. 在故障排除 VM 上,启动注册表编辑器 (regedit.exe) 。

  6. 对于此故障排除过程,我们将配置单元装载为 BROKENSYSTEM 和 BROKENSOFTWARE。

  7. 突出显示HKEY_LOCAL_MACHINE键,然后从菜单中选择“文件 > 加载配置单元”。

  8. 在附加的系统磁盘上找到 \windows\system32\config\SYSTEM 文件。

  9. 打开提升的 PowerShell 实例,然后运行以下命令:

    # Load the hives - If your attached disk is not F, replace the letter assignment here
    reg load HKLM\BROKENSYSTEM f:\windows\system32\config\SYSTEM
    reg load HKLM\BROKENSOFTWARE f:\windows\system32\config\SOFTWARE 
    # Disable the firewall on the local policy
    $ControlSet = (get-ItemProperty -Path 'HKLM:\BROKENSYSTEM\Select' -name "Current").Current
    $key = 'HKLM:\BROKENSYSTEM\ControlSet00'+$ControlSet+'\services\SharedAccess\Parameters\FirewallPolicy\DomainProfile'
    Set-ItemProperty -Path $key -name 'EnableFirewall' -Value 0 -Type Dword -force
    $key = 'HKLM:\BROKENSYSTEM\ControlSet00'+$ControlSet+'\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile'
    Set-ItemProperty -Path $key -name 'EnableFirewall' -Value 0 -Type Dword -force
    $key = 'HKLM:\BROKENSYSTEM\ControlSet00'+$ControlSet+'\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile'
    Set-ItemProperty -Path $key -name 'EnableFirewall' -Value 0 -Type Dword -force
    # To ensure the firewall is not set through AD policy, check if the following registry entries exist and if they do, then check if the following entries exist:
    $key = 'HKLM:\BROKENSOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile'
    Set-ItemProperty -Path $key -name 'EnableFirewall' -Value 0 -Type Dword -force
    $key = 'HKLM:\BROKENSOFTWARE\Policies\Microsoft\WindowsFirewall\PublicProfile'
    Set-ItemProperty -Path $key -name 'EnableFirewall' -Value 0 -Type Dword -force
    $key = 'HKLM:\BROKENSOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile'
    Set-ItemProperty -Path $key -name 'EnableFirewall' -Value 0 -Type Dword -force
    # Unload the hives
    reg unload HKLM\BROKENSYSTEM
    reg unload HKLM\BROKENSOFTWARE
    
  10. 分离系统磁盘并重新创建 VM

  11. 检查问题是否已解决。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。