BLOGTIMES
2017/01/21

milter-manager を使って特定の IP からの接続時に milters を適用しないようにする

  ruby  postfix  milter 
このエントリーをはてなブックマークに追加

Postfix + milter-manager 環境にメールサーバーを移行したのですが、特定の IP のサーバをホワイトリストに入れて milter を適用しないようにしたかったのでいろいろ調べてみたら「how to bypass milters, whitelist hosts」という掲示板のスレッドを見つけたので、これを参考にちょっと Ruby でコーディングしてみました。

netaddr をインストール

ホワイトリストは単一の IP ではなく CIDR を使った指定がしたかったので、IP アドレスのレンジを自動的に計算してくれる netaddr を使うことにしました。モジュールは以下のように gem を使って一撃で導入することができます。

gem install netaddr

設定は milter-manager.local.conf で

まず、ホワイトリストを用意します。CIDR で1行に1つずつ記述しておいてください。
ファイルの場所は以下の Ruby 内のホワイトリストのパスと合せてください。

/etc/milter-manager/whitelist

192.168.1.0/24 192.168.100.100 10.0.0.0/8

あとは以下の内容を milter-manager.local.conf に追加(ファイルがない場合は作成してください)して、milter-manager を restart すれば OK。
ホワイトリストの IP からアクセスすると [stop] というログが残るのが確認できると思います。

/etc/milter-manager/milter-manager.local.conf

# IP-based Whitelist # Based on http://postfix.1071664.n5.nabble.com/how-to-bypass-milters-whitelist-hosts-td35207.html require 'netaddr' whitelist = NetAddr::Tree.new() File.read("/etc/milter-manager/whitelist").each_line do |line| next if /^#/ =~ line whitelist.add!(line.strip) end # Check host ip with whitelist. define_applicable_condition("Whitelist") do |condition| condition.description = "Whitelist" condition.define_connect_stopper do |context, host, address| return false unless address.to_ip_address whitelist.longest_match(address.address).to_i != 0 end end # Apply whitelist to all defined milters. defined_milters.each do |name| define_milter(name) do |milter| milter.add_applicable_condition("Whitelist") end end

意外と milter-manager の拡張は簡単にできることが分かったのでいろいろと工夫のし甲斐がありそうです。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9093
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン