홈 › 리눅스 운영 › 07 / 13

네트워크 진단 (ss·curl·firewalld)

섹션 7진행 0 / 13

3. 코드 예제

예제 1: 포트 열림과 상태 코드 — 01_net_check.sh 발췌

bash
(exec 3<>/dev/tcp/127.0.0.1/18080) 2>/dev/null && echo "열림" || echo "닫힘"
curl -s http://127.0.0.1:18080/api/orders
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18080/health
curl -sI http://127.0.0.1:18080/ | head -n 3
text
127.0.0.1:18080 열림
hello GET /api/orders
200
HTTP/1.1 200 OK
X-App: demo
Date: Thu, 10 Sep 2026 07:51:50 GMT

-I 는 HEAD 요청이라 본문 없이 헤더만 받습니다. 서버가 살아 있는지 가장 가볍게 보는 방법입니다.

예제 2: 실패를 종료 코드로 — 01_net_check.sh 발췌

bash
curl -sf http://127.0.0.1:18080/err > /dev/null; echo "500 -> $?"
curl -s --connect-timeout 2 http://127.0.0.1:1/;  echo "거부 -> $?"
curl -s -m 1 http://127.0.0.1:18080/slow;         echo "느림 -> $?"
text
500 -> 22
거부 -> 7
느림 -> 28

세 숫자만 기억하면 스크립트에서 원인별로 분기할 수 있습니다. 04 레슨의 헬스 체크 루프가 -sf 로 22 와 7 을 모두 실패로 잡는 이유입니다.

예제 3: 시간 분해와 -v — 01_net_check.sh 발췌

bash
curl -s -o /dev/null -w 'dns=%{time_namelookup} connect=%{time_connect} first=%{time_starttransfer} total=%{time_total}\n' http://127.0.0.1:18080/
curl -sv http://127.0.0.1:18080/ 2>&1 | grep -E '^(> |< )' | head -n 6
text
dns=0.000084 connect=0.007056 first=0.008420 total=0.008589
> GET / HTTP/1.1
> Host: 127.0.0.1:18080
> User-Agent: curl/8.14.1
> Accept: */*
>
< HTTP/1.1 200 OK

-v 로 요청 헤더를 보면 05 레슨의 프록시 헤더가 실제로 붙는지 확인할 수 있습니다. nginx 뒤에서 curl -v localhost:8080 을 치면 X-Forwarded-For 가 없는 것이 정상입니다.

예제 4: 방화벽 열기 — firewall.sh

bash
run firewall-cmd --zone="$ZONE" --add-port="$PORT/tcp" --permanent
run firewall-cmd --reload
run firewall-cmd --zone="$ZONE" --query-port="$PORT/tcp"
text
  [dry] firewall-cmd --zone=public --add-port=8080/tcp --permanent
  [dry] firewall-cmd --reload
  [dry] firewall-cmd --zone=public --query-port=8080/tcp

sudo bash firewall.sh open 8080 으로 실행하며 실행 환경이 없어 DRY_RUN=1 로 검증했습니다. 마지막 query-port 가 yes 를 출력하면 성공입니다.