- 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
「=」の後ろに指定したアドレスが、中継可・接続可・接続拒否のいずれであるかを判定することができます。
|