IP 주소
Internet Protocol Address
네트워크상 장치를 식별하는 주소. IPv4(32비트), IPv6(128비트). 공인/사설 IP로 구분.
Internet Protocol Address
네트워크상 장치를 식별하는 주소. IPv4(32비트), IPv6(128비트). 공인/사설 IP로 구분.
IP 주소(Internet Protocol Address)는 네트워크에 연결된 모든 장치를 고유하게 식별하는 논리적 주소입니다. 마치 집 주소가 우편물 배달에 필요하듯, IP 주소는 인터넷에서 데이터 패킷이 올바른 목적지에 도달할 수 있도록 합니다. 네트워크 계층(OSI 3계층)에서 작동하며, 라우터가 이 주소를 보고 패킷을 전달합니다.
IP 주소는 네트워크 부분과 호스트 부분으로 구성됩니다. 네트워크 부분은 어느 네트워크에 속하는지, 호스트 부분은 그 네트워크 내에서 어떤 장치인지를 나타냅니다. 서브넷 마스크가 이 경계를 정의합니다. 예를 들어 192.168.1.100/24에서 192.168.1이 네트워크, 100이 호스트입니다.
현재 인터넷은 IPv4에서 IPv6로 전환 중입니다. IPv4의 약 43억 개 주소가 고갈되면서 NAT, DHCP 같은 기술로 버텨왔지만, IoT 시대에는 IPv6의 거의 무한한 주소 공간(3.4×10^38개)이 필수입니다. 대부분의 ISP와 클라우드 서비스는 이미 듀얼 스택(IPv4+IPv6)을 지원합니다.
4개의 8비트(0-255) 옥텟, 점(.)으로 구분. 약 43억 개 주소.
8개의 16비트 헥사 블록, 콜론(:)으로 구분. 연속 0은 ::로 생략 가능.
| 특성 | IPv4 | IPv6 |
|---|---|---|
| 주소 길이 | 32비트 (4바이트) | 128비트 (16바이트) |
| 주소 개수 | 약 43억 개 | 3.4 × 10^38 개 |
| 표기법 | 10진수 + 점 (192.168.1.1) | 16진수 + 콜론 (2001:db8::1) |
| 브로드캐스트 | 지원 (255.255.255.255) | 미지원 (멀티캐스트 사용) |
| NAT 필요성 | 필수 (주소 부족) | 불필요 (주소 충분) |
| 헤더 크기 | 20-60 바이트 (가변) | 40 바이트 (고정) |
공인 IP(Public IP)는 인터넷에서 고유하게 식별되는 주소입니다. ISP가 할당하며, 전 세계 어디서나 직접 접근할 수 있습니다. 웹 서버, API 서버 등 외부 접근이 필요한 서비스에 사용됩니다.
사설 IP(Private IP)는 내부 네트워크에서만 사용되는 주소입니다. 인터넷에서 라우팅되지 않으며, 여러 조직이 동일한 사설 IP 대역을 사용해도 충돌하지 않습니다. NAT를 통해 공인 IP로 변환되어 인터넷에 접속합니다.
| 클래스 | 사설 IP 대역 | 서브넷 마스크 | 호스트 수 |
|---|---|---|---|
| Class A | 10.0.0.0 - 10.255.255.255 | /8 (255.0.0.0) | 16,777,214 |
| Class B | 172.16.0.0 - 172.31.255.255 | /12 (255.240.0.0) | 1,048,574 |
| Class C | 192.168.0.0 - 192.168.255.255 | /16 (255.255.0.0) | 65,534 |
| Loopback | 127.0.0.0 - 127.255.255.255 | /8 | 로컬호스트 전용 |
서브넷(Subnet)은 큰 네트워크를 작은 논리적 네트워크로 분할하는 기술입니다. 브로드캐스트 도메인을 줄이고, 보안을 강화하며, IP 주소를 효율적으로 사용할 수 있습니다. 서브넷 마스크가 네트워크 부분과 호스트 부분의 경계를 정의합니다.
CIDR(Classless Inter-Domain Routing)은 기존 클래스 기반 IP 할당의 비효율을 해결합니다. /24처럼 슬래시 표기법으로 네트워크 비트 수를 표시합니다. 192.168.1.0/24는 앞 24비트가 네트워크, 뒤 8비트가 호스트(254개 사용 가능)를 의미합니다.
| CIDR | 서브넷 마스크 | 사용 가능 IP | 일반적인 용도 |
|---|---|---|---|
| /32 | 255.255.255.255 | 1 | 단일 호스트 |
| /30 | 255.255.255.252 | 2 | Point-to-Point 링크 |
| /28 | 255.255.255.240 | 14 | 소규모 서브넷 |
| /24 | 255.255.255.0 | 254 | 일반 LAN |
| /16 | 255.255.0.0 | 65,534 | 대규모 네트워크 |
DHCP(Dynamic Host Configuration Protocol)는 네트워크 장치에 IP 주소를 자동으로 할당하는 프로토콜입니다. 수동 설정 없이 IP 주소, 서브넷 마스크, 게이트웨이, DNS 서버 정보를 자동으로 받습니다. 임대(Lease) 방식으로 작동하며, 기본 임대 시간은 보통 24시간입니다.
NAT(Network Address Translation)는 사설 IP와 공인 IP 간 변환을 수행합니다. 하나의 공인 IP로 여러 장치가 인터넷에 접속할 수 있게 해주어 IPv4 주소 고갈 문제를 완화합니다. 종류로는 Static NAT(1:1), Dynamic NAT(N:M), PAT/NAPT(N:1, 포트 기반)가 있습니다.
| 기술 | 역할 | 작동 방식 |
|---|---|---|
| DHCP | IP 자동 할당 | DISCOVER → OFFER → REQUEST → ACK |
| Static NAT | 1:1 주소 변환 | 고정 매핑 (서버용) |
| Dynamic NAT | N:M 주소 변환 | 풀에서 동적 할당 |
| PAT (NAPT) | N:1 포트 변환 | 포트 번호로 구분 (가정용 공유기) |
import socket
import ipaddress
# 내 IP 주소 확인
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
print(f"로컬 IP: {local_ip}")
# 공인 IP 확인 (외부 서비스 사용)
import urllib.request
public_ip = urllib.request.urlopen('https://api.ipify.org').read().decode()
print(f"공인 IP: {public_ip}")
# IP 주소 유효성 검사 및 분석
ip = ipaddress.ip_address('192.168.1.100')
print(f"버전: IPv{ip.version}")
print(f"사설 IP: {ip.is_private}")
print(f"루프백: {ip.is_loopback}")
# IPv6 주소 분석
ipv6 = ipaddress.ip_address('2001:db8::8a2e:370:7334')
print(f"IPv6 압축 표기: {ipv6.compressed}")
print(f"IPv6 전체 표기: {ipv6.exploded}")
# 서브넷 계산
network = ipaddress.ip_network('192.168.1.0/24', strict=False)
print(f"네트워크 주소: {network.network_address}")
print(f"브로드캐스트: {network.broadcast_address}")
print(f"호스트 범위: {list(network.hosts())[0]} - {list(network.hosts())[-1]}")
print(f"호스트 수: {network.num_addresses - 2}")
# CIDR 서브넷 분할
parent = ipaddress.ip_network('10.0.0.0/16')
subnets = list(parent.subnets(prefixlen_diff=8)) # /24로 분할
print(f"서브넷 256개 생성: {subnets[0]} ~ {subnets[-1]}")
# 현재 IP 설정 확인
ip addr show # Linux
ifconfig # macOS/Linux (deprecated)
ipconfig # Windows
# 공인 IP 확인
curl ifconfig.me
curl ipinfo.io/ip
curl api.ipify.org
# 상세 IP 정보 (지리 정보 포함)
curl ipinfo.io/8.8.8.8
# 네트워크 인터페이스별 IP
ip -4 addr show eth0 # IPv4만
ip -6 addr show eth0 # IPv6만
# 라우팅 테이블 확인
ip route show
netstat -rn
# 기본 게이트웨이 확인
ip route | grep default
# DHCP 임대 정보 확인 (Linux)
cat /var/lib/dhcp/dhclient.leases
# DHCP 갱신
sudo dhclient -r eth0 # 해제
sudo dhclient eth0 # 재할당
# NAT 테이블 확인 (Linux iptables)
sudo iptables -t nat -L -n -v
# 서브넷 계산 (ipcalc 도구)
ipcalc 192.168.1.0/24
# Network: 192.168.1.0/24
# Broadcast: 192.168.1.255
# HostMin: 192.168.1.1
# HostMax: 192.168.1.254
# Hosts/Net: 254
const os = require('os');
const dns = require('dns');
// 로컬 네트워크 인터페이스 정보
const interfaces = os.networkInterfaces();
Object.keys(interfaces).forEach(name => {
interfaces[name].forEach(iface => {
if (iface.family === 'IPv4' && !iface.internal) {
console.log(`${name}: ${iface.address}`);
console.log(` 넷마스크: ${iface.netmask}`);
console.log(` MAC: ${iface.mac}`);
}
});
});
// IP 주소 유효성 검사
const net = require('net');
console.log(net.isIP('192.168.1.1')); // 4 (IPv4)
console.log(net.isIP('2001:db8::1')); // 6 (IPv6)
console.log(net.isIP('invalid')); // 0 (유효하지 않음)
console.log(net.isIPv4('192.168.1.1')); // true
console.log(net.isIPv6('::1')); // true
// 공인 IP 확인 (fetch)
async function getPublicIP() {
const response = await fetch('https://api.ipify.org?format=json');
const data = await response.json();
console.log(`공인 IP: ${data.ip}`);
}
getPublicIP();
// CIDR 파싱 및 계산 (ip-cidr 패키지)
const IPCIDR = require('ip-cidr'); // npm install ip-cidr
const cidr = new IPCIDR('192.168.1.0/24');
console.log(`시작: ${cidr.start()}`); // 192.168.1.0
console.log(`끝: ${cidr.end()}`); // 192.168.1.255
console.log(`크기: ${cidr.size()}`); // 256
console.log(`포함: ${cidr.contains('192.168.1.100')}`); // true
"VPC는 10.0.0.0/16으로 잡고, 가용영역당 /20 서브넷을 할당하면 각 서브넷에서 4,000개 이상의 IP를 쓸 수 있습니다. 퍼블릭 서브넷은 /24로 작게, 프라이빗은 /20으로 크게 잡는 게 일반적입니다."
"169.254.x.x 주소가 보이면 DHCP 할당 실패입니다. APIPA(Automatic Private IP Addressing)가 임시로 부여한 건데, DHCP 서버 상태나 네트워크 연결을 확인해야 합니다."
"NAT Gateway를 통해 아웃바운드만 허용하고, 인바운드는 Load Balancer의 고정 IP로만 받으면 됩니다. 프라이빗 서브넷의 EC2들은 공인 IP 없이 인터넷에 접근할 수 있으면서도 외부 노출을 막을 수 있습니다."
/24는 256개 IP지만 실제 사용 가능한 건 254개입니다. 첫 번째(네트워크 주소)와 마지막(브로드캐스트)은 호스트에 할당 불가. AWS는 추가로 3개를 예약해서 251개만 사용 가능합니다.
VPN이나 VPC Peering 시 양쪽 네트워크 대역이 겹치면 라우팅 충돌이 발생합니다. 사전에 IP 계획을 세우고 10.x.x.x 대역을 조직별로 분리 할당하세요.
코드에 공인 IP를 직접 넣으면 IP 변경 시 장애가 발생합니다. DNS 도메인이나 환경변수를 사용하고, Elastic IP(고정 IP) 서비스를 활용하세요.
IPAM(IP Address Management) 도구로 IP 할당을 중앙 관리. CIDR 계획을 문서화하고, 프로덕션/스테이징/개발 환경별로 대역 분리. IPv6 전환을 위해 듀얼 스택 지원 검토.