
geoip2 라이브러리의 asn 함수는 IP 주소에 대한 AS 번호를 반환합니다. 하지만, 사설 IP 주소나 잘못된 IP 주소에 대해 asn 함수는 AddressNotFoundError를 발생시키거나 NULL을 반환할 수 있습니다.
사설 IP 주소에 대한 AS 번호를 조회하는 경우 NULL이 반환되는 이유는 geoip2 데이터베이스에 사설 IP 주소의 AS 번호가 포함되어 있지 않기 때문입니다.
이러한 경우를 처리하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.
1. 사설 IP 주소의 경우 NULL을 반환하도록 수정할 수 있습니다. 예를 들어, 사설 IP 주소인 192.168.1.1에 대해 NULL을 반환하는 코드는 다음과 같습니다.
#hostingforum.kr
python
import geoip2.database
reader = geoip2.database.Reader('GeoLite2-Country.mmdb')
def get_as_number(ip):
try:
response = reader.asn(ip)
return response.autonomous_system_number
except geoip2.errors.AddressNotFoundError:
if ip.startswith('192.168.') or ip.startswith('10.') or ip.startswith('172.16.') or ip.startswith('172.17.') or ip.startswith('172.18.') or ip.startswith('172.19.') or ip.startswith('172.20.') or ip.startswith('172.21.') or ip.startswith('172.22.') or ip.startswith('172.23.') or ip.startswith('172.24.') or ip.startswith('172.25.') or ip.startswith('172.26.') or ip.startswith('172.27.') or ip.startswith('172.28.') or ip.startswith('172.29.') or ip.startswith('172.30.') or ip.startswith('172.31.') or ip.startswith('127.'):
return None
else:
return None
ip = "192.168.1.1"
print(get_as_number(ip))
2. 사설 IP 주소의 경우 AS 번호를 추정하도록 수정할 수 있습니다. 예를 들어, 사설 IP 주소인 192.168.1.1에 대한 AS 번호를 추정하는 코드는 다음과 같습니다.
#hostingforum.kr
python
import geoip2.database
import ipaddress
reader = geoip2.database.Reader('GeoLite2-Country.mmdb')
def get_as_number(ip):
try:
response = reader.asn(ip)
return response.autonomous_system_number
except geoip2.errors.AddressNotFoundError:
try:
ipaddress.IPv4Address(ip)
return "사설 IP 주소입니다."
except ValueError:
return None
ip = "192.168.1.1"
print(get_as_number(ip))
3. 사설 IP 주소의 경우 NULL을 반환하도록 수정하고, WELL-KNOWN PRIVATE ADDRESSES를 제외한 사설 IP 주소에 대한 AS 번호를 추정하도록 수정할 수 있습니다. 예를 들어, 사설 IP 주소인 192.168.1.1에 대한 AS 번호를 추정하는 코드는 다음과 같습니다.
#hostingforum.kr
python
import geoip2.database
import ipaddress
reader = geoip2.database.Reader('GeoLite2-Country.mmdb')
def get_as_number(ip):
try:
response = reader.asn(ip)
return response.autonomous_system_number
except geoip2.errors.AddressNotFoundError:
if ip.startswith('192.168.') or ip.startswith('10.') or ip.startswith('172.16.') or ip.startswith('172.17.') or ip.startswith('172.18.') or ip.startswith('172.19.') or ip.startswith('172.20.') or ip.startswith('172.21.') or ip.startswith('172.22.') or ip.startswith('172.23.') or ip.startswith('172.24.') or ip.startswith('172.25.') or ip.startswith('172.26.') or ip.startswith('172.27.') or ip.startswith('172.28.') or ip.startswith('172.29.') or ip.startswith('172.30.') or ip.startswith('172.31.') or ip.startswith('127.'):
if ip.startswith('192.168.') or ip.startswith('10.') or ip.startswith('172.16.') or ip.startswith('172.17.') or ip.startswith('172.18.') or ip.startswith('172.19.') or ip.startswith('172.20.') or ip.startswith('172.21.') or ip.startswith('172.22.') or ip.startswith('172.23.') or ip.startswith('172.24.') or ip.startswith('172.25.') or ip.startswith('172.26.') or ip.startswith('172.27.') or ip.startswith('172.28.') or ip.startswith('172.29.') or ip.startswith('172.30.') or ip.startswith('172.31.'):
return "사설 IP 주소입니다."
else:
try:
ipaddress.IPv4Address(ip)
return "사설 IP 주소입니다."
except ValueError:
return None
else:
return None
ip = "192.168.1.1"
print(get_as_number(ip))
2025-06-04 01:00