구성 문제 해결
이 가이드는 Cloud NAT의 일반적인 문제 해결을 위한 도움을 제공합니다.
일반적인 문제
VM이 Cloud NAT 없이 예기치 않게 인터넷에 연결할 수 있습니다
가상 머신(VM) 인스턴스 또는 컨테이너 인스턴스가 Cloud NAT 없이 인터넷에 연결할 수 있지만 이를 원하지 않는 경우 다음 문제를 확인합니다.
VM의 네트워크 인터페이스에 외부 IP 주소가 있는지 확인합니다. 네트워크 인터페이스에 외부 IP 주소가 할당되어 있는 경우 Google Cloud는 해당 소스가 인터페이스의 기본 내부 IP 주소와 일치하는 패킷에 대해 일대일 NAT를 자동으로 수행합니다. 자세한 내용은 Cloud NAT 사양을 참조하세요.
VM에 외부 IP 주소가 있는지 확인하려면 외부 IP 주소를 기존 인스턴스에 변경 또는 할당을 참조하세요.
Google Kubernetes Engine(GKE) 클러스터가 비공개 클러스터인지 확인합니다. 비공개가 아닌 클러스터의 각 노드 VM에는 외부 IP 주소가 있으므로 각 노드는 다음 홉이 Cloud NAT에 의존하지 않으며 기본 인터넷 게이트웨이인 Virtual Private Cloud(VPC) 네트워크의 경로를 사용할 수 있습니다. 비공개가 아닌 클러스터가 Cloud NAT 게이트웨이와 상호작용하는 방법을 포함한 자세한 내용은 Compute Engine 상호작용을 참조하세요.
Virtual Private Cloud 네트워크의 경로를 나열하여 기본 인터넷 게이트웨이와 다른 다음 홉을 통해 인터넷 연결을 제공할 수 있는 경로를 찾습니다. 예를 들면 다음과 같습니다.
VPC 네트워크의 다른 커스텀 경로는 다음 홉이 기본 인터넷 게이트웨이인 경로보다 우선순위가 높을 수 있습니다. Google Cloud가 경로를 평가하는 방법에 대한 자세한 내용은 라우팅 적용 여부 및 순서를 참조하세요.
생성된 로그 없음
- NAT 로깅이 사용 설정되었는지 확인합니다.
로그 뷰에 원하는 로그가 필터링되어 제외되지 않았는지 다시 확인하세요. 안내는 로그 보기를 참조하세요.
방화벽 규칙이 트래픽을 차단하지 않는지 확인합니다. 이그레스(아웃바운드) 트래픽을 차단하는 방화벽 규칙은 트래픽이 NAT 게이트웨이에 전송되기 전에 적용됩니다. 방화벽 규칙 로깅을 사용하여 커스텀 이그레스 규칙이 아웃바운드 트래픽을 차단하는지 확인할 수 있습니다.
Cloud NAT 유형을 검토합니다. 트래픽 대상이 NAT에서 처리되지 않을 수 있습니다.
특정 로그가 제외됨
NAT 로깅이 사용 설정되어 있는지 확인하고 로그 필터가 보관할 로그를 제외하지 않는지 확인합니다. 어떤 항목도 제외되지 않도록 로그 필터를 삭제할 수 있습니다.
Cloud NAT는 모든 단일 이벤트를 로깅하지 않습니다. 이그레스 트래픽이 많은 기간 동안 NAT 로깅은 VM 머신 유형에 비례해서 제한됩니다. 변환 또는 오류 로그가 삭제될 수 있으며 제한 중 생략된 항목을 확인하는 것이 가능하지 않습니다.
리소스 없음 이유로 패킷이 삭제됨
Cloud NAT를 사용하는 VM에서 패킷 손실이 발생하는 경우 패킷 손실(포트 소모) 시점에 VM에 사용할 수 있는 NAT 소스 IP 주소와 소스 포트 튜플이 부족하기 때문일 수 있습니다. 5-튜플(NAT 소스 IP 주소, 소스 포트, 대상 3-튜플)은 TCP TIME_WAIT 제한 시간 내에 재사용할 수 없습니다.
사용 가능한 NAT 튜플이 부족하면 dropped_sent_packets_count
이유는 OUT_OF_RESOURCES
입니다. 측정항목에 대한 자세한 내용은 VM 인스턴스 측정항목 사용을 참조하세요.
포트 사용량을 줄이는 방법은 포트 사용량 줄이기를 참조하세요.
동적 포트 할당을 사용하는 경우 동적 포트 할당이 사용될 때 패킷 손실을 줄이는 방법은 다음 섹션을 참조하세요.
동적 포트 할당이 구성된 경우 패킷 손실
VM이 포트 부족에 가까워지면 동적 포트 할당이 이를 감지하여 VM에 할당되는 포트 수를 두 배로 늘립니다. 이렇게 하면 포트 낭비를 막는 데 도움이 될 수 있지만 할당된 포트 수가 늘어날 때 패킷 손실이 발생할 수 있습니다.
손실되는 패킷 수를 줄이려면 다음을 고려하세요.
연결을 더 느리게 확대할 수 있으면 Cloud NAT에서 추가 포트 할당할 시간을 더 늘릴 수 있습니다.
VM이 TCP 연결을 수행할 경우
tcp_syn_retries
에 더 큰 값을 사용해서 VM을 구성할 수 있습니다. 이렇게 하면 시스템이 연결을 설정하는 데 더 많은 시간을 할애하고 연결이 성공할 가능성이 높아집니다.예를 들어 Linux VM의 경우 현재 설정을 볼 수 있습니다.
sysctl net.ipv4.tcp_syn_retries
필요한 경우 설정을 늘릴 수 있습니다.
sudo sysctl -w net.ipv4.tcp_syn_retries=NUM
워크로드가 갑자기 증가하고 추가 포트를 빠르게 할당해야 할 경우에는 VM당 최소 포트 수를 조정해야 할 수 있습니다. 포트 사용량을 확인하고 VM당로 적합한 최소 포트 수를 결정합니다.
엔드포인트 독립 충돌로 인해 패킷이 삭제됨
Public NAT를 사용하는 VM에서 패킷 손실이 발생하고 엔드포인트 독립 매핑이 사용 설정된 경우 엔드포인트 독립 충돌에 의해 패킷이 손실될 수 있습니다. 이러한 경우 dropped_sent_packets_count
이유는 ENDPOINT_INDEPENDENT_CONFLICT
입니다. 측정항목에 대한 자세한 내용은 VM 인스턴스 측정항목 사용을 참조하세요.
다음 기법을 사용하여 엔드포인트 독립 충돌이 발생할 가능성을 줄일 수 있습니다.
엔드포인트 독립 매핑 사용 중지 이렇게 하면 지정된 소스 IP 주소와 포트의 새 연결이 이전에 사용된 것과 다른 NAT 소스 IP 주소 및 포트를 사용할 수 있습니다. 엔드포인트 독립 매핑을 사용 중지하거나 사용 설정할 때 설정된 연결이 중단되지 않습니다.
포트 예약 절차에서 각 클라이언트 VM에 더 많은 NAT 소스 IP와 소스 포트 튜플을 할당할 수 있도록 VM 인스턴스당 최소 기본 NAT 포트 수를 늘립니다. 이렇게 하면 클라이언트 IP 주소와 임시 소스 포트 튜플 2개 이상에 동일한 NAT 소스 IP 주소와 소스 포트 튜플이 할당될 가능성이 줄어듭니다.
사용 중인 임시 소스 포트 수를 확인합니다.
Linux VM의 경우:
netstat -an | egrep 'ESTABLISHED|TIME_WAIT|CLOSE_WAIT' | wc -l
Windows VM의 경우:
netstat -tan | findstr "ESTABLISHED TIME_WAIT CLOSE_WAIT" | find /c /v ""
더 큰 임시 소스 포트 집합을 사용하도록 VM 인스턴스를 구성합니다.
Linux VM의 경우:
다음 명령어를 사용하여 구성된 포트 범위를 볼 수 있습니다.
cat /proc/sys/net/ipv4/ip_local_port_range
다음 명령어를 사용하여
ip_local_port_range
를 최대 임시 소스 포트 수(64,512)로 설정할 수 있습니다.echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
Windows VM의 경우:
다음 명령어로 구성된 포트 범위를 볼 수 있습니다.
netsh int ipv4 show dynamicport tcp netsh int ipv4 show dynamicport udp
다음 명령어를 사용하여 임시 소스 TCP 및 UDP 포트 수를 최댓값(64,512)으로 설정할 수 있습니다.
netsh int ipv4 set dynamicport tcp start=1024 num=64512 netsh int ipv4 set dynamicport udp start=1024 num=64512
Google Kubernetes Engine 노드에서 권한이 있는
DaemonSet
를 사용하여 이 구성을 자동화할 수 있습니다.
GKE 클러스터의 경우 관심 대상으로 전송된 패킷에 대해 각 노드에서 수행되는 소스 NAT를 중지합니다. 두 가지 방법 중 하나로 이를 수행할 수 있습니다.
ip-masq-agent
를 배포하고 관심 대상을nonMasqueradeCIDRs
목록에 추가합니다.클러스터를 만들 때
--disable-default-snat
플래그를 사용하여 기본 비매스커레이드 대상의 SNAT를 사용 중지합니다.
중단된 수신 패킷
Cloud NAT 게이트웨이는 활성 연결 세부정보와 IP 주소 및 포트 매핑(VM IP 주소와 포트가 NAT IP 주소 및 포트로 변환되는 방식)을 저장하기 위해 연결 추적 테이블을 유지보수합니다. 연결 추적 테이블에 연결 항목이 포함되어 있지 않으면 Cloud NAT 게이트웨이가 인그레스 데이터 패킷을 삭제합니다.
테이블에 연결 항목이 없는 이유는 다음과 같습니다.
- 비활성으로 인해 TCP 설정 연결 유휴 제한 시간이 만료되어 설정된 TCP 연결 시간이 초과되었습니다.
- 외부 엔드포인트가 TCP 임시 연결 유휴 제한 시간이 만료되기 전에 새 연결을 설정하지 못했습니다. 예를 들어 Google Cloud 리소스가
TCP SYN
으로 연결을 시작하지만 외부 엔드포인트가SYN ACK
로 응답하지 않습니다. - 프로버와 같은 외부 엔드포인트가 NAT IP 주소 및 포트에 연결하려고 시도합니다. Cloud NAT는 요청하지 않은 인바운드 연결을 허용하지 않습니다. 이러한 유형의 연결 항목은 연결 테이블에 표시되지 않습니다. 따라서 수신된 패킷은 모두 삭제됩니다.
- NAT 연결이 아직 활성 상태인 동안 게이트웨이에서 NAT IP를 삭제하는 경우 NAT 매핑이 무효화되고 이러한 연결은 즉시 연결 추적 테이블에서 삭제되어 모든 반환 트래픽이 삭제됩니다.
인그레스 패킷 손실을 해결하기 전에 손실이 실제로 애플리케이션에 영향을 주는지 확인합니다. 확인하려면 삭제된 인그레스 패킷이 급증할 때마다 애플리케이션에서 오류를 확인합니다.
인그레스 패킷 손실이 애플리케이션에 영향을 미치는 경우 다음 기법을 사용하여 문제를 해결해 보세요.
- 장기 실행 연결이 더 오랫동안 열린 상태로 유지될 수 있도록 애플리케이션에서 연결 유지 메커니즘을 사용합니다.
- Cloud NAT 게이트웨이를 통해 (Google Cloud 리소스에서 시작된) 트래픽을 수신하는 외부 엔드포인트가 응답하고 연결을 설정하는 데 더 많은 시간을 확보할 수 있도록 TCP 임시 연결 유휴 제한 시간의 값을 늘립니다.
- 기본값을 크게 줄인 경우 TCP 설정 연결 유휴 제한 시간 값을 늘립니다.
더 많은 IP 주소 할당 필요
일부 경우에는 NAT IP 주소가 부족하여 VM이 인터넷에 연결하지 못할 수 있습니다. 이 문제는 여러 요인에 따라 발생할 수 있습니다. 자세한 내용은 다음 표를 참조하세요.
근본 원인 | 증상 | 솔루션 |
---|---|---|
주소를 수동으로 할당했지만 현재 포트 사용량에 비해 할당한 주소가 충분하지 않습니다. |
|
다음 중 하나를 수행합니다.
|
NAT IP 주소에 대한 엄격한 한도를 초과했습니다. |
|
|
IP 주소 수 부족으로 인한 오류를 모니터링하려면 nat_allocation_failed
측정항목에 대한 알림을 만듭니다. Google Cloud가 NAT 게이트웨이의 VM에 대해 IP 주소를 충분하게 할당할 수 없으면 이 측정항목이 true
로 설정됩니다. 알림 정책에 대한 자세한 내용은 알림 정책 정의를 참조하세요.
포트 사용량 줄이기
NAT IP 주소를 더 할당하는 방법이 불가능하거나 바람직하지 않은 경우 각 VM이 사용하는 포트 수를 최소화할 수 있습니다.
포트 사용량을 줄이려면 다음 단계를 완료합니다.
엔드포인트 독립 매핑을 중지합니다.
동적 포트 할당을 사용 설정합니다. 동적 포트 할당을 사용하려면 VM당 최소 포트 수와 VM당 최대 포트 수를 설정합니다. Cloud NAT는 최소 및 최대 포트 수 사이에 여러 NAT 소스 IP 주소와 소스 포트 튜플을 자동으로 할당합니다. 최소 포트 수에 작은 숫자를 사용하면 활성 연결이 더 적은 VM에서 NAT 소스 IP 주소와 소스 포트 튜플이 낭비됩니다. 포트 할당 중에 연결 제한 시간이 발생하면 동적 포트 할당으로 패킷 손실 감소를 참조하세요.
필요에 맞으면서 가급적 낮은 최소 포트 수를 판단합니다. 여러 가지 방식이 있으며, 대부분의 경우 의사 결정 과정에서 사용된 포트 수(
compute.googleapis.com/nat/port_usage
)를 참고합니다. 포트 사용량을 찾는 방법은 포트 사용량 보기를 참조하세요. 다음은 최소 포트 수를 판단하는 방식의 두 가지 예시입니다.- 대표적인 기간 동안 대표적인 VM 개수에 대한
compute.googleapis.com/nat/port_usage
의 평균값을 고려합니다. - 대표적인 기간 동안 대표적인 VM 개수에 대한
compute.googleapis.com/nat/port_usage
의 최빈값을 고려합니다.
- 대표적인 기간 동안 대표적인 VM 개수에 대한
필요에 맞으면서 가급적 낮은 최대 포트 수를 판단합니다. 이번에도 의사 결정 과정에서
compute.googleapis.com/nat/port_usage
를 참고합니다. 대표적인 기간 동안 대표적인 VM 개수에 대한compute.googleapis.com/nat/port_usage
의 최댓값을 출발점으로 참고하여 최대 포트 수를 판단합니다. 최대 개수를 너무 높게 설정하면 다른 VM이 NAT 소스 IP 주소와 소스 포트 튜플을 수신하지 못할 수 있다는 점에 주의하세요.적절한 최소 및 최대 포트 수를 찾으려면 반복 테스트를 수행해야 합니다. 최소 및 최대 포트 수를 변경하는 단계는 동적 포트 할당이 구성되었을 때 최소 또는 최대 포트 변경을 참조하세요.
NAT 제한 시간, 그 의미, 기본값을 검토합니다. 같은 대상 3-튜플에 대한 일련의 TCP 연결을 신속하게 만들어야 하는 경우 Cloud NAT에서 NAT 소스 IP 주소와 소스 포트 튜플을 더욱 빠르게 재사용할 수 있도록 TCP 시간 대기를 줄이는 것이 좋습니다. 이렇게 하면 Cloud NAT는 전송 중인 각 VM에 추가 NAT 소스 IP 주소와 소스 포트 튜플을 할당해야 할 수 있는 고유한 5-튜플을 사용할 필요 없이 동일한 5-튜플을 더욱 빠르게 사용할 수 있습니다. NAT 제한 시간을 변경하는 단계는 NAT 제한 시간 변경을 참조하세요.
자주 묻는 질문(FAQ)
클라우드 NAT에 대한 리전 제한 사항
두 개 이상의 리전에서 동일한 Cloud NAT 게이트웨이를 사용할 수 있나요?
아니요. Cloud NAT 게이트웨이를 리전 두 개 이상, VPC 네트워크 또는 Cloud Router와 연결할 수 없습니다.
다른 리전 또는 VPC 네트워크에 연결해야 하는 경우 연결을 위한 추가 Cloud NAT 게이트웨이를 만듭니다.
외부 NAT IP 주소가 Cloud NAT 게이트웨이에서 전역적으로 사용되나요? 아니면 리전별로 사용되나요?
Cloud NAT 게이트웨이는 리전별 외부 IP 주소를 NAT IP 주소로 사용합니다. 리전별이지만 공개적으로 라우팅할 수 있습니다. NAT IP 주소를 할당하거나 지정하는 방법에 대한 자세한 내용은 NAT IP 주소를 참조하세요.
Cloud NAT를 사용 가능 또는 불가능한 경우
외부 IP 주소가 있는 GKE 노드 VM을 포함하여 인스턴스에 Cloud NAT가 적용되나요?
일반적으로는 아닙니다. VM의 네트워크 인터페이스에 외부 IP 주소가 있는 경우 Google Cloud는 Cloud NAT를 사용하지 않고 네트워크 인터페이스의 기본 내부 IP 주소에서 전송된 패킷에 대해 항상 일대일 NAT를 수행합니다. 그러나 Cloud NAT는 여전히 동일한 네트워크 인터페이스의 별칭 IP 주소 범위에서 전송된 패킷에 NAT 서비스를 제공할 수 있습니다. 자세한 내용은 Cloud NAT 사양 및 Compute Engine 상호작용을 참조하세요.
Public NAT를 사용하면 네트워크 인터페이스에 외부 IP 주소가 없는 소스 VM이 소스와 대상이 동일한 VPC 네트워크에 있더라도 외부 IP 주소가 있는 대상 VM 또는 부하 분산기에 트래픽을 전송할 수 있나요?
예. 네트워크 경로에는 기본 인터넷 게이트웨이를 통해 VPC 네트워크에서 외부로 트래픽을 전송한 다음 동일한 네트워크에서 이를 수신하는 과정이 포함됩니다.
소스 VM이 패킷을 대상으로 전송하면 Public NAT는 패킷을 두 번째 인스턴스로 전달하기 전에 소스 NAT(SNAT)를 수행합니다. Public NAT는 두 번째 인스턴스에서 첫 번째 인스턴스로의 응답에 대해 대상 NAT(DNAT)를 수행합니다. 단계별 예시는 기본 Public NAT 구성 및 워크플로를 참조하세요.
동일한 VPC 네트워크에서 VM 간 통신에 Private NAT를 사용할 수 있나요?
아니요, Private NAT는 동일한 VPC 네트워크의 VM 간 트래픽에서 NAT를 수행하지 않습니다.
원치 않는 수신 연결 지원 안 됨
Cloud NAT는 외부 IP 주소가 없는 인스턴스에 대한 인바운드 연결(예: SSH)을 허용하나요?
아니요. Cloud NAT는 원치 않는 수신 연결을 지원하지 않습니다.
자세한 내용은 Cloud NAT 사양을 참조하세요.
그러나 대상 IP 주소가 하나 이상의 VM 인스턴스에 대한 활성 포트 매핑이 있는 Cloud NAT 게이트웨이 외부 IP 주소인 경우 Google Cloud의 네트워크 에지가 핑에 응답할 수 있습니다. Cloud NAT 게이트웨이에 할당된 IP 주소를 보려면 gcloud compute routers get-nat-ip-info 명령어를 사용합니다.
IN_USE
로 표시된 외부 IP 주소가 핑에 응답할 수 있습니다.
외부 IP 주소가 없는 VM에 연결해야 할 경우 내부 전용 VM에 대해 연결 옵션 선택을 참조하세요. 예를 들어 Cloud NAT 예시 Compute Engine 설정의 일부로 IAP(Identity-Aware Proxy)를 사용하여 외부 IP 주소 없이 VM에 연결합니다.
Cloud NAT 및 포트
VM에 포트 수가 고정(기본적으로 64
)되어 있는 이유는 무엇인가요?
Cloud NAT 게이트웨이가 VM에 대해 NAT를 제공하는 경우 포트 예약 절차에 따라 소스 주소 및 소스 포트 튜플을 예약합니다.
자세한 내용은 포트 예약 예시를 참조하세요.
VM에 예약된 최소 포트 수를 변경할 수 있나요?
예. 새 Cloud NAT 게이트웨이를 만들거나 나중에 편집하여 VM 당 최소 포트 수를 늘리거나 줄일 수 있습니다. 각 Cloud NAT 게이트웨이는 포트 예약 절차에 따라 소스 주소와 소스 포트 튜플을 예약합니다.
최소 포트 수를 줄이는 방법에 대한 자세한 정보는 다음 질문을 참조하세요.
Cloud NAT 게이트웨이를 만든 후 VM당 최소 포트 수를 줄일 수 있나요?
예. 그러나 최소 포트 수를 줄이면 포트 예약 절차에서 VM당 더 적은 수의 포트를 예약하게 될 수 있습니다. 이 경우 기존 TCP 연결이 재설정될 수 있으며, 재설정되는 경우 연결을 다시 수립해야 합니다.
NAT 매핑을 기본 및 보조 범위에서 기본 범위로만 전환할 때 각 인스턴스에 할당된 추가 포트가 즉시 해제되나요?
아니요. 보조 범위에서 사용하는 추가 포트는 VM당 최소 포트 설정이 줄어들 때까지 인스턴스에 보관됩니다. Cloud NAT가 서브넷의 보조(별칭) 범위를 매핑하도록 구성된 경우 Cloud NAT는 포트 예약 절차에 따라 인스턴스당 최소 1,024개의 포트를 할당합니다.
기본 범위로만 전환하면 Cloud NAT는 이미 할당된 포트가 있는 인스턴스에 할당된 추가 포트를 보존합니다. Cloud NAT가 기본에만 적용되는 범위를 변경한 후 해당 인스턴스에 할당된 실제 포트 수는 VM당 최소 포트 설정도 줄어들기 전까지 변경되지 않습니다.
이러한 인스턴스에 할당된 포트의 양을 줄이려면 기본 범위로 전환한 후 VM당 최소 포트 설정을 줄여야 합니다. 이 값을 줄이면 Cloud NAT가 인스턴스당 할당된 포트 수를 자동으로 조정하여 포트 소비를 줄입니다.
Cloud NAT 및 기타 Google 서비스
Cloud NAT를 사용하면 Google API 및 서비스에 액세스할 수 있나요?
Cloud NAT를 서브넷의 기본 IP 범위로 사용 설정하면 Google Cloud에서 자동으로 비공개 Google 액세스를 사용 설정합니다. 자세한 내용은 비공개 Google 액세스 상호작용을 참조하세요.