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の設定
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 -q key filename | 指定されたマップからkeyを検索して表示 |
postmap -s filename | 指定されたマップから全てのエントリを表示 |
postfix設定ツール
postconf -a | サポートしているSASLサーバプラグインの列挙。ここ重要。サーバね!。って言ってもcyrusとdovecotしかない。smtpd_sasl_type設定パラメータで指定可能になる。 |
postconf -m | サポートされている検索タイプの列挙。mysqlやpgsqlが一覧にある場合はそれぞれのDBサーバが利用可能。 |
postconf -n | main.cfで明示的に指定されてデフォルト値ではないパラメータ設定を表示する。 |
Postfixにはpostfixadminという便利なWebGUIツールがある。ブラウザからpostfixのバーチャル環境を管理できるので重宝できる!
CentOS5.5ではcentosplusリポジトリにmysql対応postfixが存在している
これを利用してpostfix + MySQL + Dovecot + postfixadminな環境を構築してみる
素のCentOS5.5にインストールする方法。素とはインストール時に開発系パッケージのみを選択して他はベースシステムぐらいしか選択していない最小限のOS状態を指す。
# yum --enablerepo=centosplus install httpd httpd-devel mysql-server\ php php-mysql php-imap php-mbstring
# yum --enablerepo=centosplus install postfix-2.3.3-2.1.centos.mysql_pgsql\ postfix-pflogsumm-2.3.3-2.1.centos.mysql_pgsql
# 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
# 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
# chkconfig httpd on # vi /var/www/html/index.html なにか適当に作っておく # service httpd start
# 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'; ←変更 その他はまた後ほど
ここからpostfix本体の設定となる。非常に多くの箇所を見る必要があるが、わかってしまえばなんとかなる。
# 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
# 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
# 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を再起動!
postfixにはsmtp-sourceという便利なツールがついてる
これね
簡易的な送信テストが可能
smtp-source -c -f [from@address] -t [to@address] -m [送る数] -S "[件名]" [SMTP_SERVER]-m 1000 とすると1000通メールを送る
送信テストその1では多数のメール送信テストができた。
ローカルSMTPサーバに対して、送信テストしつつ
即時配送を停止してわざと遅延させる方法
vi /etc/postfix/main.cf defer_transports = smtp
defer_transports = smtpとするとsmtpトランスポート分のみがdeferする
つまりキューに溜まった状態となる
送信するには postqueue -f でキューをフラッシュする