Linux Cannot Assign Requested Address 오류의 원인과 해결 방법

Linux 서버를 운영하다 보면 웹 서버, API 서버, Java 애플리케이션, Docker, Kubernetes 환경에서 Cannot assign requested address, EADDRNOTAVAIL 오류가 발생하는 경우가 있습니다. 이 오류는 애플리케이션이 사용할 IP 주소나 포트를 운영체제가 할당할 수 없는 상황에서 발생하는 대표적인 네트워크 오류입니다.

특히 대량의 외부 API 호출, 프록시 서버, NAT 환경, Docker 컨테이너 환경에서는 일시적으로 수천 개의 연결이 생성되면서 자주 발생할 수 있습니다.

이번 글에서는 Cannot Assign Requested Address(EADDRNOTAVAIL)의 원인과 확인 방법, 해결 방법을 실무 중심으로 알아보겠습니다.

Cannot Assign Requested Address란?

애플리케이션이 새로운 TCP 연결을 생성할 때 Linux 커널은 다음 정보를 할당합니다.

  • 출발지 IP(Source IP)
  • 출발지 포트(Source Port)
  • 목적지 IP(Destination IP)
  • 목적지 포트(Destination Port)

하지만 사용할 수 있는 IP나 포트가 없으면 다음과 같은 오류가 발생합니다.

Cannot assign requested address

EADDRNOTAVAIL

즉, 커널이 새로운 네트워크 연결을 생성할 수 없는 상태입니다.

Cannot Assign Requested Address가 발생하는 주요 원인

대표적인 원인은 다음과 같습니다.

  • Ephemeral Port 고갈
  • TIME_WAIT 과다
  • 잘못된 Bind IP
  • 존재하지 않는 IP 사용
  • NAT 포트 부족
  • Docker 네트워크 충돌
  • Kubernetes Pod 네트워크 문제
  • 네트워크 인터페이스 비활성화
  • Socket Leak
  • 애플리케이션 버그

실무에서는 Ephemeral Port 부족이 가장 흔한 원인입니다.

1. 오류 로그 확인하기

먼저 애플리케이션 로그를 확인합니다.

Cannot assign requested address

EADDRNOTAVAIL

서비스 로그도 함께 확인합니다.

journalctl -u nginx

또는

journalctl -u tomcat

2. Ephemeral Port 범위 확인하기

현재 사용할 수 있는 임시 포트 범위를 확인합니다.

cat /proc/sys/net/ipv4/ip_local_port_range

예시

32768 60999

포트 범위가 좁으면 동시에 생성 가능한 연결 수가 줄어듭니다.

3. TIME_WAIT 개수 확인하기

TIME_WAIT가 과도하게 많으면 새로운 포트를 할당하지 못할 수 있습니다.

ss -ant | grep TIME-WAIT | wc -l

또는

netstat -ant | grep TIME_WAIT | wc -l

수만 개 이상 지속적으로 유지된다면 원인을 분석해야 합니다.

4. 현재 연결 개수 확인하기

TCP 연결 상태를 확인합니다.

ss -s

또는

ss -tan

ESTABLISHED, TIME_WAIT, CLOSE_WAIT 비율도 함께 확인합니다.

5. IP 주소 확인하기

현재 서버의 IP를 확인합니다.

ip addr

또는

hostname -I

프로그램이 존재하지 않는 IP에 Bind하고 있지는 않은지 확인합니다.

6. 포트 사용 현황 확인하기

현재 열린 포트를 확인합니다.

ss -tln

또는

lsof -iTCP

특정 포트가 이미 사용 중인지 확인합니다.

7. 네트워크 인터페이스 확인하기

인터페이스 상태를 확인합니다.

ip link

또는

ip addr show

인터페이스가 DOWN 상태라면 IP를 사용할 수 없습니다.

8. Socket Leak 확인하기

Socket이 계속 증가하는지 확인합니다.

lsof -p PID | grep socket

또는

ls /proc/PID/fd | wc -l

FD와 Socket이 계속 증가하면 Socket Leak을 의심해야 합니다.

9. sysctl 설정 확인하기

다음 항목을 확인합니다.

sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
sysctl net.ipv4.tcp_tw_reuse

환경에 따라 적절히 조정하면 포트 재사용 효율을 높일 수 있습니다.

10. Docker 및 Kubernetes 환경 확인하기

컨테이너 환경에서는 네트워크 충돌 여부도 확인해야 합니다.

Docker

docker network ls

Kubernetes

kubectl get pods -A -o wide

Overlay Network 또는 CNI 설정 오류가 없는지 확인합니다.

Cannot Assign Requested Address 점검 순서

실무에서는 다음 순서대로 점검하는 것이 좋습니다.

  1. 오류 로그 확인
  2. Ephemeral Port 범위 확인
  3. TIME_WAIT 개수 확인
  4. TCP 연결 상태 확인
  5. IP 주소 확인
  6. 포트 사용 현황 확인
  7. 네트워크 인터페이스 확인
  8. Socket Leak 확인
  9. sysctl 설정 확인
  10. Docker/Kubernetes 환경 확인

Cannot Assign Requested Address 사용 시 주의사항

다음 사항을 고려해야 합니다.

  • TIME_WAIT 증가 여부를 먼저 확인한다.
  • Ephemeral Port 범위를 적절히 설정한다.
  • 존재하지 않는 IP에 Bind하지 않는다.
  • Socket Leak 여부를 함께 분석한다.
  • Docker 및 Kubernetes 네트워크도 확인한다.
  • sysctl 설정은 서비스 환경에 맞게 적용한다.

단순히 포트 범위를 늘리는 것보다 왜 포트가 고갈되는지 원인을 찾는 것이 우선입니다.

Cannot Assign Requested Address와 Address Already in Use의 차이

항목Cannot Assign Requested AddressAddress Already in Use
오류 코드EADDRNOTAVAILEADDRINUSE
원인사용할 IP 또는 포트 부족이미 사용 중인 포트
주요 발생 시점connect()bind()
해결 방법포트 및 IP 관리포트 충돌 해결

두 오류 모두 네트워크 관련이지만 원인과 해결 방법은 다릅니다.

자주 묻는 질문

EADDRNOTAVAIL은 IP 문제인가요?

반드시 그렇지는 않습니다. 실제 운영 환경에서는 Ephemeral Port 고갈이나 TIME_WAIT 증가 때문에 발생하는 경우가 더 많습니다.

TIME_WAIT가 많으면 반드시 이 오류가 발생하나요?

아닙니다. TIME_WAIT가 많더라도 포트가 충분하면 문제가 없습니다. 하지만 포트가 모두 소진되면 Cannot Assign Requested Address 오류가 발생할 수 있습니다.

Docker에서도 자주 발생하나요?

네. NAT와 Overlay Network를 사용하는 Docker 및 Kubernetes 환경에서는 포트 고갈이나 네트워크 설정 문제로 인해 자주 발생할 수 있습니다.

마무리

Cannot Assign Requested Address(EADDRNOTAVAIL)는 Linux에서 새로운 네트워크 연결에 사용할 IP나 포트를 할당할 수 없을 때 발생하는 오류입니다. ss, ip, lsof, sysctl 등을 활용하면 원인을 빠르게 파악할 수 있으며, Ephemeral Port 관리, TIME_WAIT 분석, Socket Leak 점검을 함께 수행하면 안정적인 네트워크 환경을 유지할 수 있습니다.

댓글 남기기