본문 바로가기
Issue/Cloud

[GCP] Compute engine Squid 패키지 오류

by chickenman 2024. 1. 14.
Exception error:cannot skip chunk CRLF#012 exception location: Tokenizer.cc(141)skipRequired#012

1. 현상

현재 운영중인 시스템은 외부 시스템과의 연동이 필요했다. 각 서버의 보안을 위해서 서로의 특정 IP만을 허용해주는 것으로 설정되어 있었다. 

우리 시스템은 App engien에 올라가 있는데 App engine의 IP는 주기적인 시간마다 & 새로운 인스턴스 기동 시 바뀌기 때문에 고정된 IP 할당이 필요했고, 그에 따라 Compute Engine 서비스를 사용했다. (왜 Load Balancer를 사용하지 않은지 의문..)

외부 시스템 연동에 성공하고 운영중 갑자기 해당 시스템으로 받는 트래픽의 Body값이 빈값으로 우리 시스템에 수신되는 오류 현상이 포착됐다.

문제가 발생했던 통신의 Content-type은 text/event-stream으로 chunked 된 데이터를 지속적으로 수신받는 방식이다.

 

2. 원인

Compute engine에서는 App engine으로부터 받은 트래픽을 외부로 전송시켜줄 수 있는 서비스가 기동중인데, 그것이 바로 문제의 원인이었던 Squid였다. Squid에서는 외부 시스템으로부터 응답을 받을 때마다 제일 위에서 게시한 오류 메세지를 Compute engine 로그에 출력하고 있었다. 

시스템의 Compute Engine에 설치된 OS 버전은 Debain Gnu/Linux 10, Squid 버전은 4.6-1+deb10u7 이었다. 해당 Squid 버전은 Compute Engine의 OS 탭에서 취약점으로 지속으로 보고되고 있었다. 

 

3. 해결

이 문제를 해결하기 위해서 취약점이 발생하지 않던 Squid 버전으로 업그레이드를 진행했고 Squid를 재실행한 결과 문제를 해결할 수 있었다. 아래의 방식은 내가 문제를 해결했던 방식이다. ( 디렉토리는 각자의 환경 설정에 따라 다를 수 있다.)

방법

  1. Compute Engine의 console 창에 진입

  2. “sudo apt list —all-version | grep squid” → debain os에서 설치 가능한 모든 squid 버전 확인

  3. “sudo apt-get install squid=버전명” 입력 → squid의 원하는 버전에 대한 패키지 설치

  4. /etc/squid 디렉토리로 이동 후 squid.conf에 기존과 동일하게 설정 저장

  5. /usr/sbin 디렉토리로 이동 후 “sudo ./service squid stop & sudo ./service squid start”를 통해 재기동

  6. “ps -e | grep squid” / “sudo ./service squid status” → squid 서비스가 정상적으로 기동중인지 확인

(사진이 없는 것은 양해를 구한다..)

 

4. 공부하게 된 점

- 시스템 서버에서 발생하지 않는 문제를 파악할 때 통신 과정 로그를 하나씩 따라가보면서 문제 발생 지점을 찾는 것이 핵심

  Ex) 시스템 -(okay)→ Compute Engine -(okay)→ 외부 시스템 -(okay)→ Compute Engie -(error)→ 시스템

- 프로그램 개발 시 디버깅을 위해서라도 로그를 적시적소에 배치하는 것이 중요!