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 점검 순서
실무에서는 다음 순서대로 점검하는 것이 좋습니다.
- 오류 로그 확인
- Ephemeral Port 범위 확인
- TIME_WAIT 개수 확인
- TCP 연결 상태 확인
- IP 주소 확인
- 포트 사용 현황 확인
- 네트워크 인터페이스 확인
- Socket Leak 확인
- sysctl 설정 확인
- 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 Address | Address Already in Use |
|---|---|---|
| 오류 코드 | EADDRNOTAVAIL | EADDRINUSE |
| 원인 | 사용할 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 점검을 함께 수행하면 안정적인 네트워크 환경을 유지할 수 있습니다.