피드로 돌아가기
GeekNewsDevOps
원문 읽기
curl 없는 컨테이너에서 Bash /dev/tcp로 HTTP 요청 보내기
Bash /dev/tcp 기반 TCP 소켓 직접 제어를 통한 zero-dependency 네트워크 진단
AI 요약
Context
최소화된 컨테이너 이미지 내 curl, wget 등 외부 HTTP 클라이언트 도구 부재로 인한 서비스 연결성 확인 제약 발생. 패키지 추가 설치가 불가능한 제한적 환경에서 내부 서비스의 /health 엔드포인트 접근 가능 여부를 판단해야 하는 상황.
Technical Solution
- Bash 내장 기능인 /dev/tcp 리다이렉션을 활용하여 파일 시스템 경로가 아닌 가상 TCP 소켓 생성
exec 3<>/dev/tcp/host/port구문을 통해 특정 파일 디스크립터(3번)에 읽기/쓰기가 가능한 TCP 연결 할당- HTTP/1.1 프로토콜 규격에 맞는 요청 문자열(Method, Host, Connection 헤더)을
printf로 직접 전송 Connection: close헤더 명시를 통해 서버 측 연결 종료를 유도하고cat <&3로 응답 바디를 수신하는 구조 설계- TLS 및 Chunked Encoding 처리 기능이 없는 Raw TCP 통신 방식으로 단순 연결성 및 Plain HTTP 응답 확인에 집중
실천 포인트
- 컨테이너 이미지 내 네트워크 도구 부재 시 `bash -c` 명령어로 /dev/tcp 접근 가능 여부 확인 - HTTP/
1.1 요청 시 서버의 Keep-Alive로 인한 셸 블로킹을 방지하기 위해 `Connection: close` 헤더 필수 적용 - 무한 대기 방지를 위해 `timeout` 명령어로 전체 실행 프로세스에 타임아웃 설정 권장 - HTTPS 통신 필요 시 `/dev/tcp` 대신 `openssl s_client` 도구 활용 검토