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 주소를 나타내요.
주요 속성·작업:
.version—4또는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
더 알아보기
- Python 표준 라이브러리의
socket모듈 - Python 공식 문서: ipaddress