sleepingbird.net Home since May.11 2003
Copyright sleepingbird, 1993- All rights reserved.
Linux Server

TOP > Linux Server > Mail server (Postfix)

設定(main.cf)

Vine Linux 4.0
Jan. 14 2007

 Vine Linux 4.0 の標準 MTA は postfix。簡単な設定でメールの送受信が可能になる。
 設定ファイルは /etc/postfix/main.cf。
 設定する箇所は次のとおり。
 それぞれ上段を下段のように直す。

 postfix を稼働させるホスト名称をセットする。

#myhostname = host.domain.tld

   ↓

myhostname = mail.qcp.jp

 ドメイン名の設定をする。
#mydomain = domain.tld

   ↓

mydomain = qcp.jp

 標準ではメールアドレスの@以下はマシン名だが、ドメイン名だけで使用できるようにする。
#myorigin = $myhostname
#myorigin = $mydomain

   ↓

#myorigin = $myhostname
myorigin = $mydomain

 @spike.qcp.jp @localhost.qcp.jp @mail.qcp.jp @qcp.jp を着信させることにする。
#mydestination = $myhostname, localhost.$mydomain
#mydestination = $myhostname, localhost.$mydomain $mydomain
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain

   ↓

#mydestination = $myhostname, localhost.$mydomain
mydestination = $myhostname, localhost.$mydomain, mail.$mydomain, $mydomain
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain

 信頼できるネットワークの設定。mynetworks_style で subnet のみ信頼することとし、mynetworks で subnet 範囲を指定する。
#mynetworks_style = class
#mynetworks_style = subnet
#mynetworks_style = host

   ↓

#mynetworks_style = class
mynetworks_style = subnet
#mynetworks_style = host
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table

   ↓

mynetworks = 10.99.0.0/16, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table

 これで postfix を再起動すればメール送信が使用できる。ただし、受信( pop3 )は qpopper がインストールされていないため、メーラーでの動作確認は最後に一括行う。
# /etc/init.d/postfix restart

 念のため、/var/log/maillog を覗いて、おかしなログが吐き出されていないか確認してみると良い。
 また、main.cf 設定状況を確認するには次のコマンドが有効である。これによりデフォルトでないパラメータの一覧が取得できる。
# postconf -n

 postfix に関する情報はPostfix のぺーじを参考にした。
Jun.17 2006
 このメールサーバーの欠点は、動的 IP アドレスのため ISP の SPAM 予防策に引っかかって着信しない、あるいは着信までに極端に時間が掛かることがあると言うこと。特に携帯電話系に至っては顕著で、実用性が無くなる場合が多い。また、この頃は、大手 ISP が SPAM 予防策として、Inbound / Outbound Port 25 Blocking (IP25B / OP25B) を行い始めたことで、よりいっそう自宅サーバーによるメール配信が危うくなっている。
 そこで救世主。私的 DNS サービスの My DNSで、メールリレーサービス をしている。詳しくは同ホームページで。
 ただし、SPAM の踏み台として悪用するとサービスを停止してしまうので、大切にお借りしましょう。

不正中継ブロック (APOP before SMTP)

Vine Linux 4.0
Jan. 14 2007

 SMTP には基本的にユーザー認証がない。SMTP のセキュリティについては、RFC2554 で定義された標準規格である SMTP AUTH があるが、通常の MTA インストールでは機能していない。このため、メールの配信要求があれば誰のものでも配信してしまう。Internet 創世記の頃はこれで良かったのかも知れないが、現在、このままサーバーを公開してしまうと SPAM の踏み台になってしまう。防御のため Local Net 以外からの要求を止めてしまうことも考えられるが、これだと出先からメールサーバーが使えなくて不便。
 そこで、SMTP AUTH 機能を組み込もうと思ったが、 main.cf 中の myhostname の指定を逆引きできるホスト名にしないと巧く機能しないらしい。このサーバーは ダイナミック DNS で稼働しているのでそれは無理。仕方ないので SMTP に疑似ユーザー認証機構を組み込む。
 具体的には、ユーザー認証機能のある POP で正規ユーザと認められた接続の IP アドレスを覚えておき、メール送信はその IP アドレスからの要求のみ受け付けるというもの。そして、POP 認証後一定時間でそのアドレスを消すことによりセキュリティを確保する。また、通常のPOP 認証はパスワードが平文でネットを流れてしまうので、セキュリティの高い APOP にする。
 APOP 認証を qpopper、IP アドレスの保存と消去を drac、SMTP をpostfix で行う。

不正中継ブロック (drac のインストール)

Vine Linux 4.0
Jan. 14 2007

 drac は apt-get install できるようになった。(以前から)
 POP Before SMTPで利用するパッケージを一括インストールする。
 VineLinux インストール直後は apt-get update で情報データベースを更新しないとインストールに失敗する。
 なお、darc の説明は Dynamic Relay Authorization Control(日本語)を参照。

$ su -
# apt-get update
# apt-get install postfix dracd db4 db4-devel db4-utils pam-devel gdbm-devel

 つぎに 設定ファイルをチェックする。
 次のとおり(デフォルト)であれば良い。違っていれば次のとおりに直す。
# vi /etc/mail/dracd.allow

# dracd.allow: clients trusted by rpc.dracd
#
# The format of this file is one of more lines of
#
# netmask netaddr
# Both netmask and netaddr must be dotted quads.
#
255.255.255.255 127.0.0.1
####
 保存した IP アドレスを消去するまでの時間を設定する。今回は 1 分にしておく。- i パラメータで初期化指定もしておく。
# vi /usr/sbin/rc.dracd

/usr/sbin/rpc.dracd &

   ↓

/usr/sbin/rpc.dracd -i -e 1 &
 サービスの起動と、サーバーブート時の自動起動の設定を行う。
# /etc/init.d/dracd start
# chkconfig dracd on

不正中継ブロック (qpopper のインストール)

Vine Linux 4.0
Feb. 11 2007

 qpopper のソースを Vine Linux から rpm で入手し、drac 用にコンパイル & インストールする。私が入手したのは qpopper-4.0.9-0vl4.src.rpm。まず、このソースをインストールする。

# cd
# wget ftp://ftp.vinelinux.org/pub/Vine/VinePlus/4.0/pool/qpopper-4.0.9-0vl4.src.rpm

# rpm -ivh qpopper-4.0.9-0vl4.src.rpm

 rpm/SPECS/qpopper.spec を編集する。
# cd rpm/SPECS
# vi qpopper.spec

 第一行目に DRACD を使用するか否かの宣言文があるので ON (0 以外)にする。Release リビジョンに DRACD 対応を明示。
%define USE_DRACD 0

   ↓

%define USE_DRACD 1

Release: 0vl4

   ↓

Release: 0vl4.DRACD
 rpm を作成し、古い qpopper を削除してからインストールする。パッケージは rpm/RPMS/i386 に生成されている。
 必要な開発パッケージを事前にインストールしておく。
# apt-get install openssl-devel
# rpm -ba qpopper.spec
# rpm -e qpopper (インストールしていなければエラー表示が出るだけ)
# cd ../../rpm/RPMS/i386
# rpm -ivh qpopper-4.0.9-0vl4.DRACD.i386.rpm

不正中継ブロック (postfix の設定変更)

Vine Linux 4.0
Jan. 14 2007

 postfix 設定ファイル /etc/postfix/main.cf の末尾に次の行を追加する。

allow_percent_hack = yes
smtpd_delay_reject=yes
# POP before SMTP
smtpd_recipient_restrictions =
        permit_mynetworks
        check_client_access hash:/etc/mail/dracd
        check_relay_domains

不正中継ブロック (daemon 再起動と APOP ユーザーの登録)

Vine Linux 4.0
Jan. 14 2007

 関連 daemon を(再)起動する。
 qpopper は inet 起動なので、inet を再起動する。

# apt-get install inetd
# vi /etc/inetd.conf

#pop-3 stream tcp nowait root /usr/sbin/tcpd in.qpopper
コメント行を、# をはずして生かす。

# /etc/init.d/inet restart
# /etc/init.d/dracd restart
# /etc/init.d/postfix restart

 apop のユーザー名データペースをフラッシュしてからユーザーを登録する。
# /usr/sbin/popauth -init
# /usr/sbin/popauth -user ユーザー名

 個々にユーザーを削除するには、次のようにする。
# /usr/sbin/popauth -delete ユーザー名

不正中継ブロック (ブロックの確認)

Vine Linux 4.0
Jan. 14 2007

 実際にセキュリティが機能しているか確認してみる。確認は、次の手順で行う。

 drac が IP アドレスの保存と消去を確実に行っているか確認する。

  1. IP アドレスが何も保存されていないことを確認する。
  2. APOP で受信操作をする。
  3. IP アドレスが保存されたことを確認する。
  4. 設定時間が経過するのを待つ。
  5. IP アドレスが消去されたことを確認する。

 drac データペースの状態によって送信操作が制御されていることを確認する。
  1. IP アドレスが何も保存されていないことを確認する。
  2. 受信操作をしないで送信操作のみを行い、要求が拒否されることを確認する。
  3. 受信操作を行い、直後の送信操作が受け入れられることを確認する。
  4. 設定時間後、送信操作が拒否されることを確認する。
 APOP 認証されたホストの IP アドレスは /etc/mail/dracd.db に保存される。その drac データペースの確認に必要なコマンドは次のとおり。
 なお、db_dump は db4-utils パッケージをインストールしておく必要がある。
(Dec.04 2004 現在、db4-utils はインストールパッケージが見あたらない。)
# rpc.dracd -i
データベース初期化

# apt-get install db4-utils
# db_dump -p /etc/mail/dracd.db
内容確認
 main.cf の設定変更により postfix は drac データベースファイルの内容によって送信操作が制御されるはず。
 しかし、postfix は drac の設定に優先して自domain からの要求は素直に受け付けてしまう。そこで、テスト用クライアントマシンの IP アドレスが自domain と認識されないようにしておかないとテストが出来ない。具体的には /etc/postfix/main.cf の mynetworks は = 127.0.0.0/8 としてループバックのみとする。また、DNS 引きが出来ないように、/etc/hosts ファイルと named の自己ゾーンファイルの両方からクライアントマシンのアドレスを外しておく必要がある。
 当然だが、メーラーに POP before SMTP の機能がある場合、設定を解除しておかなくてはテストにならない。

 自分でのテストが巧くいったら、第三者テストを行うと完璧。次の三カ所のサイトでメールサーバーが不正中継していないかテストしてくれる。

  • 有限会社長崎ネットワークサービス
  • NETWORK ABUSE CL
 なお、二番目のサイトはサーバーから telnet してもチェックしてくれる。
# telnet relay-test.mail-abuse.org
 このサイトの`ABUSE'でのテスト結果はこちら
Jan.14 2007
 VineLinux 4.0 からファイアウォール機能が実装された。標準で解放できるポートに SMTP(25) は有るが POP3(110) が無いので設定を忘れる事がある。その他のポート設定で TCP POP3 を追加しておく。OK をクリックした時点でポートが開く。「デスクトップ」-「システム管理」-「セキュリティレベルとファイヤーウォールの設定」

secpop3

Virtual Domain

Vine Linux 4.0
Jan. 14 2007

 postfix で異なる domain のメールを送受信する。
 新たに yatagarasu.jp という domain を取得したので、このドメインを使えるようにする。

 virtual domain のアドレスとリアル ユーザーとの関連づけを /etc/postfix/virtual に追加する。

# vi /etc/postfix/virtual

yatagarasu.jp virtual-domain
xxx@yatagarasu.jp xxx
yyy@yatagarasu.jp yyy
zzz@yatagarasu.jp zzz

 上の二行目の例では xxx@yatagarasu.jp が xxx@qcp.jp へ転送される。xxx が virtual とリアルで同じ必要はない。
 一行目は virtual domain を記入する。virtual-domain は何を書いても構わないらしい。
 このファイルからデータベースを生成する。
# postmap /etc/postfix/virtual

 /etc/postfix/main.cf に次の行を追加してリロードする。
# vi /etc/postfix/main.cf

# virtual domain
virtual_maps = hash:/etc/postfix/virtual
# /etc/init.d/postfix reload

 yatagarasu.jp の DNS 設定は次のようにした。
mx mail.qcp.jp. 10
2004 Jul. 11
 なお、2以上の virtual-domain に付いても同様に /etc/postfix/virtual に続けて記述すれば着信する。
# vi /etc/postfix/virtual

yatagarasu.jp virtual-domain
xxx@yatagarasu.jp xxx
yyy@yatagarasu.jp yyy
zzz@yatagarasu.jp zzz

qcp.jp virtual-domain
xxx@qcp.jp xxx
yyy@qcp.jp yyy
zzz@qcp.jp zzz

# postmap /etc/postfix/virtual
# /etc/init.d/postfix reload
 ここで、 qcp.jp の DNS は次のとおり。
mx mail.qcp.jp. 10

自動応答メール (procmail)

Nov.20 2005
 メールを受信した場合、その内容に応じた返信メールを自動で送信したい。
 ネットで検索してみると、procmail というツールがあって、VineLinux にはインストール済みのようだ。

 考え方としては、
  1. 対象となる受信メールを .forward ファイルによって procmail に食わせてやる。
  2. procmail にはレシピと呼ばれる処理手順を書いた指示ファイル .procmailrc を用意する。
  3. 返信用メールを生成するには formail というツールを使う。
 と言うことらしい。

procmail のレシピの構文については、ここが大変参考になった。

formail のオプションは次のとおり
-b 偽のメールボックスヘッダ(「From 」で始まる行)をエスケープしない。
-p 接頭語
前に付ける引用記号を指定する。指定しない場合はデフォルトの「>」が使用される。
-Y 通常の Berkeley 版メールボックスフォーマットを想定し、Content-Length: フィールドを無視する。
-c 複数行にわたるヘッダーフィールドを連結する。標準(行単位で処理する)テキストユーティリティでメールを後処理するときに便利。
-z フィールド名と内容との間にスペースを入れる。スペースだけのフィールドは削除する。-x で取り出されたフィールドの前後のスペースを省く。
-f メールボックスのフォーマットにしたがっていない(「From 」行で始まらない)メールをそのまま通すよう formail に指示する。
-r オートリプライヘッダを生成する。通常、元のメッセージの(X- Loop: を除く)すべての既存フィールドを破棄する。残しておきたいフィールドは -i オプションで指定する必要がある。このオプションを -k と一緒に使用した場合は、-b を指定することでメール本文が「エスケープ」されるのを防止できる。
-k オートリプライヘッダを生成するとき、またはフィールドを取り出すときにメール本文も保持する。
-t ヘッダーに有効な返信アドレスを持つ送信者を信用する。このオプションはオートリプライヘッダをニュース記事から作成する場合に便利。このオプションがオンになっていない場合は、formail はヘッダー中のマシン生成アドレス(Return-Path:)を優先する傾向がある。
-s 入力を別々のメールメッセージに分割し、パイプを通して 1 つずつプログラムに渡す(各パートについて新しいプログラムが開始されます)。-s は最後に指定するオプションでなければならない。これに続く最初の引数はプログラム名であることが想定され、それ以外の引数はそれに沿って処理される。プログラムを削除した場合は、formail は分割されたメッセージを stdout 上に連結する。FILENO を参照。
-n [maxprocs]
formail に各プログラムが終了するのを待たずに次を開始するよう指示する(これは分割されたメールが並行処理されることを意味する)。Maxprocs は並行処理数の上限を任意指定することができる。
-e 新しいメッセージのヘッダーの前に空白行を必要としない(メッセージがどの行から始まってもよいということ)。
-d 分割するはずのメッセージが厳密にメールボックスのフォーマットに適合していな くてもよいと formail に指示する(ダイジェスト/記事の分割や非標準のメールボックスフォーマットを許可する)。このオプションは Content-Length: フィールドの認識を無効にする。
-B formail に BABYL rmail ファイルを分割していると想定させる。
-m minfields
新しいメッセージの開始部分を決定するまでに formail が見つけなければならない連続するヘッダーフィールドの数を指定することができる。デフォルトは 2。
-q formail に(検出はするものの)記述エラー、重複メッセージ、ミスマッチの Content-Length: フィールドについて何もしないように指示する。このオプションはデフォルトではオンになっている。メッセージを表示する場合は、-q- を使用する。
-D maxlen idcache
formail は現在のメッセージのメッセージ ID が既出かどうかをほぼ maxlen サイズの idcache ファイルを使用して検出する。メッセージが分割されていない場合は、重複が見つかったら検出成功を返す。分割されている場合、重複メッセージは出力されない。-r と一緒に使用された場合、formail はメールのメッセージ ID ではなく送信者のメールアドレスに注目する。
-x ヘッダーフィールド
ヘッダーからこのヘッダーフィールドの内容を取り出し1 行に表示する。
-X ヘッダーフィールド
-x と同じだが、フィールド名を保持する。
-a ヘッダーフィールド
指定のヘッダーフィールドをヘッダーに追加するが、同様のフィールドがない場合に限られる。Message-ID: または Resent-Message-ID: のどちらかのフィールド名をフィールドが空の状態で指定すると、formail がユニークな ID を作成する。
-A headerfield
どのような場合にも指定のヘッダーフィールドをヘッダーに追加する。
-i ヘッダーフィールド
-A と同じだが、同様のフィールドは「Old-」という接頭語を前に付けてリネームされる。ヘッダーフィールドがフィールド名だけで構成されている場合は、接頭語は付かない。
-I ヘッダーフィールド
-i と同じだが、同様のフィールドがある場合、元のフィールドが削除される。ヘッダーフィールドがフィールド名だけで構成されている場合は、そのフィールドは削除される。
-u ヘッダーフィールド
最初に現れたフィールドをユニークにし、それ以降に同じものが現れた場合に削除する。
-U ヘッダーフィールド
最後に現れたフィールドをユニークにし、それ以前に同じものが現れている場合に削除する。
-R 旧フィールド 新フィールド
すべての旧フィールド名を新フィールド名にリネームする。
+skip メールを分割する際に最初の skip メッセージを飛ばす。
-total メールを分割する際に最大の total メッセージを出力する。

FILENO

 メールを分割する際に、formail はこの変数に出力されているメッセージに番号を割り当てる。FILENO を事前設定することにより、使用されている最初のメッセージの番号とゼロサプレスされた出力の幅を変更することができる。FILENO が設定されていない場合は、デフォルトの 000 が使用される。FILENO が空白でなく、数字以外のものが入っている場合は、FILENO の生成が無効になる。

 上記考え方の1のために、.forward に次のように記述しておく。
$ vi .forward

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #ユーザー名"

 このサーバーの .procmailrc の例
 Windows小道具集においてリンクされていないものについてフォームメールでリクエストがあった場合に、ダウンロード url を自動返信する。
条件
  1. フォームメールからの送信を対象とする。
  2. フリーメールが指定されていたら Subject の前に Reject: と追加してメールボックスへ保存。返信はしない。
  3. メール本文に記載されているキーワードしたがって返信メールを生成し、メールキューに投げる。

$ vi .procmail

PHOME=$HOME/procmail 設定ファイルのありか
LOGFILE=$PHOME/procmail.log ログファイル名
LOCKFILE=$PHOME/.lockfile ロックファイル名
MAILDIR=$HOME/ メールディレクトリ

LIST=$PHOME/freemail.txt フリーメールドメイン一覧リスト

SUBJECT=`formail -c -xSubject:` 送信メールから Subject 取得

:0
* ^Return-Path: <apache@qcp.jp> フォームメールからの送信を対象
{
:0 h f フリーメールが指定されていたら Subject の頭に Reject: を追加して終わり
* ? (formail -x From: | fgrep -iqf $LIST)
|formail -i "Subject: Reject: $SUBJECT"

:0 Ec Subject 名が対象メールであるものを処理
* ^Subject: TargetSubject
{
:0 B メール本文をチェック対象
* ^Title: .*Modules1.* KeyWord チェック
| (formail -rtA "Precedence: junk" \
-A "X-Loop: mailaddress@qcp.jp" \
-A "Content-Type: Text/Plain; charset=iso-2022-jp" \
-I "Subject: sleepingbird.net auto Reply Mail" \
-A "From:information <mailaddress@qcp.jp>" ;\
cat $PHOME/info.txt; \
cat $PHOME/Modules1.txt; \
cat $PHOME/signature.txt; \
) | $SENDMAIL -oi -t

:0 EB
* ^Title: .*Modules2.* 
| (formail -rtA "Precedence: junk" \
-A "X-Loop: mailaddress@qcp.jp" \
-A "Content-Type: Text/Plain; charset=iso-2022-jp" \
-I "Subject: sleepingbird.net auto Reply Mail" \
-A "From:information <mailaddress@qcp.jp>" ;\
cat $PHOME/info.txt; \
cat $PHOME/Modules2.txt; \
cat $PHOME/signature.txt; \
) | $SENDMAIL -oi -t

:0 EB
以下同様につづく
}
}

 注意事項
  1. フリーメール一覧リストファイルは UNIX 形式(改行コード=LF)。Windows で作成したファイルは CRLFとなるので一切マッチしなくなる。(ハマった(T_T))
  2. formail オプションに -t を使用する。これがない場合にはリプライが Return-Path: に設定されたアドレス(=apache)あてとして生成される。
    この指定により From: に設定されたアドレスあてとなる。
 なお、上記1を回避するために次のコマンドにより CR コードをファイルから削除できる。
$ perl -i.old -npe 's/\r\n/\n/' ファイル名
 Windows では改行コードの相互変換プログラムもある。

 なお、受信されたメール本文中に KeyWord が記述されていることを担保するために、フォームメールからの送信に限定している。
 実際の例はこちら