개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.06.04 00:59

GeoIP AS Number 조회에 대한 질문

목록
  • WebSocket광 2일 전 2025.06.04 00:59
  • 2
    1
저는 geoip_asnum_by_name 함수를 사용하여 AS 번호를 조회하려고 하는데, 어떤 경우에 NULL이 반환되는지 궁금합니다.

저는 다음과 같은 코드를 작성했지만, 특정 IP 주소에 대한 AS 번호가 NULL이 반환되는 것을 발견했습니다.

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:

        return None



ip = "192.168.1.1"

print(get_as_number(ip))



이 함수에서 NULL이 반환되는 이유는 무엇이며, 어떻게 이를 해결할 수 있을까요?

예를 들어, "192.168.1.1"과 같이 사설 IP 주소에 대한 AS 번호를 조회하는 경우 NULL이 반환되는 것을 어떻게 처리할 수 있을까요?

    댓글목록

    profile_image
    나우호스팅  2일 전



    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

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 25,445건 / 3 페이지

검색

게시물 검색