メールサーバ - 証明書・接続拒否・中継確認 - 拒否アドレス定義


クラウディア 


1. 概要
2. アドレスの定義
3. プログラム
4. Makefile

1. 概要

 「ネットワークサービス - お役立ち・面白サイト」に、国別の「IP」アドレスをデータベースから取得できるサービスを紹介しております。  これをうまく利用して、拒否アドレスを定義しようと思います。

2. アドレスの定義

 冒頭で紹介したサイトの下記のページから、国別の「IPv4」データベースをダウンロードできます。
IP2Location™ LITE IP-COUNTRY Database
 ダウンロードしたファイルは、「.zip」形式になっており、解凍すると、下記のファイルが展開されます。

IP2LOCATION-LITE-DB1.CSV
LICENSE-CC-BY-SA-4.0.TXT
README_LITE.TXT
 本命は、「.csv」ファイルでして、中身は。

"0","16777215","-","-"
”16777216","16777471","AU","Australia"
"16777472","16778239","CN","China"
"16778240","16779263","AU","Australia"
"16779264","16781311","CN","China"
 てな感じになっております。  2025年5月29日時点で、254,827行あります。  前の2つが、10進表記で「IPv4」の開始、終了アドレスを示しています。  後の2つが、国の識別で、ドメインコードと国名になっています。  これをうまく利用すれば、「tcprules」を定義するファイルが作成できるのではないかと思います。

3. プログラム

 「python」で、「tcprules」の定義ファイルを作成するプログラムを組んでみました。  登場人物は、3人。

IP2LOCATION-LITE-DB1.CSV
allow.txt
ipfilter.py
 「IP2LOCATION-LITE-DB1.CSV」は、前項で解凍したものです。  「allow.txt」は、接続許可、中継許可のアドレスを記載したものです。  「ipfilter.py」が、プログラム本体になります。  ざっと、以下のように記述しています。

import csv
import ipaddress
import os

deny = [ 'CN' ]

os.chdir(os.path.dirname(__file__))
allowFile  = 'allow.txt'
listFile   = 'IP2LOCATION-LITE-DB1.CSV'
outputFile = 'tcp.smtp'

myList = []

with open(listFile) as file:
  reader = csv.reader(file, quotechar='"')

  for row in reader:
    if row[2] == '-':
      continue

    start = str(ipaddress.IPv4Address(int(row[0])))
    end   = str(ipaddress.IPv4Address(int(row[1])))

    startSplit = start.split('.')
    endSplit   = end.split('.')

    ipRange = start + '-' + end

    for i in range(4):
      if startSplit[i] != endSplit[i]:

        if i == 1:
          ipRange = startSplit[0] +'.'+ startSplit[1] +'-'+ endSplit[i] +'.'
          break

        if i == 2:
          ipRange = startSplit[0] +'.'+ startSplit[1] +'.'+ startSplit[2] +'-'+ endSplit[i] +'.'
          break

        if i == 3:
          ipRange = start +'-'+ endSplit[i]

    dic = { 'country': row[2], 'start': start, 'end': end, 'range': ipRange  }
    myList.append(dic)

with open(outputFile, 'w') as file:

  with open(allowFile) as allow:
    file.write(allow.read())

  for one in myList:
    if one['country'] in deny:
      file.write(one['range'] + ':deny\n')

  file.write(':allow')
 14~44行目で、「IP2LOCATION-LITE-DB1.CSV」を読んで。  例えば、下記のような。

{'country': 'SG', 'start': '223.255.254.0', 'end': '223.255.254.255', 'range': '223.255.254.0-255'}
 国別コード、開始アドレス、終了アドレス、アドレス範囲の「dict」のリストを作成します。  アドレス範囲が一発で書ければいいのですが、そのようなライブラリを見つけることができませんでした。  24~41行で、アドレス範囲を作成しているのですが、なんとなくうまくいっているものの、くっきり正しいかが証明できていない。  誰か、問題があれば、指摘してください。  46~55行で、「smtp.tcp」を作成します。  48~49行で、「allow.txt」を読み込んでそのまま出力。  51~53行で、5行目で定義してある、接続拒否する国と一致する国別コードのリストを。

1.0.1-3.:deny
 てな感じで出力します。  中国を例題に出して、とても申しわけないんだけれども、中国からの攻撃が一番多いんだもの。  接続拒否する国を増やす場合は、5行目に列挙していけばいいわけです。  最後に。

:allow
 とどれにも当てはまらないアドレスは、接続のみ受け付けるようにして、終了します。

4. Makefile

 下記のような「Makefile」を作成します。  (実際のものは、パスをつけてあります)

all: smtp

smtp:
	python ipfilter.py
	tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp
	tcprulescheck tcp.smtp.cdb

check:
	tcprulescheck tcp.smtp.cdb
 これで、「allow.txt」を変更したり、接続拒否する国を増減したら。

make
 一発で、ファイルを作成しなおすことができます。  下記のコマンドで。

make check TCPREMOTEIP=ip_address
 「=」の後ろに指定したアドレスが、中継可・接続可・接続拒否のいずれであるかを判定することができます。

earthcar(アースカー)
ネットオークションの相場、統計、価格比較といえばオークファン
Star Naming Gift
マイニングベース