Top > milter-regex 3.X GeoIP Lang: JA EN   |   最終更新日 : 2023/5/7

milter-regex 3.X GeoIP

  1.  概要
  2.  ライセンス
  3.  ダウンロード
  4.  GeoIPデータの準備
  5.  GeoIPを利用するmilter-regexの設定ファイル

1. 概要

milter-regex 3.X は、Daniel Hartmeier 氏の milter-regex に GeoIPの機能を追加した後継バージョンです。

GeoIP 関する全ての処理は、milter-regex のソース・コードで実装しています。
MaxMind社のライブラリやその他の GeoIP ライブラリは利用していません。

GeoIPデータには、地域インターネット・レジストリ ( Regional Internet Registry ) のIPアドレス割り当てリストを利用します。
これらのリストは、milter-regex パッケージに含まれるスタンドアロンのユーティリティ・プログラムでASCII形式からバイナリ形式に変換します。

https://github.com/milter-regex ・・・バージョン 3.0 以降
https://www.benzedrine.ch/milter-regex.html ・・・バージョン 2.7 まで

2. ライセンス

ライセンスは、オリジナルの milter-regex により、BSDライセンスです。
ライセンスのもとで、どなたでも、個人利用/商用利用を問わず、ご自由にご活用いただけます。


3. ダウンロード

GitHub   https://github.com/milter-regex/milter-regex/releases/tag/3.1


4. GeoIPデータの準備

5つの地域インターネット・レジストリ ( Regional Internet Registry ) のIPアドレス割り当てリストを取得します。

$ ftp

ftp> open ftp.afrinic.net
Name: anonymous
Password:
ftp> cd /pub/stats/afrinic
ftp> get delegated-afrinic-latest
ftp> close

ftp> open ftp.apnic.net
Name: anonymous
Password:
ftp> cd /pub/stats/apnic
ftp> get delegated-apnic-latest
ftp> close

ftp> open ftp.arin.net
Name: anonymous
Password:
ftp> cd /pub/stats/arin
ftp> get delegated-arin-extended-latest
ftp> close

ftp> open ftp.lacnic.net
Name: anonymous
Password:
ftp> cd /pub/stats/lacnic
ftp> get delegated-lacnic-latest
ftp> close

ftp> open ftp.ripe.net
Name: anonymous
Password:
ftp> cd /pub/stats/ripencc
ftp> get delegated-ripencc-latest
ftp> close

ftp> quit

milter-regex パッケージに含まれるスタンドアロンのユーティリティ・プログラムでASCII形式からバイナリ形式に変換します。

cat delegated-*-latest | grep '|..|ipv[46]|' | sort -t '|' -k 3,4 | /_path_/milter-regex-ip-prep ipv4.dat ipv6.dat

5. GeoIPを利用するmilter-regexの設定ファイル

milter-regex でGeoIPを利用するには、最初に ipv4file, ipv6file, geoipCashMax, geoipCashKeep のキーワードを設定し、
続いてローカル・ネットワークの許可、そして、ブロック条件を設定します。

####################################################################################################
#####
#####     00-settings.conf
#####
####################################################################################################

# ipv4file, ipv6file
#
# Before use keyword 'country', both these keywords must be specified.
#
# Get RIR allocation data
#
# (1) Download IP address allocation lists from the RIR ( Regianl Internet Registry )
#     ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
#     ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
#     ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
#     ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
#     ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest
#
# (2) Convert IP address allocation lists from ASCII format to binary format
#     cat delegated-*-latest | grep '|..|ipv[46]|' | sort -t '|' -k 3,4 | /usr/local/sbin/milter-regex-ip-prep ipv4.dat ipv6.dat
#
# Maximum path length is 1023 characters.
#
ipv4file "/var/lib/milter-regex/ipv4.dat"
ipv6file "/var/lib/milter-regex/ipv6.dat"

# geoipCashMax
#
# Default  100K ( Minimum size )
# Unit     None: Byte | k/K: KByte | m/M: MByte
#
geoipCashMax  2M

# geoipCashKeep
#
# Default  7D
# Unit     None: Second | h/H: Hour | d/D: Day
#
geoipCashKeep 10D

####################################################################################################
#####
#####     10-passlist.conf
#####
####################################################################################################

accept

# Loopback and Local network

connect // /^127\./

connect // /^10\./
connect // /^169\.254\./
connect // /^172\.(1[6-9]|2[0-9]|3[0-1])\./e
connect // /^192\.168\./

connect // /^::1$/
connect // /^fd/
connect // /^fe80:/

# Local network ( Global IP address )

connect // /^192\.0\.2\./
connect // /^2001:db8:/

####################################################################################################
#####
#####     21-blocklist.conf ( GeoIP sample rules )
#####
####################################################################################################

reject "Refused connection by site policy."

# Email is not sent from the country

country /(XX|XY|XZ)/e and envfrom /[.@]example\.com>$/

country /JP/n and connect /\.jp$/n // and envfrom /[.@]example\.jp>$/

####################################################################################################
#####
#####     22-blockhelo.conf
#####
####################################################################################################

# Not client host name

reject "Refused connection by site policy. ( Malformed HELO )"

helo /^foobar\.example\.jp$/i and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n and connect // /^2001:db8::1$/n
helo /^\[*192\.0\.2\.1\]*$/   and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n and connect // /^2001:db8::1$/n
helo /^\[*2001:db8::1\]*$/    and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n and connect // /^2001:db8::1$/n
helo /^localhost$/i           and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n and connect // /^2001:db8::1$/n
helo /^\[*127\.0\.0\.1\]*$/   and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n and connect // /^2001:db8::1$/n
helo /^\[*::1\]*$/            and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n and connect // /^2001:db8::1$/n

# Only dot

reject "Refused connection by site policy. ( Invalid HELO )"

helo /^\.$/

# Nonexistent TLD

reject "Refused connection by site policy. ( Nonexistent TLD )"

helo /\.domain$/
helo /\.local$/
helo /\.localdomain$/

# Reserved domain

reject "Refused connection by site policy. ( Reserved domain )"

helo /^(.+\.)?example\.[^.]+$/ei

# Maybe spam or scan

reject "Refused connection by site policy."

helo /^User$/i
helo /^ylmf-pc$/i
helo /^info-api\.ru$/i
helo /^dc3-dc1$/i
helo /^masscan$/i
helo /^gerg$/i
helo /^admin$/i
helo /^scanner\.sslsonar\.org$/

https://github.com/milter-regex/milter-regex/wiki