[Python] 파이썬 라이브러리 : ipaddress



Python 에서 기본적으로 제공하는 표준 라이브러리 중 ipaddress 라이브러리를 소개하고 테스트한 내용을 정리합니다.


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

ipaddress 라이브러리는 IPv4 및 IPv6 주소, 네트워크, 인터페이스를 다룰 수 있는 기능을 제공합니다.

  • ipaddress.ip_address(address)
  • ipaddress.ip_network(address, strict = True)
  • ipaddress.ip_interface(address)

IP Address 객체

import ipaddress

ipaddress.ip_address('10.10.10.10')
# IPv4Address('10.10.10.10')

ipaddress.IPv4Address('10.10.10.10')
# IPv4Address('10.10.10.10')

ipaddress.ip_address('2001:db8::')
# IPv6Address('2001:db8::')

ipaddress.IPv6Address('2001:db8::')
# IPv6Address('2001:db8::')

ipaddress.IPv4Address('1000.10.10.10')
# AddressValueError: At most 3 characters permitted in '1000' in '1000.10.10.10'

IP 주소를 인자로 넘겨서 해당 IP 주소의 객체를 반환받아 이 주소가 정상적인 IP 주소 체계인지를 판단하고 정상적인 IP 주소일 경우 IP버전의 객체로 반환합니다.

위 테스트에서 확인할 수 있는 것과 같이 ip_address() 함수만을 이용할 수 있고 좀 더 명확하게 IPv4Address() 혹은 IPv6Address() 함수를 이용하여 좀 더 명시적으로 사용 할 수 있겠습니다.

만약 정상적인 IP 주소가 아닌 값을 인자로 넣었을 경우 위와 같이 IP 범위에 맞지 않기 때문에 에러를 반환하게 됩니다.

위와 같이 ip_address의 함수를 이용하여 객체를 얻어 오고 그 객체에서 제공하는 다항한 기능들 중 유용한 속성 및 함수들을 테스트 하겠습니다.

version

IP 버전 정보를 확인하여 출력합니다.

IPv4는 4를 반환하고 IPv6는 6을 반환합니다.

ipaddress.ip_address('10.10.10.10').version
# 4

max_prefixlen

IP 버전에 대한 표현 가능한 총 비트 수를 반환합니다.

IPv4는 32를 반환하고 IPv6은 128를 반환합니다.

ipaddress.ip_address('10.10.10.128').max_prefixlen
# 32

compressed, exploded

입력된 인자(ip)에 대하여 ipaddress 객체가 아닌 ip 주소(str)를 반환합니다.

ipaddress.ip_address('10.10.10.10').compressed
ipaddress.ip_address('10.10.10.10').exploded
# '10.10.10.10'

ip_address()와 compressed, exploded를 사용했을 때의 차이를 type()을 통해 확인할 수 있겠습니다.

type(ipaddress.ip_address('10.10.10.10'))  # ipaddress.IPv4Address
type(ipaddress.ip_address('10.10.10.10').compressed)  # str
type(ipaddress.ip_address('10.10.10.10').exploded)  # str

is_private, is_global

IP 주소의 사설IP/공인IP 여부를 판단하여 결과를 반환합니다.

# is_private #
ipaddress.ip_address('10.10.10.10').is_private  # True : 사설IP
ipaddress.ip_address('14.14.14.14').is_private  # False : 공인IP

# is_global #
ipaddress.ip_address('10.10.10.10').is_global  # False : 사설IP
ipaddress.ip_address('14.14.14.14').is_global  # True : 공인IP

is_loopback

IP 주소의 루프백 주소 여부를 판단하여 결과를 반환합니다.

ipaddress.ip_address('10.10.10.10').is_loopback  # False
ipaddress.ip_address('127.0.0.1').is_loopback  # True

ip_address() 대신 IPv4Address(), IPv6Address()를 사용했을 때도 동일하게 사용할 수 있겠습니다.


IP Network 객체

import ipaddress

ipaddress.ip_network('10.10.10.10')
# IPv4Network('10.10.10.10/32')

ipaddress.IPv4Network('10.10.10.10')
# IPv4Network('10.10.10.10/32')

ipaddress.ip_network('2001:db8::')
# IPv6Network('2001:db8::/128')

ipaddress.IPv6Network('2001:db8::')
# IPv6Network('2001:db8::/128')

ipaddress.ip_network('10.10.10.0/32')
# IPv4Network('10.10.10.0/32')

ipaddress.ip_network('10.10.10.0/24')
# IPv4Network('10.10.10.0/24')

ipaddress.ip_network('10.10.10.10/24')
# ValueError: 10.10.10.10/24 has host bits set

ipaddress.ip_network('10.10.10.10/24', strict=False)
# IPv4Network('10.10.10.0/24')
ipaddress.ip_network('10.10.10.130/27', strict=False)
# IPv4Network('10.10.10.128/27')
==> 10.10.10.10/24의 비트 정보에 맞게 끝자리를 강제 셋팅합니다.

ipaddress.ip_network('10.10.10.0/36')
# ValueError: '10.10.10.0/36' does not appear to be an IPv4 or IPv6 network

IP 주소를 인자로 넘겨서 해당 IP 주소(네트워크)가 정상적인 정보인지를 판단하고 정상적인 IP 네트워크 체계일 경우 IP 네트워크 객체를 반환합니다.

위 테스트에서 확인할 수 있는 것과 같이 ip_network() 함수만을 이용할 수 있고 좀 더 명확하게 IPv4Network() 혹은 IPv6Network() 함수를 이용하여 좀 더 명시적으로 사용 할 수 있겠습니다.

만약 정상적인 네트워크가 아닌 값을 인자로 넣었을 경우 위와 같이 IPv4, IPv6로 표현할 수 없다는 에러를 반환하게 됩니다.

위와 같이 ip_network의 함수를 이용하여 객체를 얻어 오고 그 객체에서 제공하는 다항한 기능들 중 유용한 속성 및 함수들을 테스트 하겠습니다.

기본적으로 ip_address() 객체에서 제공하는 기능들은 동일하게 사용할 수 있습니다. ip_network() 객체에서만 제공하는 기능에 대해서만 테스트를 하고 나열해 보겠습니다.

network_address

네트워크(ip_network)의 네트워크 주소(ip_address)로 반환합니다.

ipaddress.ip_network('10.10.10.0/24').network_address
# IPv4Address('10.10.10.0')

boradcast_address

네트워크의 브로드 캐스트 주소를 반환합니다.

ipaddress.ip_network('10.10.10.0/24').broadcast_address
# IPv4Address('10.10.10.255')

hostmask, netmask

hostmask는 네트워크의 호스트 마스크 주소를 반환합니다.

netmask는 네트워크의 넷 마스크 주소를 반환합니다.

# hostmask #
ipaddress.ip_network('10.10.10.0/24').hostmask
# IPv4Address('0.0.0.255')

# netmask #
ipaddress.ip_network('10.10.10.0/24').netmask
# IPv4Address('255.255.255.0')

with_hostmask, with_netmask

호스트 마스크, 넷 마스크를 표기법에 맞게 포함된 문자열 형태로 반환합니다.

# with_hostmask #
ipaddress.ip_network('10.10.10.0/24').with_hostmask
# '10.10.10.0/0.0.0.255'

# with_netmask #
ipaddress.ip_network('10.10.10.0/24').with_netmask
# '10.10.10.0/255.255.255.0'

num_addresses, hosts()

num_addresses는 네트워크의 사용 가능한 주소(호스트)의 수를 반환합니다.

hosts()는 사용 가능한 주소(호스트)를 리스트 형태로 모두 반환합니다.

# num_addresses #
ipaddress.ip_network('10.10.10.0/24').num_addresses  # 256
ipaddress.ip_network('10.10.10.0/27').num_addresses  # 32

# hosts() #
list(ipaddress.ip_network('10.10.10.0/31').hosts())
# [IPv4Address('10.10.10.0'), IPv4Address('10.10.10.1')]

list(ipaddress.ip_network('10.10.10.0/29').hosts())
# [IPv4Address('10.10.10.1'), IPv4Address('10.10.10.2'), IPv4Address('10.10.10.3'), IPv4Address('10.10.10.4'), IPv4Address('10.10.10.5'), IPv4Address('10.10.10.6')]

overlaps(network)

네트워크가 다른 네트워크에 포함되는지 여부를 판단합니다.

포함될 경우 ‘True’를 반환하고 포함되지 않을 경우 ‘False’를 반환합니다.

network_1 = ipaddress.ip_network('10.10.10.128')
network_2 = ipaddress.ip_network('10.10.10.0/31')
network_1.overlaps(network_2)  # False

network_1 = ipaddress.ip_network('10.10.10.128')
network_2 = ipaddress.ip_network('10.10.10.0/24')
network_1.overlaps(network_2)  # True

address_exclude(network)

네트워크 범위 중에서 특정 네트워크를 제외한 결과를 리스트로 반환합니다.

network_1 = ipaddress.ip_network('10.10.10.0/30')
network_2 = ipaddress.ip_network('10.10.10.2/32')
print(list(network_1))
# [IPv4Address('10.10.10.0'), IPv4Address('10.10.10.1'), Pv4Address('10.10.10.2'), IPv4Address('10.10.10.3')] 

print(list(network_1.address_exclude(network_2)))
# [IPv4Network('10.10.10.0/31'), IPv4Network('10.10.10.3/32')]

10.10.10.0 ~ 10.10.10.3 까지의 네트워크 범위중 10.10.10.2/32가 제외된 상태로 반환됩니다. 10.10.10.0 ~ 10.10.10.1은 10.10.10.0/31 범위입니다.

여기까지 ipaddress 라이브러리에 대하여 정리해 보았습니다.

더 자세한 내용과 정리되지 않은 기능은 python 공식 사이트의 문서를 참고하면 더 많은 내용을 확인할 수 있겠습니다.


레퍼런스

https://docs.python.org/ko/3/library/ipaddress.html



Leave a Comment