이 문서에서는 VM(가상 머신)에 대한 네트워크 트래픽 필터 문제를 진단하는 방법을 알아봅니다. 이 프로세스에는 NSG(네트워크 보안 그룹)에서 적용되는 효과적인 보안 규칙을 확인하는 작업이 포함됩니다.
NSG를 사용하면 VM에서 들어오고 나가는 트래픽 유형을 제어할 수 있습니다. Azure 가상 네트워크의 서브넷, VM에 연결된 네트워크 인터페이스 또는 둘 다에 NSG를 연결할 수 있습니다. 네트워크 인터페이스에 적용되는 유효한 보안 규칙은 네트워크 인터페이스에 연결된 NSG 및 네트워크 인터페이스가 속한 서브넷에 존재하는 규칙을 집계한 것입니다. 서로 다른 NSG의 규칙은 때때로 서로 충돌하여 VM의 네트워크 연결에 영향을 줄 수 있습니다. VM의 네트워크 인터페이스에 적용된 NSG의 모든 효과적인 보안 규칙을 볼 수 있습니다. 가상 네트워크, 네트워크 인터페이스 또는 NSG 개념을 잘 모르는 경우 가상 네트워크 개요, 네트워크 인터페이스 및 네트워크 보안 그룹 개요를 참조하세요.
시나리오
인터넷에서 포트 80을 통해 VM에 연결하려고 하지만 연결에 실패합니다. 인터넷에서 포트 80에 액세스할 수 없는 이유를 확인하기 위해 Azure Portal, PowerShell 또는 Azure CLI를 사용하여 네트워크 인터페이스에 대한 효과적인 보안 규칙을 볼 수 있습니다.
다음 단계는 유효 보안 규칙을 볼 수 있는 기존 VM이 있다고 가정합니다. 기존 VM이 없는 경우 먼저 Linux 또는 Windows VM을 배포하여 이 아티클의 작업을 완료합니다. 이 아티클에 있는 예제는 myVM이라는 VM과 myVMVMNic이라는 네트워크 인터페이스를 대상으로 합니다. VM 및 네트워크 인터페이스는 myResourceGroup이라는 리소스 그룹에 있고, 미국 동부 영역에 있습니다. 문제를 진단하는 VM에 대해 단계의 값을 적절하게 변경합니다.
Azure Portal을 사용하여 진단
Azure Portal 맨 위에 있는 검색 상자에 VM의 이름을 입력합니다. 검색 결과에 VM의 이름이 나타나면 선택합니다.
왼쪽 창에서 네트워킹 을 펼치세요. 네트워크 설정을 선택하세요. 다음 그림에서는 VM의 네트워크 인터페이스에 대한 네트워크 보안 그룹 설정을 보여 줍니다.
앞서 나온 그림에 나오는 규칙들은 vm-1445라는 네트워크 인터페이스에 대한 것입니다. 네트워크 인터페이스에 대해 두 개의 다른 네트워크 보안 그룹에서 인 바운드 포트 규칙 이 존재하는 것을 알 수 있습니다:
- nsg-subnet: 네트워크 인터페이스가 속한 서브넷과 연결됩니다.
- nsg-nic: VM의 네트워크 인터페이스인 vm-1445와 연관되어 있습니다.
DenyAllInBound라는 규칙은 시나리오에 설명된 대로 인터넷에서 포트 80을 통해 VM으로 들어오는 인바운드 통신을 차단하고 있는 규칙입니다. 규칙은 SOURCE에 대해 인터넷을 포함하는 0.0.0.0/0을 나열합니다. 더 높은 우선 순위(낮은 숫자)가 있는 다른 규칙은 포트 80 인바운드를 허용하지 않습니다. 인터넷에서 VM에 대한 포트 80 인바운드를 허용하려면 문제 해결을 참조하세요. 보안 규칙 및 Azure에서 적용하는 방법에 대해 자세히 알아보려면 네트워크 보안 그룹을 참조하세요.
사진 하단에는 아웃바운드 포트 규칙도 보입니다. 네트워크 인터페이스에 대한 아웃바운드 포트 규칙이 나열됩니다.
그림에는 각 NSG에 대한 4개의 인바운드 규칙만 표시되지만 NSG에는 4개 이상의 규칙이 있을 수 있습니다. 사진에서 VirtualNetwork가 Source와 Destination 아래에 있고, AzureLoadBalancer가 SOURCE 아래에 있습니다. VirtualNetwork 및 AzureLoadBalancer는 서비스 태그입니다. 서비스 태그는 보안 규칙 생성에 대한 복잡성을 최소화할 수 있는 IP 주소 접두사의 그룹을 나타냅니다.
효과적인 보안 규칙을 보려면 가상 머신의 네트워크 설정에서 인터페이스를 선택합니다. 계속하기 전에 VM이 실행 중 상태인지 확인합니다.
네트워크 인터페이스 설정에서 도움말을 확장한 후, 유효한 보안 규칙을 선택합니다.
다음 예시는 유효 보안 규칙이 선택된 예시 네트워크 인터페이스 vm-1445를 보여줍니다.
나열된 규칙은 3단계에서 표시된 것과 동일하지만 네트워크 인터페이스와 서브넷에 연결된 NSG에 대해 서로 다른 탭이 있습니다. 그림에서 볼 수 있듯이 처음 50개의 규칙만 표시됩니다. 모든 규칙을 포함하는 .csv 파일을 다운로드하려면 다운로드를 선택합니다.
이전 단계에서는 vm-1445라는 네트워크 인터페이스의 보안 규칙을 보여주었습니다. VM에 두 개의 네트워크 인터페이스가 있는 경우 어떻게 해야 할까요? 이 예제의 VM에는 두 개의 연결된 네트워크 인터페이스가 있습니다. 적용되는 보안 규칙은 각 네트워크 인터페이스에 따라 다를 수 있습니다.
vm-nic-2 네트워크 인터페이스의 규칙을 보려면 해당 네트워크 인터페이스를 선택하세요. 다음 예시에서 보듯, 네트워크 인터페이스는 동일한 서브넷에 속하기 때문에 vm-1445 네트워크 인터페이스와 동일한 규칙을 가집니다. 서브넷에 NSG를 연결하면 해당 규칙이 서브넷의 모든 네트워크 인터페이스에 적용됩니다.
vm-1445 네트워크 인터페이스와 다르게, vm-nic-2 네트워크 인터페이스에는 네트워크 보안 그룹이 연결되어 있지 않습니다. 각 네트워크 인터페이스와 서브넷은 0개 또는 하나의 연결된 NSG를 가질 수 있습니다. 각 네트워크 인터페이스 또는 서브넷에 연결된 NSG는 동일하거나 다를 수 있습니다. 동일한 네트워크 보안 그룹을 원하는 수만큼의 네트워크 인터페이스 및 서브넷에 연결할 수 있습니다.
VM을 통해 유효한 보안 규칙을 볼 수 있지만, 개별 사용자를 통해서도 유효한 보안 규칙을 볼 수 있습니다.
- 네트워크 인터페이스: 네트워크 인터페이스를 보는 방법을 알아봅니다.
- NSG: NSG를 보는 방법을 알아봅니다.
PowerShell을 사용하여 진단
참고
Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Az로 마이그레이션을 참조하세요.
Azure Cloud Shell 뒤에 오는 명령을 실행하거나 또는 컴퓨터에서 PowerShell을 실행합니다. Azure Cloud Shell은 무료 대화형 셸입니다. 공용 Azure 도구가 사전 설치되어 계정에서 사용하도록 구성되어 있습니다. 컴퓨터에서 PowerShell을 실행하는 경우 Azure PowerShell 모듈 버전 1.0.0 이상이 필요합니다. 컴퓨터에서 Get-Module -ListAvailable Az을 실행하여 설치된 버전을 확인하세요. 업그레이드해야 하는 경우 Azure PowerShell 모듈 설치를 참조하세요. PowerShell을 로컬에서 실행하는 경우, 필요한 권한이 있는 계정으로 Azure에 로그인하려면 Connect-AzAccount을(를) 실행해야 합니다.
Get-AzEffectiveNetworkSecurityGroup을 사용하여 네트워크 인터페이스에 대한 효과적인 보안 규칙을 가져옵니다. 다음 예시는 test-rg라는 리소스 그룹에 속한 vm-nic이라는 네트워크 인터페이스의 유효 보안 규칙을 제공합니다:
$Params = @{
NetworkInterfaceName = "vm-nic"
ResourceGroupName = "test-rg"
}
Get-AzEffectiveNetworkSecurityGroup @Params
출력은 json 형식으로 반환됩니다. 출력을 이해하려면 명령 출력 해석을 참조하세요. 출력은 NSG가 네트워크 인터페이스, 네트워크 인터페이스가 있는 서브넷 또는 둘 다와 연결된 경우에만 반환됩니다. VM은 실행 상태에 있어야 합니다. VM에는 여러 NSG가 적용된 여러 네트워크 인터페이스가 있을 수 있습니다. 문제를 해결할 때 각 네트워크 인터페이스에 대해 해당 명령을 실행합니다.
연결 문제가 계속된다면 더 많은 진단 과 고려사항을 참고하세요.
VM 이름만 알고 있는 경우 다음 명령을 사용하여 VM에 연결된 모든 네트워크 인터페이스 ID를 나열합니다.
$Params = @{
Name = "vm-1"
ResourceGroupName = "test-rg"
}
$VM = Get-AzVM @Params
$VM.NetworkProfile
다음 예제와 유사한 출력이 표시됩니다.
NetworkInterfaces
-----------------
{/subscriptions/<ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-nic
이전 출력에서 네트워크 인터페이스 이름은 vm-nic입니다.
Azure CLI를 사용하여 진단
Azure CLI 명령을 사용하여 이 문서의 작업을 완료하는 경우 Azure Cloud Shell에서 명령을 실행하거나 컴퓨터에서 Azure CLI를 실행하세요. 이 아티클에서는 Azure CLI 버전 2.0.32 이상이 필요합니다. 설치되어 있는 버전을 확인하려면 az --version을 실행합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요. Azure CLI를 로컬로 실행 중인 경우 az login을 실행하고 필요한 권한을 가진 계정으로 Azure에 로그인해야 합니다.
az network nic list-effective-nsg를 사용하여 네트워크 인터페이스에 대한 효과적인 보안 규칙을 가져옵니다. 다음 예시에서는 test-rg라는 리소스 그룹에 속한 vm-nic라는 네트워크 인터페이스에 대한 유효한 보안 규칙을 가져옵니다.
az network nic list-effective-nsg \
--name vm-nic \
--resource-group test-rg
출력은 json 형식으로 반환됩니다. 출력을 이해하려면 명령 출력 해석을 참조하세요. 출력은 NSG가 네트워크 인터페이스, 네트워크 인터페이스가 있는 서브넷 또는 둘 다와 연결된 경우에만 반환됩니다. VM은 실행 상태에 있어야 합니다. VM에는 여러 NSG가 적용된 여러 네트워크 인터페이스가 있을 수 있습니다. 문제를 해결할 때 각 네트워크 인터페이스에 대해 해당 명령을 실행합니다.
연결 문제가 계속된다면 추가 진단과 고려사항을 참고하세요.
VM 이름만 알고 있는 경우 다음 명령을 사용하여 VM에 연결된 모든 네트워크 인터페이스 ID를 나열합니다.
az vm show \
--name vm-1 \
--resource-group test-rg
반환된 출력 내에 다음 예제와 비슷한 정보가 나타납니다.
"networkProfile": {
"additionalProperties": {},
"networkInterfaces": [
{
"additionalProperties": {},
"id": "/subscriptions/<ID>/resourceGroups/test-rg/providers/Microsoft.Network/networkInterfaces/vm-nic",
"primary": true,
"resourceGroup": "test-rg"
},
이전 출력에서 네트워크 인터페이스 이름은 vm-nic입니다
명령 출력 해석
문제를 진단하는 데 PowerShell 또는 Azure CLI를 사용했는지 여부에 관계 없이 다음 정보를 포함하는 출력을 받습니다.
- NetworkSecurityGroup: 네트워크 보안 그룹의 ID입니다.
- 연관성: 네트워크 보안 그룹이 NetworkInterface 또는 Subnet에 연결되어 있는지를 나타냅니다. 명령을 실행하기 직전에 NSG의 연결 상태가 변경되면 출력이 업데이트를 반영할 때까지 몇 초 정도 기다립니다.
- EffectiveSecurityRules: 각 속성의 설명은 보안 규칙 만들기에 자세히 설명되어 있습니다. defaultSecurityRules/가 앞에 추가된 규칙 이름은 모든 NSG에 존재하는 기본 보안 규칙입니다. securityRules/로 시작하는 규칙 이름은 사용자가 만든 규칙입니다. 서비스 태그(예: Internet, VirtualNetwork, AzureLoadBalancer)를 destinationAddressPrefix 또는 sourceAddressPrefix 속성에 지정하는 규칙에는 expandedDestinationAddressPrefix 속성의 값도 있습니다. expandedDestinationAddressPrefix 속성은 서비스 태그로 표시되는 모든 주소 접두사를 나열합니다.
NSG가 네트워크 인터페이스와 서브넷 모두에 연결되면 출력에 중복 규칙이 표시됩니다. 기본 규칙과 NSG 간에 공유되는 사용자 지정 규칙으로 인해 이러한 중복이 발생합니다.
defaultSecurityRules/DenyAllInBound라는 규칙은 시나리오에 설명된 대로 인터넷에서 포트 80을 통해 VM에 대한 인바운드 통신을 방지하는 규칙입니다. 더 높은 우선 순위(낮은 숫자)를 가진 다른 규칙 중 인터넷에서 포트 80 인바운드를 허용하는 규칙이 없습니다.
문제 해결하기
Azure 시나리오에서 설명된 문제를 Azure 포털, PowerShell 또는 Azure CLI를 사용하여 진단할 수 있습니다. 해결 방법은 다음 속성을 사용하여 네트워크 보안 규칙을 만드는 것입니다.
| 속성 | 값 |
|---|---|
| 원본 | 임의 |
| 소스 포트 범위 | 임의 |
| 대상 | VM의 IP 주소, IP 주소의 범위 또는 서브넷에 있는 모든 주소입니다. |
| 대상 포트 범위 | 80 |
| 프로토콜 | TCP |
| 작업 | 허용 |
| 우선순위 | 100 |
| 이름 | Allow-HTTP-All |
규칙 생성 후, 포트 80은 기본 DenyAllInBound 규칙보다 우선순위가 높아 인터넷으로부터의 인바운드 트래픽이 허용됩니다. NSG가 네트워크 인터페이스와 서브넷 모두에 연결된 경우 두 NSG에서 동일한 규칙을 만듭니다. 보안 규칙을 만드는 방법을 알아봅니다.
RPC/DCOM이 필요한 Windows 관리 시나리오
Windows 관리 계측(WMI)과 분산 컴포넌트 객체 모델(DCOM)은 원격 프로시저 호출(RPC)을 사용합니다. 클라이언트는 먼저 TCP 포트 135를 통해 RPC 엔드포인트 매퍼에 연결합니다. 엔드포인트 매핑은 클라이언트를 동적으로 할당된 TCP 포트로 안내합니다. 현재 Windows 기본값에서 동적 TCP 범위는 49152-65535입니다. 규칙을 만들기 전에 대상 Windows VM에서 설정된 범위를 확인하세요. 호스트가 맞춤형 범위를 사용한다면, 49152-65535를 가정하지 말고 확인된 해당 범위를 사용하세요.
대상 VM의 서브넷 또는 네트워크 인터페이스와 연관된 각 NSG마다 두 개의 인바운드 허용 규칙을 모두 생성합니다. 승인된 관리 네트워크, 호스트 또는 서비스로 <management-source-prefix>을(를) 교체하고, 대상 VM, NIC 또는 서브넷 대상으로 <target-vm-nic-or-subnet-prefix>을(를) 교체하세요.
<priority-rpc-dynamic> 및 <priority-rpc-endpoint-mapper>를 100에서 4096 사이의 서로 다른 미사용 정수 우선순위로 바꾸세요. 두 규칙 모두 TCP 135 전용 테스트가 성공할 수 있지만 이후 동적 RPC 연결이 차단될 수 있기 때문에 필요합니다.
이 WMI/DCOM 흐름에 대한 자세한 내용은 Azure Virtual Network에서 트래픽을 차단하는 NSG 오구성 문제 해결을 참조하세요. Windows 포트 및 RPC 세부 사항은 서비스 개요 및 네트워크 포트 요구사항, 원격 WMI 연결 문제 해결, 방화벽에서 RPC 동적 포트 사용을 참조하세요.
az network nsg rule create \
--resource-group <resource-group> \
--nsg-name <nsg-name> \
--name Allow-RpcEndpointMapper \
--priority <priority-rpc-endpoint-mapper> \
--source-address-prefixes <management-source-prefix> \
--source-port-ranges '*' \
--destination-address-prefixes <target-vm-nic-or-subnet-prefix> \
--destination-port-ranges 135 \
--access Allow \
--protocol Tcp \
--direction Inbound
az network nsg rule create \
--resource-group <resource-group> \
--nsg-name <nsg-name> \
--name Allow-RpcDynamic \
--priority <priority-rpc-dynamic> \
--source-address-prefixes <management-source-prefix> \
--source-port-ranges '*' \
--destination-address-prefixes <target-vm-nic-or-subnet-prefix> \
--destination-port-ranges 49152-65535 \
--access Allow \
--protocol Tcp \
--direction Inbound
동적 규칙에서 49152-65535 값은 기본값일 뿐입니다. 대상 Windows VM에서 사용자 지정 범위를 확인한 경우 해당 규칙에서 범위를 바꿉니다.
$managementSourcePrefix = "<management-source-prefix>"
$targetDestinationPrefix = "<target-vm-nic-or-subnet-prefix>"
$rpcEndpointMapperPriority = 300
$rpcDynamicPriority = 310
$networkSecurityGroup = Get-AzNetworkSecurityGroup `
-Name "<nsg-name>" `
-ResourceGroupName "<resource-group>"
Add-AzNetworkSecurityRuleConfig `
-Name "Allow-RpcEndpointMapper" `
-Description "Allow RPC Endpoint Mapper from approved management source" `
-NetworkSecurityGroup $networkSecurityGroup `
-Access Allow `
-Protocol Tcp `
-Direction Inbound `
-Priority $rpcEndpointMapperPriority `
-SourceAddressPrefix $managementSourcePrefix `
-SourcePortRange "*" `
-DestinationAddressPrefix $targetDestinationPrefix `
-DestinationPortRange "135"
Add-AzNetworkSecurityRuleConfig `
-Name "Allow-RpcDynamic" `
-Description "Allow RPC dynamic ports from approved management source" `
-NetworkSecurityGroup $networkSecurityGroup `
-Access Allow `
-Protocol Tcp `
-Direction Inbound `
-Priority $rpcDynamicPriority `
-SourceAddressPrefix $managementSourcePrefix `
-SourcePortRange "*" `
-DestinationAddressPrefix $targetDestinationPrefix `
-DestinationPortRange "49152-65535"
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $networkSecurityGroup
Azure 인바운드 트래픽을 처리할 때 서브넷에 연결된 NSG의 규칙을 처리한 다음(연결된 NSG가 있는 경우) 네트워크 인터페이스에 연결된 NSG의 규칙을 처리합니다. 네트워크 인터페이스 및 서브넷에 연결된 NSG가 있는 경우 트래픽이 VM에 도달하려면 포트가 두 NSG 모두에서 열려 있어야 합니다. 관리 및 통신 문제를 완화하려면 개별 네트워크 인터페이스가 아닌 서브넷에 NSG를 연결하는 것이 좋습니다. 서브넷 내의 가상 머신(VM)에 서로 다른 보안 규칙이 필요한 경우, 네트워크 인터페이스를 애플리케이션 보안 그룹(ASG)의 멤버로 만들고 보안 규칙의 소스 및 대상으로 ASG를 지정할 수 있습니다. 애플리케이션 보안 그룹에 대해 자세히 알아봅니다.
의사 소통에 여전히 문제가 있다면, 고려 사항 및 추가 진단 부분을 참조하세요.
고려 사항
연결 문제 해결 시 다음 사항을 고려하세요.
기본 보안 규칙은 인터넷의 인바운드 액세스를 차단하고, 가상 네트워크의 인바운드 트래픽만 허용합니다. 인터넷에서 들어오는 트래픽을 허용하려면 기본 규칙보다 우선순위가 높은 보안 규칙을 추가하세요. 기본 보안 규칙에 대해 자세히 알아보거나 보안 규칙을 추가하는 방법을 알아보세요.
피어드 가상 네트워크의 경우, 기본적으로 VIRTUAL_NETWORK 서비스 태그가 자동으로 피어드 가상 네트워크에 대한 접두사를 포함하도록 확장됩니다. 가상 네트워크 피어링과 관련된 문제를 해결하기 위해 ExpandedAddressPrefix 목록에서 접두사를 볼 수 있습니다. 가상 네트워크 피어링 및 서비스 태그에 대해 자세히 알아봅니다.
Azure NSG가 VM의 네트워크 인터페이스 또는 서브넷과 연결된 경우에만 네트워크 인터페이스에 대한 효과적인 보안 규칙을 표시합니다. 또한 VM은 실행 중 상태여야 합니다.
네트워크 인터페이스나 서브넷에 관련 NSG가 없으면, VM이 공인 IP 주소를 가질 때 모든 포트는 인바운드 및 아웃바운드 접근을 위해 열려 있습니다. 이 구성을 사용하면 어디서나 무제한으로 액세스할 수 있습니다. VM을 보호하려면 공용 IP 주소가 있는 경우 네트워크 인터페이스를 호스팅하는 서브넷에 NSG를 적용합니다.
추가 진단
- 트래픽이 VM으로 또는 VM에서 허용되는지를 확인하기 위해 빠른 테스트를 실행하려면 Azure Network Watcher의 IP 흐름 확인 기능을 사용합니다. IP 흐름 확인은 사용자에게 트래픽이 허용되거나 거부되는지를 알려줍니다. IP 흐름 검증을 통해 트래픽이 거부될 경우, 어떤 보안 규칙이 해당 트래픽을 차단하는지 알 수 있습니다.
- VM의 네트워크 연결이 실패하는 보안 규칙이 없으면 다음으로 인해 문제가 발생할 수 있습니다.
- VM의 운영 체제 내에서 방화벽 소프트웨어가 실행되고 있습니다.
- 가상 어플라이언스 또는 온프레미스 트래픽에 대해 구성된 경로. 강제 터널링을 통해 인터넷 트래픽이 온-프레미스 네트워크로 리디렉션될 수 있습니다. 가상 어플라이언스 또는 온-프레미스로 인터넷 트래픽을 강제로 터널하는 경우 인터넷에서 VM에 연결하지 못할 수 있습니다. VM에서 트래픽 흐름을 방해할 수 있는 경로 문제를 진단하는 방법을 알아보려면 가상 머신 네트워크 트래픽 라우팅 문제 진단을 참조하세요.
다음 단계
- 네트워크 보안 그룹 및 보안 규칙에 대한 모든 작업, 속성 및 설정에 대해 알아봅니다.
- VM에 대한 기본 보안 규칙, 서비스 태그 및 Azure에서 인바운드 및 아웃바운드 트래픽에 대한 보안 규칙을 처리하는 방법에 대해 알아봅니다.