개요
서버를 운영하면 네트워크 문제를 피할 수 없습니다. 서비스가 응답하지 않을 때 프로세스는 살아있는데 접속이 안 되면, 네트워크를 확인해야 합니다.
이 글은 DevOps 관점에서 자주 다시 보게 되는 네트워크 기본 개념을 정리합니다.
1. IP 주소와 서브넷
정리 보기
IP 주소란
IP (Internet Protocol) 주소는 네트워크에서 장치를 식별하는 고유 번호입니다.
- IPv4:
192.168.1.100(32비트, 약 43억 개) - IPv6:
2001:0db8:85a3::8a2e:0370:7334(128비트)
운영 환경에서는 아직 대부분 IPv4를 사용합니다.
공인 IP vs 사설 IP
공인 IP: 인터넷에서 직접 접근 가능 (ex: 54.180.12.34)
사설 IP: 내부 네트워크에서만 사용 (외부 접근 불가)사설 IP 대역:
10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8)
172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12)
192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16)AWS VPC, 사내망 등은 사설 IP를 사용하고, 외부 통신은 NAT Gateway나 공인 IP를 통합니다.
서브넷과 CIDR
서브넷은 큰 네트워크를 작은 단위로 나눈 것입니다. CIDR (Classless Inter-Domain Routing) 표기법으로 범위를 표현합니다.
192.168.1.0/24
└── 24비트가 네트워크 주소, 나머지 8비트가 호스트 주소
→ 호스트 수: 2^8 - 2 = 254개자주 쓰는 CIDR:
| CIDR | 호스트 수 | 용도 |
|---|---|---|
| /32 | 1개 | 특정 IP 하나 지정 |
| /28 | 14개 | 소규모 서브넷 |
| /24 | 254개 | 일반적인 서브넷 |
| /16 | 65,534개 | 대규모 VPC |
예시
VPC: 10.0.0.0/16 (전체 네트워크)
├── Public Subnet: 10.0.1.0/24 (웹 서버, 로드밸런서)
├── Private Subnet: 10.0.2.0/24 (앱 서버)
└── DB Subnet: 10.0.3.0/24 (데이터베이스)2. TCP vs UDP
정리 보기
TCP (Transmission Control Protocol)
- 연결 지향: 데이터 전송 전에 연결을 먼저 맺음 (3-way handshake)
- 신뢰성 보장: 패킷 순서 보장, 유실 시 재전송
- 느리지만 정확함
3-way handshake:
1. 클라이언트 → 서버: SYN
2. 서버 → 클라이언트: SYN + ACK
3. 클라이언트 → 서버: ACK
→ 연결 성립UDP (User Datagram Protocol)
- 비연결: 연결 없이 바로 전송
- 신뢰성 없음: 순서 보장 안 됨, 유실돼도 재전송 안 함
- 빠름
비교
| 항목 | TCP | UDP |
|---|---|---|
| 연결 | 있음 (3-way handshake) | 없음 |
| 신뢰성 | 순서 보장, 재전송 | 없음 |
| 속도 | 상대적으로 느림 | 빠름 |
| 용도 | HTTP, SSH, DB 연결 | DNS 조회, 스트리밍, 게임 |
참고
- 웹 서비스, API, DB: TCP
- DNS 쿼리: UDP (53번 포트)
- 모니터링 메트릭 전송 (StatsD): UDP
- 실시간 영상/음성: UDP
TCP와 UDP의 차이를 구분하고, 3-way handshake까지 설명할 수 있으면 충분합니다.
3. DNS 동작 원리
정리 보기
DNS란
DNS (Domain Name System)는 도메인 이름을 IP 주소로 변환하는 시스템입니다.
sckwon.dev → 104.21.32.5 (예시)DNS 조회 흐름
1. 브라우저 캐시 확인
2. OS 캐시 확인 (/etc/hosts)
3. DNS Resolver (ISP 또는 8.8.8.8)에 질의
4. Root DNS → TLD DNS (.dev) → 권한 DNS 서버 순으로 찾아감
5. IP 주소 반환 → 캐시에 저장 (TTL 동안)레코드 종류
| 레코드 | 용도 | 예시 |
|---|---|---|
| A | 도메인 → IPv4 | sckwon.dev → 104.21.32.5 |
| AAAA | 도메인 → IPv6 | sckwon.dev → 2606:4700::6812 |
| CNAME | 도메인 → 다른 도메인 | www.sckwon.dev → sckwon.dev |
| MX | 메일 서버 지정 | sckwon.dev → mail.google.com |
| TXT | 텍스트 정보 (인증 등) | SPF, DKIM 레코드 |
| NS | 네임서버 지정 | sckwon.dev → ns1.cloudflare.com |
확인 명령어
# A 레코드 조회
dig sckwon.dev A +short
nslookup sckwon.dev
# 특정 DNS 서버로 조회
dig @8.8.8.8 sckwon.dev
# 모든 레코드 조회
dig sckwon.dev ANY
# TTL 확인
dig sckwon.dev A
# ANSWER SECTION에 남은 TTL 초 단위로 표시자주 겪는 문제
| 증상 | 원인 | 해결 |
|---|---|---|
| 도메인 접속 안 됨 | DNS 전파 안 됨 | TTL 대기 (보통 5분~48시간) |
| 간헐적 접속 실패 | DNS 캐시 불일치 | dig로 여러 DNS 서버에서 확인 |
| 서브도메인 안 됨 | CNAME/A 레코드 누락 | DNS 설정에 레코드 추가 |
4. HTTP 기본
정리 보기
HTTP 요청 구조
GET /posts/linux-os-basics HTTP/1.1
Host: sckwon.dev
User-Agent: Mozilla/5.0
Accept: text/html- 메서드: GET, POST, PUT, PATCH, DELETE
- 경로:
/posts/linux-os-basics - 헤더: 메타 정보 (인증, 콘텐츠 타입 등)
- 바디: POST/PUT 요청 시 데이터
HTTP 응답 구조
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 5432
<html>...</html>상태 코드
| 범위 | 의미 | 자주 보는 것 |
|---|---|---|
| 2xx | 성공 | 200 OK, 201 Created, 204 No Content |
| 3xx | 리다이렉트 | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | 클라이언트 에러 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | 서버 에러 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
자주 보는 상태 코드
502 Bad Gateway: 로드밸런서 뒤의 서버가 응답하지 않음503 Service Unavailable: 서버 과부하 또는 점검 중504 Gateway Timeout: 백엔드 서버 응답 시간 초과
HTTPS
- HTTP + TLS (암호화) = HTTPS
- 포트: HTTP 80, HTTPS 443
.dev도메인은 HTTPS가 강제됨 (HSTS preload)- SSL/TLS 인증서는 Let’s Encrypt (무료) 또는 Cloudflare에서 자동 발급
curl로 확인
# 기본 GET 요청
curl -v https://sckwon.dev
# 상태 코드만
curl -o /dev/null -s -w "%{http_code}" https://sckwon.dev
# POST 요청
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com
# 응답 헤더 확인
curl -I https://sckwon.dev5. 포트와 Well-Known 포트
정리 보기
포트란
포트는 하나의 IP에서 여러 서비스를 구분하기 위한 번호입니다. IP가 아파트 주소면, 포트는 호수입니다.
sckwon.dev:443
└── 포트 번호포트 범위
0 ~ 1023: Well-Known 포트 (시스템 서비스, root 권한 필요)
1024 ~ 49151: Registered 포트 (일반 앱)
49152 ~ 65535: Dynamic/Private 포트 (임시 연결용)자주 쓰는 포트
| 포트 | 서비스 | 프로토콜 |
|---|---|---|
| 22 | SSH | TCP |
| 53 | DNS | UDP/TCP |
| 80 | HTTP | TCP |
| 443 | HTTPS | TCP |
| 3000 | Node.js 개발 서버 | TCP |
| 3306 | MySQL | TCP |
| 5432 | PostgreSQL | TCP |
| 6379 | Redis | TCP |
| 8080 | 앱 서버 (대체 HTTP) | TCP |
| 9090 | Prometheus | TCP |
확인 명령어
# 현재 리슨 중인 포트 (t: TCP, l: LISTEN, n: 숫자, p: 프로세스)
ss -tlnp
# 특정 포트 사용 프로세스
lsof -i :8080
# 외부에서 포트 열려있는지 확인
nc -zv server-ip 4436. 방화벽과 보안그룹
정리 보기
방화벽이란
방화벽은 네트워크 트래픽을 규칙에 따라 허용하거나 차단하는 장치/소프트웨어입니다.
Linux 방화벽 (iptables / nftables)
# 현재 규칙 확인
iptables -L -n
# 특정 포트 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 특정 IP에서만 SSH 허용
iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 22 -j ACCEPT
# 나머지 차단
iptables -A INPUT -j DROP클라우드 보안그룹 (AWS Security Group)
보안그룹은 인스턴스 단위의 가상 방화벽입니다.
인바운드 규칙:
HTTP (80) → 0.0.0.0/0 (모든 곳에서 허용)
HTTPS (443) → 0.0.0.0/0
SSH (22) → 10.0.0.0/16 (내부망에서만)
아웃바운드 규칙:
All traffic → 0.0.0.0/0 (모든 곳으로 허용)NACL vs Security Group (AWS)
| 항목 | Security Group | NACL |
|---|---|---|
| 적용 단위 | 인스턴스 | 서브넷 |
| 상태 | Stateful (응답 자동 허용) | Stateless (인/아웃 별도 설정) |
| 규칙 | 허용만 가능 | 허용 + 차단 가능 |
| 평가 | 모든 규칙 평가 | 번호 순서대로 평가 |
참고
- 서비스 포트 안 열리면: Security Group 인바운드 확인
- 특정 IP만 차단하고 싶으면: NACL 사용
- 서버 간 통신 안 되면: 양쪽 Security Group + 라우팅 테이블 확인
7. 프록시와 로드밸런서
정리 보기
프록시란
클라이언트와 서버 사이에 중간 서버를 두는 것입니다.
Forward Proxy: 클라이언트 → [프록시] → 서버
- 클라이언트 IP를 숨김
- 사내 인터넷 접근 제어에 사용
Reverse Proxy: 클라이언트 → [프록시] → 서버(들)
- 서버 IP를 숨김
- SSL 종단, 캐싱, 라우팅에 사용
- nginx, HAProxy, Cloudflare로드밸런서란
트래픽을 여러 서버에 분산하는 장치/서비스입니다.
클라이언트 → [로드밸런서] → 서버1
→ 서버2
→ 서버3로드밸런서 종류 (AWS)
| 종류 | 동작 계층 | 용도 |
|---|---|---|
| ALB (Application Load Balancer) | L7 (HTTP) | 웹 앱, 경로/호스트 기반 라우팅 |
| NLB (Network Load Balancer) | L4 (TCP/UDP) | 고성능, 낮은 지연시간 |
| CLB (Classic) | L4/L7 | 구세대, 사용 지양 |
분산 알고리즘
| 알고리즘 | 설명 |
|---|---|
| Round Robin | 순서대로 분배 |
| Least Connection | 연결 수 적은 서버로 |
| IP Hash | 같은 IP는 같은 서버로 |
헬스체크
로드밸런서가 서버 상태를 주기적으로 확인합니다.
GET /health → 200 OK: 정상
GET /health → 5xx 또는 타임아웃: 비정상 → 트래픽 제외/health 엔드포인트를 만들어두는 것이 기본입니다.
8. 네트워크 디버깅 실전
정리 보기
장애 상황별 확인 순서
"서비스 접속이 안 됩니다"
1. 서버에서 프로세스 살아있나? → ps, systemctl status
2. 포트 리슨하고 있나? → ss -tlnp
3. 로컬에서 접속 되나? → curl localhost:8080
4. 같은 네트워크에서 되나? → curl 10.0.1.50:8080
5. 외부에서 되나? → curl public-ip:8080
6. 안 되면 방화벽/보안그룹 확인 → iptables -L, AWS SG
7. DNS 문제인가? → dig, nslookup
8. 경로 문제인가? → traceroute, mtr자주 쓰는 명령어 모음
# 연결 테스트
ping -c 4 google.com # ICMP 연결 확인
nc -zv server 443 # TCP 포트 연결 확인
curl -v https://sckwon.dev # HTTP 전체 흐름 확인
# DNS 확인
dig sckwon.dev A +short # A 레코드 조회
dig @8.8.8.8 sckwon.dev # 특정 DNS 서버로 조회
nslookup sckwon.dev # 간단 조회
# 경로 추적
traceroute sckwon.dev # 어디서 막히는지
mtr sckwon.dev # 실시간 경로 추적
# 패킷 캡처 (고급)
# -i: 인터페이스, port: 필터, -c: 패킷 수 제한
tcpdump -i eth0 port 80 -c 50
# 열린 연결 상태
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn참고
- 접속 안 되면 안쪽에서 바깥으로 확인 (프로세스 → 포트 → 로컬 → 네트워크 → 외부)
curl -v는 가장 많이 쓰는 디버깅 도구 (SSL, 리다이렉트, 헤더 모두 확인 가능)tcpdump는 최후의 수단 — 패킷 레벨에서 뭐가 오가는지 확인- AWS에서 Security Group + NACL + 라우팅 테이블 세 가지를 동시에 확인해야 할 때가 많음
정리
네트워크는 서버 운영의 두 번째 축입니다. Linux 기본을 알고 있으면 프로세스 문제는 잡을 수 있지만, 네트워크를 모르면 “서버는 살아있는데 접속이 안 되는” 상황에서 막힙니다.
IP, DNS, TCP, HTTP, 포트, 방화벽 — 이 흐름을 이해하고 있으면 대부분의 네트워크 장애를 더 빠르게 좁혀갈 수 있습니다.