security
CHAPTER 67 / 84
읽기 약 2분
FUNCTION
네트워크 기초: IP, 포트, 프로토콜
핵심 개념
IP 주소·포트·TCP/UDP 등 네트워크의 기본 단위를 Python socket으로 직접 다룬다.
본문
IP 주소 — IPv4 vs IPv6
| 형식 | 예시 | 주소 공간 |
|---|---|---|
| IPv4 | 192.168.1.1 | 약 43억 (32비트) |
| IPv6 | 2001:db8::1 | 사실상 무한 (128비트) |
# ⚠️ 이 코드는 허가된 환경에서만 사용하세요.
import ipaddress
# 주소 검증
ip = ipaddress.ip_address('192.168.1.10')
print(ip.is_private) # True (사설망)
print(ip.is_loopback) # False
print(ip.version) # 4
# 서브넷 — CIDR 표기
net = ipaddress.ip_network('192.168.1.0/24')
print(net.num_addresses) # 256
print(list(net.hosts())[:3]) # [192.168.1.1, ...2, ...3]포트 번호 3대 분류
| 범위 | 이름 | 예시 |
|---|---|---|
| 0~1023 | Well-known | 22(SSH), 80(HTTP), 443(HTTPS), 3306(MySQL) |
| 1024~49151 | 등록(Registered) | 8080, 5432(PostgreSQL), 6379(Redis) |
| 49152~65535 | 동적(Dynamic) | 운영체제 자동 할당 |
TCP vs UDP
# TCP — 연결 지향, 신뢰성 (HTTP/SSH/FTP)
import socket
# 3-way handshake: SYN → SYN-ACK → ACK
def tcp_connect(host: str, port: int, timeout: float = 2.0) -> bool:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
try:
s.connect((host, port))
return True
except (socket.timeout, ConnectionRefusedError):
return False
finally:
s.close()
# UDP — 비연결, 빠름 (DNS/VoIP/게임)
def udp_send(host: str, port: int, data: bytes, timeout: float = 2.0):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(timeout)
try:
s.sendto(data, (host, port))
# UDP는 응답 보장 안 됨
try:
response, _ = s.recvfrom(1024)
return response
except socket.timeout:
return None
finally:
s.close()3-way Handshake 시각화
클라이언트 서버
| |
| ──── SYN ─────→ | "연결할게"
| |
| ←── SYN-ACK ── | "OK, 너도 응답해"
| |
| ──── ACK ─────→ | "응답함, 시작!"
| |
| ─── DATA ────→ | 통신 시작실습: 호스트 도달 가능성 종합 점검
# ⚠️ 이 코드는 허가된 환경에서만 사용하세요.
import socket
import ipaddress
def host_recon(target: str) -> dict:
"""호스트 기본 정보 수집 — 자기 서버 또는 허가된 환경에서만."""
result = {'target': target}
# 1. DNS 해석
try:
ip = socket.gethostbyname(target)
result['ip'] = ip
result['private'] = ipaddress.ip_address(ip).is_private
except socket.gaierror:
result['error'] = 'DNS 해석 실패'
return result
# 2. 역방향 DNS
try:
result['rdns'] = socket.gethostbyaddr(ip)[0]
except socket.herror:
result['rdns'] = None
# 3. 일반적 포트 빠른 체크
common_ports = [22, 80, 443, 3306, 8080]
open_ports = []
for p in common_ports:
if tcp_connect(ip, p, 1.0):
open_ports.append(p)
result['open_ports'] = open_ports
return result
# print(host_recon('localhost'))AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 socket 코드의 IP/포트 처리에서 예외 누락·타임아웃 미설정·리소스 누수를 분석해서 프로덕션 수준으로 개선해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
TCP vs UDP 실전 비교 코드를 (HTTP 클라이언트 vs DNS 쿼리) 각각 한 파일로 보여줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 네트워크 스크립트 전체를 분석해서 DNS 해석·연결 처리·예외 흐름이 보안 도구로서 안전한지 종합 점검해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년에도 IPv4가 표준인지, IPv6 채택률과 듀얼 스택 권장 사례를 실무자 관점으로 솔직히 알려줘.
⭐ 이것만 기억하세요
네트워크 기초: IP, 포트, 프로토콜은 이 3가지만 확실히 잡으세요
1.IP/포트/TCP-UDP 3대 기본 단위를 socket으로 직접 다룰 수 있어야 보안 도구를 만들 수 있다
2.3-way handshake와 포트 번호 3대 분류는 모든 네트워크 보안 분석의 토대가 된다
3.다음 챕터에서 이 기초로 멀티스레드 포트 스캐너를 만든다
공유하기
진행도 67 / 84