외부 서버와 연동을 통해 특정 기능을 개발하기 위해서 내부망(폐쇄망) 환경에서 외부 공개망에 위치한 서버와 API 통신을 시도해야 하는 경우가 자주 있다. 이 과정속에서 겪게 되는 네트워크 문제는 개발하면서 흔하게 마주하는 문제 중 하나이다. 이럴때는 통신 과정중 어떤 단계에서 문제가 생겼는지 원인을 파악하여 문제를 해결해야 한다. 최근에도 비슷한 문제를 겪게 되어 어떤 순서와 근거로 원인을 특정하였는지 기록해 보기로 하였다.
서버 구조
이번 글에서 예시로 들 서버 구조는 대략 다음과 같다.
Internet
|
----------------------------------------------------------------
|
+-----------------+
| Firewall |
+-----------------+
|
+-----------------+
| DNS Server |
+-----------------+
|
+-----------------+
| Proxy |
| Server |
+-----------------+
|
+------------+-----------+--------------+------------+
| | | |
+--------------+ +--------------+ +--------------+ +--------------+
| Application | | Application | | Application | | Application |
| Server | | Server | | Server | | Server |
+--------------+ +--------------+ +--------------+ +--------------+
| | | |
+------------+-----------+--------------+------------+
|
+-----------------------------------+
| |
+--------------+ +--------------+
| Database | | Database |
| Server | | Server |
+--------------+ +--------------+
그림의 최상단에 있는 Internet은 외부 인터넷 망을 나타낸 것이고 그 아래에 Firewall부터는 내부망 환경을 대략적으로 나타낸 것이다. 이렇게 내부망과 외부망이 분리된 환경의 경우 서로간의 통신을 관리하기 위해 방화벽은 다음과 같은 역할을 수행한다.
- 인터넷 접근 제어: 내부 네트워크의 사용자들이 외부 인터넷에 접근할 수 있는지 여부를 결정한다. 예를 들어, 특정 사용자 그룹에 대한 인터넷 접근을 차단하거나 허용할 수 있다.
- 웹 필터링: 내부 네트워크의 사용자들이 특정한 웹 사이트에 접속하는 것을 제한하거나 차단할 수 있다. 예를 들어, 악성 웹 사이트, 성인 콘텐츠, 게임 사이트 등을 차단할 수 있다.
- 애플리케이션 제어: 특정한 애플리케이션 또는 프로토콜의 사용을 제한하거나 허용할 수 있다.
- 외부에서의 접근 제어: 외부에서 내부 네트워크의 시스템에 접근하는 것을 제한하거나 허용할 수 있다. 예를 들어, 특정한 포트나 프로토콜을 사용하는 외부에서의 접근을 차단할 수 있다.
- VPN 접속 관리: 외부에서 내부 네트워크로의 VPN(Virtual Private Network) 접속을 관리하고 보안을 강화할 수 있다.
- 포트 포워딩 및 NAT(Network Address Translation): 내부 네트워크에 있는 서비스를 외부에서 접근할 수 있도록 포트 포워딩이나 NAT를 설정할 수 있다. 이를 통해 내부 서버에 접근하는 외부 사용자들을 관리할 수 있다.
문제 상황 및 진단
웹 서버에서 API 호출을 시도하는 로직을 작성하였다. 이 요청에서 지속적으로 실패가(타임아웃) 발생했고, 그에 대한 원인을 파악해야하는 상황이 되었다. 그러기 위해서는 내부망 서버에서 보낸 요청이 어떤 과정을 통하여 전달되는지를 알아야 한다. 각 단계에서 발생할 수 있는 문제를 이해하는 것이 문제의 원인을 파악할 때 가장 중요하기 때문이다. 내부망 인프라 구조에 따라 다음과 같은 과정에서 문제가 발생할 수 있다.
1. 어플리케이션 서버 단에서 발생할 수 있는 문제
- 어플리케이션 코드 오류:
- URL 입력 오타: https://www.example.com/ 대신 https://www.example.com 입력과 같은 오타
- API 호출 매개변수 오류: param1 값 누락 또는 잘못된 형식 사용
- 네트워크 연결 코드 오류: 잘못된 IP 주소 또는 포트 사용
- 데이터 인코딩/디코딩 오류: 문자열 인코딩 방식 오류로 인한 데이터 깨짐
- 예외 처리 미흡: 예상치 못한 오류 발생 시 통신 중단
- 프록시 서버 설정값 오류:
- 프록시 주소 오타
- 포트 오타
- 사용자 인증 정보 오류: 사용자 이름 또는 비밀번호 오류, 인증 방식 오류
- 프로토콜 설정 오류: HTTP/HTTPS 프로토콜 설정 누락 또는 오류
- 연결 시간 제한 오류: 응답 대기 시간 초과로 인한 통신 중단
2. 프록시 서버 단에서 발생할 수 있는 문제
- 프록시 서버 과부하:
- 동시 접속자 수 증가: 급증하는 접속으로 인해 프록시 서버 과부하 (서버 성능 저하)
- 서버 성능 저하: 오래된 하드웨어 사용, 부족한 메모리, 과도한 CPU 사용
- 캐시 용량 부족: 자주 사용하는 데이터 캐싱 공간 부족으로 인한 처리 속도 저하
- 프록시 서버 설정 오류:
- 허용 주소 오류: www.example.com 도메인 접근 허용 설정 누락 (특정 사이트 접근 불가)
- 프로토콜 설정 오류: HTTPS 프로토콜 접근 차단으로 인해 외부 API 호출 불가능
- 인증 방식 오류: 기본 인증 방식만 지원, 클라이언트 인증서 문제
- 캐싱 설정 오류: 캐싱 정책 오류로 인해 불필요한 데이터 처리
3. DNS 서버 단에서 발생할 수 있는 문제
- DNS 서버 오류:
- DNS 캐시 문제: 오래된 캐시 정보로 인해 외부 서버 IP 주소 오류 (잘못된 서버 연결)
- 도메인 이름 해석 오류: 잘못된 도메인 이름 입력, DNS 레코드 오류 (서버 찾을 수 없음)
- DNS 서버 과부하: 동시 요청 증가로 인해 DNS 서버 응답 지연
- DNS 서버 설정 오류: 포워딩 설정 오류, 권한 설정 오류
4. 방화벽 에서 발생할 수 있는 문제
- IP 주소 차단:
- 내부망 IP 주소 차단으로 인해 외부망 접근 불가능 (외부 서비스 이용 불가)
- 특정 국가/지역 IP 차단으로 인해 해외 서버 접근 차단 (지역 제한 발생)
- 특정 IP 주소 범위 차단으로 인해 접근 불가능
- 특정 포트 차단:
- 8080 포트 차단으로 인한 HTTP 통신 불가능 (웹 서버 접근 불가)
- 22 포트 차단으로 인해 SSH 연결 불가능
- 443 포트 차단으로 인해 HTTPS 통신 불가능 (보안 프로토콜 사용 불가)
- 방향 설정 오류:
- 들어오는 연결만 허용으로 인해 외부망 서버와의 통신 불가능 (서버 간 데이터 주고받기 불가)
- 나가는 연결만 허용으로 인해 외부 사이트 접근 불가능 (인터넷 사용 불가)
- 프로토콜 차단:
- ICMP 프로토콜 차단으로 인해 네트워크 연결 확인 불가능 (핑 통신 불가)
- UDP 프로토콜 차단으로 인해 특정 애플리케이션 통신 불가능 (게임, VoIP 등)
- 방화벽 규칙 오류:
- 잘못된 포트 범위 설정, IP 주소 오타, 규칙 우선순위 오류
- 규칙 누락으로 인해 필요한 통신 차단
- 중복된 규칙으로 인해 불필요한 처리가 발생하여 네트워크 성능 저하
5. 외부 서버 문제 에서 발생할 수 있는 문제
- 서버 다운:
- 서버 유지 보수 또는 장애로 인해 서버 접근 불가능
- 외부 서버 과부하로 인해 서비스 지연 또는 중단
- 네트워크 문제:
- 외부망 네트워크 문제로 인해 서버 연결 불가능 (인터넷 연결 문제)
- 서버 연결 문제로 인해 데이터 전송 지연 또는 중단 (통신 불안정)
- 서비스 중단:
- 외부 서비스 업체의 서비스 중단으로 인해 API 호출 불가능 (필요한 기능 사용 불가)
- 서비스 업데이트로 인해 일시적인 서비스 중단 (사용 불편 발생)
- 호환성 문제:
- 서버 버전 또는 프로토콜 버전 불일치로 인해 통신 문제 발생 (연결 불안정)
- 데이터 형식 불일치로 인해 데이터 처리 오류 발생
문제 원인 파악 및 해결
내가 겪은 문제는 다음과 같았다.
- API 호출 시 Time-out 발생: 외부 서버와의 통신을 시도할 때, API 호출이 타임아웃(time-out)으로 실패하였다. 이는 요청이 제대로 처리되지 않고 설정된 시간 내에 응답을 받지 못했음을 의미한다.
- DNS 조회 실패: 문제 해결을 위해, DNS 서버에 위치한 프록시를 통해 dig -d '요청할 도메인' 명령을 실행하여 도메인의 IP 주소 조회를 시도하였다. 그러나 이 과정에서 해당 도메인에 대한 IP 주소를 제대로 찾지 못했다. 이는 DNS 서버가 요청한 도메인의 정보를 올바르게 해석하거나 반환하지 못했다고 결론을 내렸다.
위의 상황으로 보았을 때 DNS 서버와의 통신 문제를 겪고 있으며, 이는 방화벽 정책에 의해 발생한 것으로 판단했다.
이러한 문제는 방화벽 정책에 의한 접근 제한 또는 DNS 서버 설정 문제로 인해 발생할 수 있다. 이를 근거로 네트워크 담당자에게 방화벽 로그 확인 및 정책 확인을 요청하고, 나는 다른 도메인에 대한 조회를 시도하여 DNS 서버의 일반 작동 상태를 확인하였다.
방화벽 정책을 검토한 네트워크 담당자는 내가 요청한 도메인으로의 접근을 허용하도록 조치를 취해주었다. DNS 서버의 설정을 확인하고, 필요한 경우 업데이트하여 올바른 도메인 정보를 반환하도록 조치하였을 것이라고 예상된다. 이러한 조치 후 어플리케이션 서버에서 API 호출은 성공적으로 이루어짐을 확인하였고 문제가 해결되었다.
글 상단에서도 말하였듯이 통신 과정중 어떤 단계에서 문제가 생겼는지를 파악한다면 앞으로도 문제 해결을 원활히 할 수 있을 것으로 기대한다.
'서버 개발' 카테고리의 다른 글
레이스 컨디션 (Race Condition) -02. Pessimistic Lock, Optimistick Lock (0) | 2024.04.10 |
---|---|
CURL로 외부 서버와 통신 테스트(+ 겪을 수 있는 에러로그) (0) | 2024.03.25 |
확장 가능한 시스템 설계 예시 (0) | 2023.10.22 |
단일 서버와 사용자 요청 처리 (1) | 2023.10.15 |
서버 개발 고민 (1) | 2023.10.15 |