[python] private / public아이피 구분하는 스크립트

아이피가 퍼블릭인지 사설아이피인지
구분해야할 필요가 있어서, 쉘스크립트로 만들려고 찾아보다가
포기하고 쉘에서 스크립트언어를 불러오는 방법으로 변경했다.

요즘 루비를 공부중인지라 루비로 만들고 싶었지만,
회사의 서버에는 루비가 거의 설치가 안되어 있는지라

회사의 서버에 대부분 설치 되어 있는 파이썬으로 만들었다.

첨에는 어떻게 해야되는지 좀 막막했는데,
아래 링크의 소스를 보니 그렇게 어렵지 않았다.
파이썬의 소스도 아래링크의 php소스를 파이썬으로 변경한것이다.

Check private IP function PHP

그리고 스택오버플로우에 무지하게 간단한 방법이 있긴했는데,
뭔가 모듈을 설치해야되는것 같았다.
http://stackoverflow.com/questions/691045/how-do-you-determine-if-an-ip-address-is-private-in-python

그래서 그냥 php소스를 python으로 변경하는것으로 최종 결정했다.

아래는 포팅한 소스이다.
파이썬을 잘하는 편이 아닌지라 되도록 간단히 만들려고 노력했다.

원리는 ip를 long타입으로 변환해서 privateip구간에 있는지 체크하는 원리이다.
뭔가 더 좋은게 있을것 같긴한데…(아시는분은 코멘트 좀 부탁드려요.^^)

isPrivateIp.py

import sys
from struct import *
from socket import *

if len(sys.argv) != 2:
    print "input just one parameter."
    sys.exit()

input_ip = sys.argv[1]

private_addrs = ['10.0.0.0|10.255.255.255',
                 '172.16.0.0|172.31.255.255',
                 '192.168.0.0|192.168.255.255',
                 '169.254.0.0|169.254.255.255',
                 '127.0.0.0|127.255.255.255'
                 ]

def ip2long(ip_addr):
    ip_packed = inet_aton(ip_addr)
    ip = unpack("!L", ip_packed)[0]
    return ip

def isPrivateIP(ip_addr):
    long_ip = ip2long(ip_addr)
    if long_ip != -1:
        for private_addr in private_addrs:
            start, end = private_addr.split("|")

            if long_ip >= ip2long(start) and long_ip <= ip2long(end):
                return 'PRIVATE'

    return 'PUBLIC'

print(isPrivateIP(input_ip))

쉘에서 사용하는 경우

IP_TYPE="`python ${DEPLOY_HOME}/isPrivateIp.py $IPADDR`"
echo "IP type is $IP_TYPE"

if [ "$IP_TYPE" == "PRIVATE" ];then
	echo "PIVATE IP!"

fi