주메뉴 바로가기 본문 바로가기

알림

콘솔 이동 시 로그인이 필요합니다.

로그인하시겠습니까?

아니요

닫기

주문 불가 알림

주문권한이 없습니다.

콘솔에 접근할 수 없는 계정입니다.

확인

닫기

알림

신용카드 등록이 필요합니다.

신용카드 등록 페이지로 이동하시겠습니까?

아니요

닫기
C&C Tech
img

Azure App Service 사용 꿀팁 시리즈1 - Outbound IP 제한과 sNAT 포트 고갈 해결 방안

img 배정환
| 2024.02.09
  • AppService
  • WebApp
  • sNAT
  • NATGateway
  • VNetIntegration
  • OutboundIP
  • Azure
  • Cloud

Azure App Service의 Outbound IP의 제한 사항들과 sNAT의 포트 고갈 이슈를 설명하고 해결하는 방법에 대해 설명합니다.

Azure App Service는 클라우드 상에서 애플리케이션을 효율적으로 배포하고 관리할 수 있는 강력한 플랫폼입니다. 그러나 이를 사용할 때는 몇 가지 중요한 제한 사항과 이슈를 염두에 두어야 합니다. 이번 포스팅에서는 Azure App Service의 Outbound IP 제한 사항 및 sNAT 포트 고갈 문제와 그 해결 방법에 대해 자세히 설명드리겠습니다.

Outbound IP의 제한

Azure App Service는 멀티 테넌트 환경에서 동작합니다. 이는 물리적 또는 가상 머신(VM)처럼 특정 사용자가 전용으로 자원을 사용하는 것이 아니라 여러 사용자가 자원을 공유하는 방식입니다. 이러한 공유형 특성으로 인해 App Service의 Inbound IPOutbound IP가 동적으로 변경될 수 있습니다. 특히 Outbound IP의 경우, 외부 시스템과의 연동을 고려할 때 주의가 필요합니다. 예를 들어, 데이터베이스(DB), 스토리지, 또는 타사 서비스와 통신을 할 때는 App Service에서 나가는 트래픽의 IP를 허용해줘야 하는데, 이때 제공되는 IP가 여러 개일 수 있어 모든 IP를 허용해야 하는 불편함이 발생할 수 있습니다.

Inbound IP의 경우 SSL 바인딩 또는 Application Gateway와 함께 사용하는 경우가 많아 문제가 발생하는 빈도는 적습니다. 하지만 Outbound IP의 경우는 자주 문제가 됩니다. Outbound 트래픽이 발생할 때 여러 IP 중 하나가 임의로 선택되어 외부로 나가게 되며, 이를 수신하는 시스템에서는 이러한 다양한 IP를 모두 허용해야 하는 번거로움이 있습니다.

(Azure App Service Outbound IP 예시)

이를 해결하기 위해 NAT Gateway를 구성하면 Outbound IP를 고정된 하나의 IP 또는 특정 IP 대역으로 설정할 수 있습니다. 이로 인해 외부 서비스에서 App Service의 IP를 예측 가능하게 허용할 수 있어 안정적인 연결이 가능합니다. 자세한 설정 방법에 대해서는 뒷 부분에서 설명합니다.

sNAT 포트 고갈 문제

Azure App Service는 기본적으로 한 IP와 포트 조합당 128개의 연결로 제한됩니다. 이때 외부 서비스와의 다수의 연결이 필요한 웹 애플리케이션에서는 사용자가 증가함에 따라 동일한 IP, 포트 조합으로 인해 연결 제한에 도달하게 되고, 이는 성능 저하, 500 에러 또는 타임아웃 등의 문제를 야기할 수 있습니다.



이 문제를 해결하기 위해 NAT Gateway를 사용할 수 있습니다. NAT Gateway는 64,000개의 Outbound sNAT 포트를 제공하여, 이로 인해 포트 고갈 문제를 크게 완화할 수 있습니다. 그러나 이 방법은 완벽한 해결책이 아니며, 근본적인 문제 해결을 위해서는 애플리케이션 소스 코드 튜닝이 필요합니다.

소스 코드 튜닝 팁

개발자 입장에서는 클라이언트 객체를 사용해 원격 리소스를 호출하고 이를 닫는 것이 일반적인 코드 작성 방식입니다. 하지만 HttpClient 같은 객체는 새로 생성하고 닫는 대신, 재사용하는 것이 성능을 최적화하는 중요한 방법입니다. Azure App Service의 기본 Windows 설정은 TIME_WAIT 상태에서 연결을 4분 동안 유지하는데, 이로 인해 재사용 가능한 연결이 누수될 수 있습니다. 따라서 같은 HttpClient 객체를 재사용하는 방식으로 문제를 해결할 수 있습니다.

NAT Gateway 설정을 통한 Outbound IP 제한 문제 해결

NAT Gateway 구성을 통해 Outbound IP 문제를 어떻게 해결할 수 있는지 간단히 살펴보겠습니다. 



우선 간단하게 구성된 시나리오를 보면 NAT Gateway가 구성되어 있지 않은 App Service와, NAT Gateway가 구성된 App Service가 있습니다.
두 App Service 모두 백엔드 서비스인 VM으로 HTTP GET을 요청하는 앱이 돌고 있고, 현재 NAT Gateway가 구성되지 않은 웹앱의 Outbound IP는 아래와 같이 4개 중에 임의적으로 사용이 되고,


NAT Gateway가 구성된 웹앱은 NAT Gateway에 할당한 Static IP를 통해서만 Outbound 트래픽이 발생하게 되어 있습니다.


NAT Gateway를 설정하기 위해서는 App Service를 Virtual Network에 Integration을 시켜주어야 합니다.
VNet Integration은 App Service의 네트워킹 설정 항목의 VNet 통합 메뉴에서 설정할 수 있습니다.



그리고 NAT Gateway의 IP가 아래와 같이 설정된 것을 볼 수 있습니다.



그럼 NAT Gateway가 구성이 되지 않은 App Service와 NAT Gateway가 구성된 App Service에서 Backend App으로 HTTP GET을 여러번 요청한 후 결과를 살펴보겠습니다.

먼저, NAT Gateway가 구성되지 않은 App Service 앱에서 Backend App으로 HTTP GET을 여러번 요청한 결과 아래와 같은 App Service의 Outbound IP들을 확인해 볼 수 있습니다.



위에서 명시한 4개의 Outbound IP 중 임의적으로 선택되어 요청이 된 것을 볼 수 있습니다.

이제 NAT Gateway를 구성한 App Service에서 HTTP GET을 요청한 결과를 Backend App의 IIS로그에서 살펴보겠습니다.



결과를 살펴보면 NAT Gateway를 구성하지 않은 App Service와는 다르게 NAT Gateway의 IP로만 요청이 들어온 것을 살펴볼 수 있습니다.

결론

이렇게 Azure App Service를 사용하는 경우 NAT Gateway를 활용하면 Outbound IP를 특정 IP(또는 대역)로 설정하고, sNAT 포트 고갈에 대한 이슈를 해결할 수 있습니다.

참고링크

https://docs.microsoft.com/ko-kr/azure/app-service/troubleshoot-intermittent-outbound-connection-errors?WT.mc_id=IoT-MVP-5002068
https://azure.github.io/AppService/2020/11/15/web-app-nat-gateway.html
img
배정환 | Cloud Consulting Team

Microsoft MVP로 활동중이며, SK C&C에서 Azure/GCP 클라우드 컨설팅을 담당하고 있습니다.