thirose’s blog

openstackやpythonなどなど

特定のIPだけ許可したい時の判定方法

プライベートクラウドを運用していると、当然 DNS as a Serviceなんかも提供することになるのですが、OpenStackでは、Designateが第一選択肢として上がると思います。

そして、プライベートクラウドで外部IPを登録されてしまっては困るので、そういった部分は制限したいという要望がでてきます。

また、社内システムなんかでも特定のIPレンジだけ許可したいということもあるでしょう。そういったときにどうすべきか考えなくてはいけなかったので、考えてみました。

pythonのipaddressというモジュールを使います。

ipaddress.ip_networkで、networkを出します。  WHITE_LISTに登録された、IPレンジ、IPアドレスを一つずつチェックしていきます。 20.20.20.20みたいIP アドレスを直に指定すると、 20.20.20.20/32とされます。

そして、そのレンジに対象のIPがマッチするかどうかチェックしていくと簡単にマッチするかどうか判定できます。 

deny list等を作るとレンジが大きすぎるため、IPをどうにか制限したいと言う場合はallow listとした方が 管理も簡単になります。

スクリプト

#/usr/bin/env python
# coding: utf-8

import ipaddress

ALLOW_LIST  = ['10.0.0.0/8', '192.168.0.0/16', '20.20.20.20']


def checker(ip):
  for wl in ALLOW_LIST:
    ip_nw = ipaddress.ip_network(wl)
    if ip in ip_nw:
      result = True
      break
    else:
      result = False
  return result


if __name__ == "__main__":
  ip = ipaddress.ip_address('10.10.10.10')
  print('result: ', checker(ip))
  ip = ipaddress.ip_address('1.10.10.10')
  print('result: ', checker(ip))
  ip = ipaddress.ip_address('192.168.0.5')
  print('result: ', checker(ip))
  ip = ipaddress.ip_address('20.20.20.20')
  print('result: ', checker(ip))

実行結果

$ python ip_checket.py
result:  True
result:  False
result:  True
result:  True