문제 상황
Oracle Cloud Infrastructure(OCI) 프리티어 인스턴스에서 Node.js 기반 API 서버를 실행하고 있었고, 내부에서는 정상적으로 localhost:3000 또는 10.0.0.x:3000 접근이 가능했지만 외부에서는 퍼블릭IP:3000 접속이 되지 않는 문제가 있었습니다.
접속 불가 현상 예시
curl http://[퍼블릭IP]:3000
curl: (7) Failed to connect to [퍼블릭IP] port 3000: Couldn't connect to server
점검한 사항들
- 보안 목록(Security List): 3000번 포트 인바운드 TCP 허용
- UFW: 3000/tcp 포트 허용
- iptables: ACCEPT 규칙 등록
- Node.js Listen 상태:
0.0.0.0:3000으로 정상 리스닝 - 경로 테이블:
0.0.0.0/0 → 인터넷 게이트웨이정상 설정
최종 원인 및 해결 방법
- 기존 퍼블릭 IP가 VNIC에 연결되어 있음에도 불구하고 실제 라우팅이 되지 않음
- OCI 콘솔에서 해당 퍼블릭 IP를 해제하고, 새 퍼블릭 IP를 생성 및 연결
- Node.js 애플리케이션이 의도치 않게 중단되어 있었음 (PM2로 재시작)
- 포트 리스닝 상태를 다시 확인한 후
0.0.0.0:3000으로 떠 있는지 재확인
최종 테스트 결과
curl http://[신규 퍼블릭 IP]:3000/api-docs
→ Swagger UI 정상 출력 확인
추가 팁
- Node.js listen host: 반드시
'0.0.0.0'으로 설정 - PM2 확인:
pm2 list/pm2 restart [앱이름] - VNIC 퍼블릭 IP 연결 후
curl http://169.254.169.254/opc/v1/vnics/명령으로 상태 확인
결론
OCI 프리티어에서 외부 포트 접속이 되지 않는 문제는 네트워크 설정뿐만 아니라 퍼블릭 IP의 실제 연결 상태 및 애플리케이션의 리스닝 상태에 따라 발생할 수 있습니다. 위 사례처럼 퍼블릭 IP를 새로 연결하고 Node.js 앱을 재기동하는 것으로 외부 접속이 가능해졌으며, Swagger 문서 페이지도 외부에서 정상 확인되었습니다.
IP 재할당 전에 좁혀 볼 진단 순서
| 단계 | 확인 | 다음 판단 |
|---|---|---|
| 1. 프로세스 | pm2 list 또는 systemctl status | 애플리케이션이 실행 중인지 |
| 2. 리스닝 | ss -lntp 및 localhost 응답 | 포트와 바인딩 주소가 맞는지 |
| 3. OS 방화벽 | 현재 규칙과 적용 순서 | 허용 규칙 앞에서 거절되지 않는지 |
| 4. OCI 네트워크 | VNIC의 NSG·서브넷 보안 목록·경로 | 대상 CIDR과 포트 및 인터넷 경로 |
| 5. 외부 재검사 | 다른 네트워크에서 실제 URL 요청 | 내부 성공/외부 실패 구분 |
이 사례에서는 IP 재연결과 프로세스 재시작을 함께 했으므로 어떤 조치가 단독 원인이었는지 분리한 결과는 없습니다. 퍼블릭 IP 교체를 일반 해결책으로 먼저 적용하면 주소·DNS·접속 허용 목록이 바뀔 수 있습니다. 현재 연결과 방화벽을 확인한 뒤 필요한 변경만 적용하세요. OCI 보안 목록/NSG와 OS 방화벽은 각각 확인해야 합니다. Oracle 보안 목록 설명.
이어서 확인할 문제 해결 글
OCI 접속 문제 해결 뒤 systemd 기반 서비스 배포에는 오라클 클라우드(OCI) 우분투에 Spring Boot 배포 및 systemd 서비스 등록 방법 글을 함께 참고하세요.