개요
네트워크는 서버와 클라이언트가 데이터를 주고받는 경로와 규칙을 정의합니다.
이 글은 IP, TCP/UDP, DNS, HTTP, 포트, 방화벽, 로드밸런서를 정리합니다.
1. IP 주소와 서브넷
정리 보기
IP 주소란
IP (Internet Protocol) 주소는 네트워크에서 장치를 식별하는 고유 번호입니다.
- IPv4:
192.168.1.100(32비트, 약 43억 개) - IPv6:
2001:0db8:85a3::8a2e:0370:7334(128비트)
IPv4와 IPv6는 함께 운용할 수 있고, 서비스나 네트워크 구간에 따라 IPv6 지원 범위가 다릅니다.
공인 IP vs 사설 IP
공인 IP: 인터넷에서 직접 접근 가능 (ex: 54.180.12.34)
사설 IP: 내부 네트워크에서만 사용 (외부 접근 불가)사설 IP 대역 (RFC 1918)
| RFC 1918 구분 | 대역 | CIDR | 주소 수 |
|---|---|---|---|
| 24-bit block | 10.0.0.0 ~ 10.255.255.255 | 10.0.0.0/8 | 2^24 = 16,777,216 |
| 20-bit block | 172.16.0.0 ~ 172.31.255.255 | 172.16.0.0/12 | 2^20 = 1,048,576 |
| 16-bit block | 192.168.0.0 ~ 192.168.255.255 | 192.168.0.0/16 | 2^16 = 65,536 |
RFC 1918은 이 세 대역을 각각 24-bit block, 20-bit block, 16-bit block이라고 부릅니다. pre-CIDR 표기로 보면 첫 번째는 클래스 A 네트워크 하나, 두 번째는 연속된 클래스 B 네트워크 16개, 세 번째는 연속된 클래스 C 네트워크 256개에 해당합니다.
- 10.0.0.0/8: 대규모 네트워크 (클라우드 VPC, 사내망)
- 172.16.0.0/12: AWS 기본 VPC가 이 안의 172.31.0.0/16을 사용합니다
- 192.168.0.0/16: 소규모 네트워크. 가정용 공유기에서 192.168.0.0/24 같은 서브넷으로 잘라 씁니다
특수 목적 IP 대역
| 대역 | IANA 등록 이름 | 용도 |
|---|---|---|
| 127.0.0.0/8 | Loopback (RFC 1122) | 루프백 (localhost). 자기 자신과 통신 |
| 169.254.0.0/16 | Link Local (RFC 3927) | DHCP 서버가 없을 때 같은 링크 안에서만 유효한 주소를 스스로 설정. 윈도우에서는 APIPA라고 부름 |
| 100.64.0.0/10 | Shared Address Space (RFC 6598) | CGN (Carrier-Grade NAT) 용도로 예약된 대역 |
| 0.0.0.0/0 | (등록 대역 아님) | 모든 IP를 의미하는 표기. 라우팅/방화벽 규칙에서 사용 |
특수 목적 대역은 이 세 개로 끝이 아닙니다. IANA IPv4 Special-Purpose Address Registry에는 0.0.0.0/8(This network), 문서용 예제 대역 192.0.2.0/24 · 198.51.100.0/24 · 203.0.113.0/24(TEST-NET-1~3, RFC 5737), 벤치마킹용 198.18.0.0/15(RFC 2544), 240.0.0.0/4(Reserved), 255.255.255.255/32(Limited Broadcast) 등이 함께 등록되어 있습니다. 그래서 “공인 IP = 사설 대역 뺀 나머지 전부"는 정확하지 않고, 이런 예약 대역까지 제외한 주소가 공인 IP입니다.
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 | (2^n - 2 적용 안 됨) |
| /28 | 16 | 2^4 - 2 = 14 |
| /24 | 256 | 2^8 - 2 = 254 |
| /16 | 65,536 | 2^16 - 2 = 65,534 |
2^n - 2에서 빠지는 2개는 네트워크 주소와 브로드캐스트 주소입니다. 이 계산은 /30까지의 일반 서브넷에 적용되고, /31과 /32에는 적용되지 않습니다.
- /31은 RFC 3021이 point-to-point 링크에 쓰도록 정의한 예외로, 주소 2개를 양쪽 끝에 그대로 씁니다
- /32는 호스트 하나를 지목하는 표기라 네트워크/브로드캐스트 개념이 성립하지 않습니다
클라우드에서는 여기서 더 줄어듭니다. AWS는 VPC 서브넷마다 CIDR의 처음 4개 주소와 마지막 1개 주소를 예약해서 리소스에 할당할 수 없게 하므로, /24 서브넷에서 실제로 쓸 수 있는 주소는 251개입니다. 그리고 AWS VPC 서브넷의 IPv4 CIDR은 /28 ~ /16 범위만 허용됩니다.
예시
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
3. DNS 동작 원리
정리 보기
DNS란
DNS (Domain Name System)는 도메인 이름을 IP 주소로 변환하는 시스템입니다.
sckwon.dev → 104.21.32.5 (예시)DNS 조회 흐름
1. 브라우저 캐시 확인
2. hosts 파일 확인 (/etc/hosts) — 캐시가 아니라 정적 매핑 파일
3. OS 스텁 리졸버 캐시 확인
4. DNS Resolver (ISP 또는 8.8.8.8)에 질의
5. Root DNS → TLD DNS (.dev) → 권한 DNS 서버 순으로 찾아감
6. IP 주소 반환 → 캐시에 저장 (TTL 동안)/etc/hosts는 캐시가 아니라 직접 작성하는 정적 매핑 파일입니다. TTL이 없고 만료되지 않으므로 DNS 응답과 별개로 이 파일의 매핑이 먼저 적용됩니다.
레코드 종류
| 레코드 | 용도 | 예시 |
|---|---|---|
| A | 도메인 → IPv4 | sckwon.dev → 104.21.32.5 |
| AAAA | 도메인 → IPv6 | sckwon.dev → 2606:4700::6812 |
| CNAME | 도메인 → 다른 도메인 | www.sckwon.dev → sckwon.dev |
| MX | 메일 서버 지정 | sckwon.dev → 10 mail.example.com |
| TXT | 텍스트 정보 (인증 등) | SPF, DKIM 레코드 |
| NS | 네임서버 지정 | sckwon.dev → ns1.cloudflare.com |
MX 레코드는 호스트 이름 앞에 preference 값이 함께 들어갑니다. RFC 1035의 MX RDATA는 PREFERENCE와 EXCHANGE 두 필드로 정의되어 있어서, 숫자 없이 호스트 이름만 적은 형태는 완전한 MX 레코드가 아닙니다. 숫자가 작을수록 우선순위가 높습니다.
확인 명령어
# A 레코드 조회
dig sckwon.dev A +short
nslookup sckwon.dev
# 특정 DNS 서버로 조회
dig @8.8.8.8 sckwon.dev
# ANY 조회 (전체 레코드가 다 온다는 보장은 없음)
dig sckwon.dev ANY
# TTL 확인
dig sckwon.dev A
# ANSWER SECTION에 남은 TTL 초 단위로 표시RFC 8482는 권한 서버가 QTYPE=ANY 질의에 대해 사용 가능한 RRset 중 일부만 돌려주거나 합성한 HINFO 레코드 하나만 돌려줄 수 있도록 허용합니다. 응답에 레코드가 적게 담겨도 해당 레코드가 존재하지 않는다는 뜻은 아닙니다.
DNS는 UDP만 쓰는 게 아닙니다
DNS 질의는 보통 UDP 53으로 나가지만, TCP 53도 함께 씁니다.
- RFC 1035는 UDP 메시지를 512바이트로 제한하고, 넘치면 TC(truncated) 비트를 세워 잘라 보냅니다. 클라이언트는 TCP로 다시 질의합니다
- RFC 6891의 EDNS(0)로 더 큰 UDP 응답 크기를 광고할 수 있지만, 경로 MTU를 넘으면 IP 단편화 문제가 생깁니다
- 존 전송(AXFR)은 TCP를 사용합니다
- RFC 7766은 범용 DNS 구현이 UDP와 TCP를 모두 지원해야 한다(MUST)고 규정합니다. TCP는 단순 재시도 수단이 아니라 UDP와 동등한 전송 수단입니다
방화벽이나 보안그룹에서 UDP 53만 열어두면 큰 응답이나 존 전송에서 막힐 수 있습니다.
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, 503, 504의 정의
502와 504는 모두 게이트웨이나 프록시로 동작하는 서버가 반환하는 코드이고, 유효하지 않은 응답을 받은 경우와 제때 응답을 받지 못한 경우로 구분됩니다.
502 Bad Gateway: 게이트웨이나 프록시로 동작하는 서버가 상위(inbound) 서버로부터 유효하지 않은 응답을 받은 경우 (RFC 9110 15.6.3)503 Service Unavailable: 서버가 일시적인 과부하나 예정된 점검 때문에 현재 요청을 처리할 수 없는 경우.Retry-After헤더로 대기 시간을 알려줄 수 있습니다 (RFC 9110 15.6.4)504 Gateway Timeout: 게이트웨이나 프록시로 동작하는 서버가 요청 처리에 필요한 upstream 서버로부터 제때 응답을 받지 못한 경우 (RFC 9110 15.6.5)
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에서 여러 서비스를 구분하기 위한 번호입니다.
sckwon.dev:443
└── 포트 번호포트 범위
RFC 6335가 IANA 포트 레지스트리를 세 구간으로 나눕니다. 괄호 안이 같은 구간을 부르는 다른 이름입니다.
0 ~ 1023: System Ports (= Well Known Ports), IANA가 할당
1024 ~ 49151: User Ports (= Registered Ports), IANA가 할당
49152 ~ 65535: Dynamic Ports (= Private/Ephemeral Ports), 할당하지 않음- Dynamic Ports 구간은 로컬/동적 용도로 비워둔 구간이라 IANA를 통해 할당받을 수 없고, 서비스 식별자로 써서도 안 됩니다 (RFC 6335 8.1.2)
- 1024 미만 포트를 바인딩할 때 root 권한이 필요한 것은 IANA 규정이 아니라 Linux의 특권 포트 동작입니다
주요 포트와 서비스
| 포트 | 서비스 | 프로토콜 |
|---|---|---|
| 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, IANA 등록명 http-alt) | TCP |
| 9090 | Prometheus (도구 기본값) | TCP |
이 표에서 22, 53, 80, 443, 8080처럼 IANA에 해당 서비스명으로 등록된 포트와, 도구가 관례적으로 쓰는 기본값이 섞여 있습니다. 9090은 IANA 레지스트리에 websm으로 등록된 포트이고, Prometheus가 기본 리슨 포트로 9090을 쓰는 것은 도구 쪽 기본값입니다. 3000번도 Node.js 프레임워크들이 관례적으로 쓰는 값입니다.
확인 명령어
# 현재 리슨 중인 포트 (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-A는 체인 끝에 규칙을 덧붙이고, 규칙은 위에서부터 순서대로 평가되어 처음 일치한 규칙에서 처리가 끝납니다. -A INPUT -j DROP은 앞의 ACCEPT 규칙들 뒤에 놓일 때 그 규칙에 걸리지 않은 트래픽을 차단하고, 체인 앞쪽에 놓이면 뒤의 ACCEPT 규칙은 평가되지 않습니다.
이 규칙에는 매칭 조건이 없어서 루프백 인터페이스의 트래픽과 이미 맺어진 연결의 응답 패킷에도 적용됩니다. iptables는 이 두 트래픽을 각각 -i lo와 -m conntrack --ctstate ESTABLISHED,RELATED로 매칭합니다.
# 루프백 허용
iptables -A INPUT -i lo -j ACCEPT
# 이미 맺어진 연결과 관련 트래픽 허용
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT클라우드 보안그룹 (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 (인/아웃 별도 설정) |
| 규칙 | 허용만 가능 | 허용 + 차단 가능 |
| 평가 | 모든 규칙 평가 | 번호 순서대로 평가 |
7. 프록시와 로드밸런서
정리 보기
프록시란
클라이언트와 서버 사이에 중간 서버를 두는 것입니다.
Forward Proxy: 클라이언트 → [프록시] → 서버
- 클라이언트 IP를 숨김
- 사내 인터넷 접근 제어에 사용
Reverse Proxy: 클라이언트 → [프록시] → 서버(들)
- 서버 IP를 숨김
- SSL 종단, 캐싱, 라우팅에 사용
- nginx, HAProxy, Cloudflare로드밸런서란
트래픽을 여러 서버에 분산하는 장치/서비스입니다.
클라이언트 → [로드밸런서] → 서버1
→ 서버2
→ 서버3로드밸런서 종류 (AWS)
| 종류 | 동작 계층 | 용도 |
|---|---|---|
| ALB (Application Load Balancer) | L7 (HTTP/HTTPS) | 웹 앱, 경로/호스트 기반 라우팅 |
| NLB (Network Load Balancer) | L4 (TCP, UDP, TLS, QUIC 등) | 고성능, 낮은 지연시간 |
| CLB (Classic) | L4/L7 (HTTP/HTTPS + TCP/SSL 리스너) | 이전 세대. AWS가 현재 세대로 마이그레이션을 권장 |
분산 알고리즘
일반적인 로드밸런서/리버스 프록시에서 쓰이는 방식입니다.
| 알고리즘 | 설명 |
|---|---|
| Round Robin | 순서대로 분배 |
| Least Connection | 처리 중인 연결/요청이 적은 서버로 |
| IP Hash | 같은 IP는 같은 서버로 |
AWS에서 실제로 고를 수 있는 옵션은 이 목록과 다릅니다.
- ALB: 타겟 그룹 단위로 라우팅 알고리즘을 고르고, 기본값은 round robin입니다. 그 외에 least outstanding requests, weighted random을 지원합니다. IP Hash 같은 옵션은 없고, 같은 클라이언트를 같은 타겟에 고정하려면 sticky sessions(쿠키 기반)를 씁니다
- NLB: 알고리즘을 고르는 게 아니라 flow hash를 씁니다. TCP는 프로토콜·출발지 IP·출발지 포트·목적지 IP·목적지 포트·TCP 시퀀스 번호를 해시하고, UDP는 시퀀스 번호를 뺀 5-튜플을 해시합니다. 하나의 TCP 연결은 연결이 끝날 때까지 같은 타겟으로 갑니다
헬스체크
로드밸런서가 서버 상태를 주기적으로 확인합니다.
GET /health → 200 OK: 정상
GET /health → 5xx 또는 타임아웃: 비정상 → 트래픽 제외8. 네트워크 디버깅 명령어
정리 보기
명령어별 확인 대상
# 연결 테스트
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는 인터페이스를 지나는 패킷을 캡처합니다