ipaddress — IPv4/IPv6 조작 라이브러리

ipaddress — IPv4/IPv6 조작 라이브러리

ipaddress 모듈은 IPv4와 IPv6 주소와 네트워크를 만들고, 조작하고, 연산하는 기능을 제공해요. 이 모듈의 함수와 클래스는 IP 주소, 네트워크, 인터페이스를 나타내는 객체를 만들어 다양한 연산(포함 여부, 비교, 산술 연산 등)을 지원해요.

출처: Python 표준 라이브러리

편의 팩토리 함수

  • ipaddress.ip_address(address)address가 IPv4면 IPv4Address, IPv6면 IPv6Address 객체를 반환해요. 정수나 문자열을 받을 수 있어요.
>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::1')
IPv6Address('2001:db8::1')
  • ipaddress.ip_network(address, strict=True)IPv4Network 또는 IPv6Network 객체를 반환해요. strict=True(기본)일 때는 호스트 비트가 설정된 주소를 네트워크로 주면 ValueError가 발생합니다.
>>> ipaddress.ip_network('192.168.0.0/24')
IPv4Network('192.168.0.0/24')
  • ipaddress.ip_interface(address)IPv4Interface 또는 IPv6Interface 객체를 반환해요. 주소와 프리픽스 길이를 함께 가진 형태를 다룹니다.

주소 객체

IPv4Address

  • class ipaddress.IPv4Address(address) — IPv4 주소를 나타내요.
  • class ipaddress.IPv6Address(address) — IPv6 주소를 나타내요.

주요 속성·작업:

  • .version4 또는 6.
  • .max_prefixlen — 주소의 총 비트 수(IPv4는 32, IPv6는 128).
  • .compressed, .exploded — IPv6 압축/전개 문자열 표현.
  • .packed — 주소를 패킹한 4/16 바이트 bytes.
  • .is_private, .is_global, .is_multicast, .is_loopback, .is_link_local, .is_reserved, .is_unspecified — 특성 플래그.
  • 문자열 변환: str(addr)로 표준 형태를, int(addr)로 정수 값을 얻어요.
  • 산술 연산: 주소에 정수를 더하거나 빼서 이동한 주소를 만들 수 있어요.
>>> ip = ipaddress.IPv4Address('192.168.0.1')
>>> ip.version
4
>>> int(ip)
3232235521
>>> ip + 1
IPv4Address('192.168.0.2')

Operators

IPv4 주소끼리 비교 연산자(<, == 등)가 지원됩니다.

네트워크 객체

IPv4Network / IPv6Network

  • class ipaddress.IPv4Network(address, strict=True) — IPv4 네트워크 정의.
  • class ipaddress.IPv6Network(address, strict=True) — IPv6 네트워크 정의.

address'192.168.0.0/24'처럼 주소+프리픽스 문자열이나 (주소, 프리픽스) 튜플, 또는 정수로 줄 수 있어요.

주요 속성·메서드:

  • .network_address — 네트워크 주소.
  • .broadcast_address — 브로드캐스트 주소.
  • .netmask — 넷마스크 주소.
  • .hostmask — 호스트 마스크.
  • .prefixlen — 프리픽스 길이.
  • .num_addresses — 네트워크의 총 주소 수.
  • .hosts() — 네트워크의 사용 가능한 호스트 주소를 순회하는 이터레이터(네트워크·브로드캐스트 제외).
  • .subnets(prefixlen_diff=1) — 서브넷으로 나누는 이터레이터.
  • .supernet(prefixlen_diff=1) — 상위 네트워크를 반환.
  • 멤버십: ip in network처럼 주소가 네트워크에 속하는지 검사.
  • 이터레이션: for ip in network로 네트워크의 모든 주소를 순회.
>>> net = ipaddress.ip_network('192.168.1.0/24')
>>> net.num_addresses
256
>>> net.prefixlen
24
>>> ipaddress.IPv4Address('192.168.1.10') in net
True

인터페이스 객체

  • class ipaddress.IPv4Interface(address) — IPv4 인터페이스(주소+네트워크).
  • class ipaddress.IPv6Interface(address) — IPv6 인터페이스.

인터페이스 객체는 주소로도 네트워크로도 동작해요. .ip는 주소를, .network는 네트워크를 반환합니다.

>>> iface = ipaddress.ip_interface('192.168.1.1/24')
>>> iface.ip
IPv4Address('192.168.1.1')
>>> iface.network
IPv4Network('192.168.1.0/24')

기타 모듈 수준 함수

  • ipaddress.summarize_address_range(first, last) — 주소 범위를 네트워크 목록으로 요약.
  • ipaddress.collapse_addresses(addresses) — 여러 네트워크를 최소 네트워크 집합으로 병합.
  • ipaddress.v4_int_to_packed(address) / ipaddress.v6_int_to_packed(address) — 정수를 패킹된 bytes로 변환.
  • ipaddress.packed_to_v4_address(address) — 패킹된 bytes를 주소로 변환.

커스텀 예외

  • exception ipaddress.AddressValueError — 잘못된 IP 주소에 대한 예외.
  • exception ipaddress.NetmaskValueError — 잘못된 넷마스크에 대한 예외.

예제

주소가 특정 네트워크에 속하는지 검사:

import ipaddress

def allowed(addr: str, network: str) -> bool:
    return ipaddress.ip_address(addr) in ipaddress.ip_network(network)

print(allowed('192.168.1.5', '192.168.1.0/24'))  # True
print(allowed('10.0.0.5', '192.168.1.0/24'))     # False

네트워크의 모든 호스트 나열:

import ipaddress

net = ipaddress.ip_network('10.0.0.0/30')
for host in net.hosts():
    print(host)
# 10.0.0.1
# 10.0.0.2

더 알아보기