がらくたネット


postfix覚書

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状態を指す。

  • まず必要なパッケージをインストールする
    # yum --enablerepo=centosplus install httpd httpd-devel mysql-server\
                php php-mysql php-imap php-mbstring
  • postfix本体とpostfixのログ解析プログラム
    # yum --enablerepo=centosplus install postfix-2.3.3-2.1.centos.mysql_pgsql\
               postfix-pflogsumm-2.3.3-2.1.centos.mysql_pgsql
  • MySQLの初期設定、最低限なので必要な設定は施そうね
    # vi /etc/my.cnf
    [mysqld]
    old_passwords=0        ←0に変更
    default-character-set=UTF8   ←追記
    [mysql]            ←追記
    default-character-set=UTF8   ←追記
    # service mysqld start
    # mysql_secure_installation
    rootパスワード設定
    anonymousユーザ削除
    リモートrootログインは許可
    testデータベース削除
    権限テーブルリロード
    を実行する
    # chkconfig mysqld on
  • PostfixAdmin用データベースの準備
    # mysql -p
    mysql> CREATE DATABASE postfix;
    mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password';
    mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
    mysql> quit
  • apacheの初期設定、最低限なので必要な設定は施そうね
    # chkconfig httpd on
    # vi /var/www/html/index.html
    なにか適当に作っておく
    # service httpd start
  • postfixadminのインストール、こいつはRPMがないのでソースから
    # wget
    # tar zxvf postfixadmin-2.3.1.tar.gz
    # cp -R postfixadmin-2.3.1 /var/www/html/postfixadmin
    # cd /var/www/html/postfixadmin
    # vi config.inc.php
    $CONF['configured'] = true;           ←変更
    $CONF['default_language'] = 'ja';        ←変更
    $CONF['database_password'] = '****';       ←変更
    $CONF['admin_email'] = '****@e-garakuta.net';  ←変更
    その他はまた後ほど
  • ブラウザでpostfixadmin/setup.phpに接続する、チェックが全てOKになったら「Change Setup password」をクリック&入力して「Generate password hash」をクリックする。表示された$CONF['setup_password]=の行をコピーして、postfixadminのconfig.inc.phpの該当箇所を書き換える。
  • Create superadmin accountで管理者アカウントを作成する
  • setup.phpは不要なので、削除するかリネームしておく

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

  • postfixのvirtual用ユーザとかを作成
    # groupadd -g 10000 vusers
    # useradd -u 10000 -g 10000 vusers
    # chmod 771 /home/vusers
  • 基本設定
    # vi /etc/postfix/main.cf
    基本設定を実施する
    
    ## ADD VIRTUAL with MySQL ##
    local_transport = virtual
    virtual_tanbsport = virtual
    virtual_mailbox_base = /home/vusers
    virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
    virtual_alias_domains = $virtual_alias_maps
    virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
    virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
    virtual_uid_maps = static:10000
    virtual_gid_maps = static:10000
    virtual_minimum_uid = 10000
    
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    smtpd_sasl_local_domain = $myhostname
    smtpd_client_restrictions = reject_rbl_client bl.spamcop.net
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
    smtpd_sasl_security_options = noanonymous
    broken_sasl_auth_clients = yes
    #smtpd_usr_tls = yes
    #smtpd_tls_cert_file = /etc/postfix/mail.pem
    #smtpd_tls_key_file = /etc/postfix/mail.pem
    #smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
    #tls_daemon_random_source = dev:/dev/urandom
  • postfixのMySQL認証ファイルを作成
    # vi /etc/postfix/mysql_virtual_alias_maps.cf
    user = postfix
    password = ********
    hosts = localhost
    dbname = postfix
    table = alias
    select_field = goto
    where_field = address
    
    # vi /etc/postfix/mysql_virtual_domains_maps.cf
    user = postfix
    password = ********
    hosts = localhost
    dbname = postfix
    table = domains
    select_field = domains
    where_field = domains
    additional_conditions = and active = '1'
    
    # vi /etc/postfix/mysql_virtual_mailbox_maps.cf
    user = postfix
    password = ********
    hosts = localhost
    dbname = postfix
    table = mailbox
    select_field = maildir
    where_field = username
  • Submissionポートの設定
    # vi /etc/postfix/master.cf
    submission行のコメントアウト

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

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

% 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を再起動!

  • smtp_destination_concurrency_limit
  • * SMTPによる配送処理の最大並列数、ドメイン毎に設定可能
  • smtp_destination_recipient_limit
  • *
  • minimal_backoff_time
  • * 送信失敗後、再送するまでの待ち時間(秒)。




送信テストその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 でキューをフラッシュする