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

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

ipaddress 모듈은 IPv4 및 IPv6 주소와 네트워크를 생성·조작·연산하는 기능을 제공해요. 이 모듈의 함수와 클래스는 두 호스트가 같은 서브넷에 있는지 확인하는 것, 특정 서브넷의 모든 호스트를 순회하는 것, 문자열이 유효한 IP 주소나 네트워크 정의를 나타내는지 확인하는 것 등 IP 주소와 관련된 다양한 작업을 쉽게 처리할 수 있게 해줘요.

버전 3.3에서 추가됨.

출처: Python documentation

본문

편의 팩토리 함수

ipaddress.ip_address(address) — 인자로 전달된 IP 주소에 따라 IPv4Address 또는 IPv6Address 객체를 반환해요. 2**32보다 작은 정수는 기본적으로 IPv4로 간주돼요. address가 유효한 IPv4 또는 IPv6 주소를 나타내지 않으면 ValueError가 발생해요.

>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')

ipaddress.ip_network(address, strict=True) — 인자로 전달된 IP 주소에 따라 IPv4Network 또는 IPv6Network 객체를 반환해요.

ipaddress.ip_interface(address) — 인자로 전달된 IP 주소에 따라 IPv4Interface 또는 IPv6Interface 객체를 반환해요.

이 편의 함수의 단점 중 하나는 IPv4와 IPv6 형식을 모두 처리해야 하므로 오류 메시지가 정확한 오류에 대한 최소한의 정보만 제공한다는 것이에요. 버전별 클래스 생성자를 직접 호출하면 더 자세한 오류 보고를 얻을 수 있어요.

주소 객체

class ipaddress.IPv4Address(address) — IPv4 주소를 구성해요. address가 유효한 IPv4 주소가 아니면 AddressValueError가 발생해요. 다음이 유효한 IPv4 주소예요:

  • 점으로 구분된 10진 표기 문자열로, 점으로 분리된 0–255 범위의 10진 정수 4개(예: 192.168.0.1).
  • 32비트에 맞는 정수.
  • 길이 4의 bytes 객체에 압축된 정수(최상위 옥텟 먼저).
>>> ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')

주요 속성: version(IPv4는 4), max_prefixlen(IPv4는 32), packed(이진 표현), reverse_pointer(역방향 DNS PTR 레코드 이름), is_multicast, is_private, is_global, is_unspecified, is_reserved, is_loopback, is_link_local.

class ipaddress.IPv6Address(address) — IPv6 주소를 구성해요. address가 유효한 IPv6 주소가 아니면 AddressValueError가 발생해요. 다음이 유효한 IPv6 주소예요:

  • 16비트를 나타내는 4개의 16진수 그룹 8개로 구성된 문자열(콜론으로 구분). 압축 표기(shorthand)도 지원.
  • 128비트에 맞는 정수.
  • 길이 16의 big-endian bytes 객체에 압축된 정수.

주요 속성: compressed/exploded, packed, is_multicast, is_private, is_global, is_site_local, ipv4_mapped, scope_id, sixtofour, teredo 등.

문자열과 정수로의 변환

socket 모듈 같은 네트워킹 인터페이스와 상호 운용하려면 주소를 문자열이나 정수로 변환해야 해요. 이는 str()int() 내장 함수로 처리돼요:

>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521

연산자

주소 객체는 비교 연산자와 산술 연산자를 지원해요. 비교는 호환되는 객체 간에만(IPv4끼리, IPv6끼리) 적용할 수 있어요. 정수를 주소 객체에 더하거나 뺄 수 있어요:

>>> IPv4Address('127.0.0.2') + 3
IPv4Address('127.0.0.5')

IP 네트워크 정의

class ipaddress.IPv4Network(address, strict=True) — IPv4 네트워크 정의를 구성해요. address는 다음 중 하나가 될 수 있어요:

  • IP 주소와 선택적 마스크로 구성된 문자열(슬래시(/)로 구분). 예: 192.168.1.0/24, 192.168.1.0/255.255.255.0.
  • 32비트에 맞는 정수.
  • 길이 4의 big-endian bytes 객체.
  • 주소 설명과 넷마스크의 두 튜플.

strictTrue이고 제공된 주소에 호스트 비트가 설정되어 있으면 ValueError가 발생해요. 네트워크 객체는 해시 가능해 딕셔너리의 키로 사용할 수 있어요.

주요 속성: network_address, broadcast_address, hostmask, netmask, with_prefixlen, num_addresses, prefixlen. 주요 메서드: hosts()(사용 가능한 호스트 순회), overlaps(other), address_exclude(network), subnets(), supernet(), subnet_of(other), supernet_of(other).

class ipaddress.IPv6Network(address, strict=True) — IPv6 네트워크 정의를 구성해요. address는 IP 주소와 선택적 접두사 길이로 구성된 문자열(슬래시로 구분), 128비트에 맞는 정수, 길이 16의 big-endian bytes 객체, 또는 주소 설명과 넷마스크의 두 튜플 중 하나가 될 수 있어요.

인터페이스 객체

class ipaddress.IPv4Interface(address) — IPv4 인터페이스를 구성해요. IPv4Network의 생성자와 address의 의미가 같지만 임의의 호스트 주소가 항상 허용돼요. IPv4Address의 하위 클래스예요. 추가 속성: ip(네트워크 정보가 없는 주소), network(이 인터페이스가 속한 네트워크), with_prefixlen 등.

class ipaddress.IPv6Interface(address) — IPv6 인터페이스를 구성해요. IPv6Address의 하위 클래스예요.

다른 모듈 수준 함수

ipaddress.v4_int_to_packed(address) — 주소를 네트워크(big-endian) 순서의 4개 압축 바이트로 표현해요.

ipaddress.summarize_address_range(first, last) — 첫 번째와 마지막 IP 주소가 주어지면 요약된 네트워크 범위의 이터레이터를 반환해요.

ipaddress.collapse_addresses(addresses) — 축소된 IPv4Network 또는 IPv6Network 객체의 이터레이터를 반환해요.

ipaddress.get_mixed_type_key(obj) — 네트워크와 주소 사이의 정렬에 적합한 키를 반환해요. sorted()key 인자로 사용할 수 있어요.

사용자 지정 예외

exception ipaddress.AddressValueError(ValueError) — 주소와 관련된 모든 값 오류. exception ipaddress.NetmaskValueError(ValueError) — 넷마스크와 관련된 모든 값 오류.

더 알아보기 (Learn more)