IP address (Internet Protocol Address)는 인터넷과 같은 네트워크에서 각각의 컴퓨터나 장치를 구별하는 데 사용되는 고유한 주소입니다.
IP 주소의 종류로는 IPv4와 IPv6가 있는데요. 아 라이브러리를 사용하면서 IPv6를 사용해본적은 없네요.
- IPv4 주소:
- 현재 가장 널리 사용되는 IP 주소 형식입니다.
- 32비트로 구성되며, 점으로 구분된 네 개의 숫자로 표현됩니다 (예: 192.168.1.1).
- 약 43억 개의 고유 주소를 제공합니다.
- IPv6 주소:
- IPv4 주소의 고갈 문제를 해결하기 위해 도입된 새로운 형식인데 아주 많이 사용하고 있지는 않은데요.
- 128비트로 구성되며, 콜론으로 구분된 여덟 그룹의 16진수로 표현됩니다 (예: 2001:0db8:85a3:0000:0000:8a2e:0370:7334).
- 거의 무한에 가까운 주소 공간을 제공합니다.
이 IP 주소를 Python으로 다루는 것이 ipaddress(Python Document) 라이브러리 입니다. 이 라이브러리는 Python 3.3 부터 추가된 표준 라이브러리 중 하나로, IP 주소, 네트워크, 서브넷 마스크의 생성, 조작 및 검사를 도와주는 모듈입니다.
주요 기능
- IP 주소 생성 및 조작: 문자열이나 정수 형태의 데이터로부터 IP 주소 객체를 생성해 IP 주소에 관련된 다양한 작업을 수행할 수 있습니다.
- 네트워크와 서브넷: IP 네트워크 주소를 쉽게 생성하고 관리할 수 있으며, 네트워크 내에서 호스트들의 IP를 계산하거나 서브넷(IP 범위)를 표현 할 수 있습니다.
- 주소 유효성 검사: 주어진 IP 주소가 특정 네트워크에 속하는지, 공용 IP 주소인지, 사설 IP 주소인지 등을 확인할 수 있습니다.
- 인터페이스 주소: 네트워크 인터페이스에 할당된 IP 주소와 그 네트워크의 주소를 함께 관리할 수 있습니다.
IP address Code
from ipaddress import IPv4Network
from ipaddress import IPv4Address
IPv4Address(3691907365) # IPv4Address('220.14.9.37')
addr = IPv4Address(b"\xdc\x0e\t%") # IPv4Address('220.14.9.37')
print(int(addr)) # 3691907365
print(addr.packed) # b'\xdc\x0e\t%'
net = IPv4Network("192.4.2.0/24")
print(net.num_addresses) # 256
print(net.prefixlen) # 24
print(net.netmask) # IPv4Address('255.255.255.0')
print(IPv4Address("192.4.2.12") in net) # True
print(IPv4Address("192.4.20.2") in net) # False
print(IPv4Network("192.4.2.0/255.255.255.0")) # IPv4Network('192.4.2.0/24')
print(net.broadcast_address) # IPv4Address('192.4.2.255')
for addr in net:
print(addr)
'''
192.4.2.0
192.4.2.1
192.4.2.2
. . .
192.4.2.13
192.4.2.14
192.4.2.15
'''
h = net.hosts()
print(type(h)) # <class 'generator'>
print(next(h)) # IPv4Address('192.4.2.1')
print(next(h)) # IPv4Address('192.4.2.2')
small_net = IPv4Network("192.0.2.0/28")
big_net = IPv4Network("192.0.0.0/16")
print(small_net.subnet_of(big_net)) # True
print(big_net.supernet_of(small_net)) # True
if IPv4Address('192.0.0.1') in IPv4Network("192.0.0.0/16"): #True
print("Subnet")
Output
3691907365
b'xdcx0et%'
256
24
255.255.255.0
True
False
192.4.2.0/24
192.4.2.255
192.4.2.0
192.4.2.1
....
192.4.2.254
192.4.2.255
<class 'generator'>
192.4.2.1
192.4.2.2
True
True
Subnet
이와 같이 Network IP 주소를 여러가지 방식으로 조작하거나 검증 할 수 있는데요. 데이터쪽 강의만 듣고 실무를 시작했을때는 이런 함수가 있는줄 몰라서 상당히 고민을 많이 했었던 기억이 나네요.
특정 대역을 벋어나는 IP가 있는지 검색해야되는데 13만개의 IP를 5,000개의 서브넷에서 포함되어 있는지를 확인해야되 간단한 Python 코드를 만들었던 기억이 나네요.