目次

postfix覚書

postfixの覚書でーす

ログ管理

postfixのログ解析ツール pglogsumm のインストールと設定。以前はRPMパッケージ名がpostfix-pflogsummだったが、EL6からはpostfix-perl-scriptsに変更となった。

yum install postfix-perl-scripts

perlスクリプトなので、実行用シェルスクリプトを作成して、cronで毎日実行させるようにする

vi pflogsumm_report
#!/bin/bash
 
MAILLOG=`mktemp`
for log in `ls /var/log/maillog*|sort -r`
do
    cat $log >> $MAILLOG
done
REPORT=`mktemp`
pflogsumm --problems_first --verbose_msg_detail --mailq -d yesterday $MAILLOG > $REPORT
cat $REPORT | mail -s "`head -1 $REPORT` in `uname -n`" postmaster
rm -f $MAILLOG $REPORT

chmod 700 pflogsumm_report
mc pflogsumm_report /etc/cron.daily

SMTP-Auth

SMTP-Authの設定

Cyrus SASL v1、v2とDovecot v1 SASLが対応している。

SMTPサーバでサポートされているSASL認証プラグインの表示
postfocnf -a

Dovecot SASLでのSMTP-Auth認証が一番楽だと思われ。

/etc/postfix/main.cf
 smtpd_sasl_auth_enable = yes ← SMTPサーバでのSASL有効化
 smtpd_recipient_restrictions =  permit_sasl_authenticated
                ← 認証されたクライアントのメールリレー許可
 broken_sasl_auth_clients = yes ← 古いAUTHプロトコルクライアントのサポート
 smtpd_sasl_type = dovecot ← DovecotのSASLを利用
 smtpd_sasl_path = private/auth ← Dovecot認証デーモンソケットファイル
                   postfixキューディレクトリからの相対パス

Dovecot側の設定

/etc/dovecot.conf:
auth default {
  mechanisms = plain login
  passdb pam {
    適宜設定
    }
  userdb passwd {
    適宜設定
    }
  socket listen {
    client {
      path = /var/spool/postfix/private/auth ← SASL認証デーモンソケットパス
      mode = 0660 ← ファイルパーミッション
      user = postfix ← ファイルのオーナー
      group = postfix
    }
  }
}

コマンド

postmap

検索テーブル管理

postmap -q key filename 指定されたマップからkeyを検索して表示
postmap -s filename 指定されたマップから全てのエントリを表示

postconf

postfix設定ツール

postconf -a サポートしているSASLサーバプラグインの列挙。ここ重要。サーバね!。って言ってもcyrusとdovecotしかない。smtpd_sasl_type設定パラメータで指定可能になる。
postconf -m サポートされている検索タイプの列挙。mysqlやpgsqlが一覧にある場合はそれぞれのDBサーバが利用可能。
postconf -n main.cfで明示的に指定されてデフォルト値ではないパラメータ設定を表示する。

postfixをMySQLで管理

Postfixにはpostfixadminという便利なWebGUIツールがある。ブラウザからpostfixのバーチャル環境を管理できるので重宝できる!

CentOS5.5ではcentosplusリポジトリにmysql対応postfixが存在している
これを利用してpostfix + MySQL + Dovecot + postfixadminな環境を構築してみる

postfix.txt

RPMからのインストール

素のCentOS5.5にインストールする方法。素とはインストール時に開発系パッケージのみを選択して他はベースシステムぐらいしか選択していない最小限のOS状態を指す。

ここからpostfix本体の設定となる。非常に多くの箇所を見る必要があるが、わかってしまえばなんとかなる。

ソースコードからのインストール

ソースディレクトリをクリアにする

% make tidy

普通のコンパイル

% make

MySQLサポート

% make -f Makefile.init makefiles \
       'CCARGS=-DHAS_MYSQL -I/usr/include/mysql' \
       'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lm'

PCREサポート

% make -f Makefile.init makefiles \
       "CCARGS=-DHAS_PCRE -I/usr/include/pcre" \
       "AUXLIBS=-lpcre"

Cyrus SASLサポート

% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
       -I/usr/include/sasl" \
       AUXLIBS="-L/usr/lib/sasl2 -lsasl2"

TLSサポート

% make makefiles \
       CCARGS="-DUSE_TLS -I/usr/include/openssl" \
       AUXLIBS="-lssl -lcrypto"

PostgreSQLサポート

% make makefiles \
       CCARGS="-DHAS_PGSQL -I/usr/include/pgsql" \
       AUXLIBS="-L/usr/lib -lpq"

LDAPサポート

% make makefiles \
       CCARGS="-DHAS_LDAP -DLDAP_DEPRECATED=1" \
       AUXLIBS="-L/usr/lib -lldap -llber"

IPv6サポート

% make makefiles \
       CCARGS="-DNO_IPV6"

ビルトインパラメータの変更

% make makefiles CCARGS='-DDEF_CONFIG_DIR=\"/some/where\"'
引用符に注意!

マクロ名 デフォルト値 典型的なデフォルト
DEF_COMMAND_DIR command_directory /usr/sbin
DEF_CONFIG_DIR config_directory /etc/postfix
DEF_DAEMON_DIR daemon_directory /usr/libexec/postfix
DEF_MAILQ_PATH mailq_path /usr/bin/mailq
DEF_HTML_DIR html_directory no
DEF_MANPAGE_DIR manpage_directory /usr/local/man
DEF_NEWALIAS_PATH newaliases_path /usr/bin/newaliases
DEF_QUEUE_DIR queue_directory /var/spool/postfix
DEF_README_DIR readme_directory no
DEF_SENDMAIL_PATH sendmail_path /usr/sbin/sendmail

各種サポートやビルトインパラメータ変更後にコンパイルする
つまり、make実行前にCCARGSとAUXLIBS変数を適切に設定してからmakeを実行するって事らしいです。
AUXLIBSに“-pie -Wl,-z,relro”がついているのはなんだろう?(CentOSのパッケージより)

% CCARGS="なんたらかんたら"
% AUXLIBS="なんたらかんたら"
% export CCARGS AUXLIBS
% make -f Makefile.init makefiles
% unset CCARGS AUXLIBS

sendmailバイナリの保存

# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
# mv /usr/bin/mailq /usr/bin/mailq.OFF
# chmod 755 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF /usr/bin/mailq.OFF

アカウントグループの作成 postfixユーザとグループを作成。ホームディレクトリやログインシェルは不要。 postdropグループを作成。

# groupadd -g 89 postfix
# useradd -g postfix -u 89 postfix
# groupadd postdrop

インストール

# make install


遭遇したエラーについて

warning: do not list domain XXX.jp in BOTH virtual_mailbox_domains and relay_domains

virtual_mailbox_domainsとrelay_domainsに同じドメイン名のリストが存在している!って警告で、動かないわけではないが、設定がおかしいので障害発生時に問題になる。
PostfixAdmin下では以下のファイルで指定している箇所となる。
virtual_mailbox_domains mysql:/etc/postfix/mysql_virtual_domains_maps.cf
relay_domains      mysql:/etc/postfix/mysql_relay_domains_maps.cf

つまり、このファイル内で指定しているSELECT文の戻りの中に重複したドメイン名が存在してしまっているとの事。

ちなみに
relay_domainsはリレーしようとする配送先ドメイン名、マッチしたドメイン名はtransportを使って配送される、受信者アドレスをrelay_recipient_mapsで確認して存在しない受信者を拒否する デフォルトは$mydestinationだがpostfixでmysql環境でpostfixadminを導入した環境下であれば $mydestinationは空白になっているはずである

トランスポート

例えばdocomo宛

master.cfに追記
docomo  unix    -       -       n       -       -       smtp
        -o smtp_destination_concurrency_limit=2
        -o smtp_destination_recipient_limit=30
        -o minimal_backoff_time=1800

transportに次を追加
docomo.ne.jp     docomo:

でpostmapでtransportを変換してpostfixを再起動!




送信テストその1

postfixにはsmtp-sourceという便利なツールがついてる
これね
簡易的な送信テストが可能

smtp-source -c -f [from@address] -t [to@address] -m [送る数] -S "[件名]" [SMTP_SERVER]
-m 1000 とすると1000通メールを送る
SMTPセッションはデフォルト1なので、並列で100個から送りたいときは
-s 100 と指定する
セッション数指定と件名(Subject)指定が大文字小文字の判断なので注意!
-fでfromを指定しない場合は、foo@hostnameとなる

送信テストその2

送信テストその1では多数のメール送信テストができた。
ローカルSMTPサーバに対して、送信テストしつつ
即時配送を停止してわざと遅延させる方法

vi /etc/postfix/main.cf

defer_transports = smtp

defer_transports = smtpとするとsmtpトランスポート分のみがdeferする
つまりキューに溜まった状態となる

送信するには postqueue -f でキューをフラッシュする