ご注意下さい
この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。
ある時にYahoo!メールからのメールが受け取れないことに気づきました。いろいろと調査したところqmail-smtpdに問題があることが判明。私はBrandon's combined patchと同DKIMパッチをqmailに適用しているのですが、このパッチに対するパッチを作成してみました。
問題点
具体的には2つの不具合と1つの改善ポイントがあります。
不具合1: Yahoo!メールなど特定のドメインからのメールを受け取れないことが分かっています。domainkeys署名がされいない場合に発生し、qmail-smtpdが異常終了してしまう事象が発生します。結果として送信サーバ側で送信タイムアウト(#4.4.2)になる問題があります。(31行目)
不具合2: SMTP認証が通った場合にもRELAYCLIENT環境変数がセットされないという不具合があります。が、これは作者の方針のようです…。(52行目)
https://qmail.jms1.net/patches/combined.shtml
Not To-Do ListThese are patches which people suggested, and I thought about, and I have decided not to add for one reason or another.
It has been suggested that qmail-smtpd should explicitly add RELAYCLIENT="" to the environment when a client does a successful AUTH command.
Status: not going to happen.
If you need this functionality, use AUTH_RELAYCLIENT="" instead, or if you have a script which needs it, modify that script to use the SMTP_AUTH_USER variable instead, which is set in case of a successful AUTH command (and will contain the userid which was used in the AUTH command).
Also, be aware that the RELAYCLIENT environment variable is used for more than just granting permission to relay. Read the man page for qmail-smtpd (i.e. run "man qmail-smtpd" on your system) for more details.
改善点: SPF_LOG環境変数をセットするとsyslog(/var/log/messages)にReceive-SPF:レコードが記録されるのですが、Domainkeys/DKIMについては出力することができません。SPFチェックと同様にDKIM認証についてもsyslogに出力できるとよりいいと思っています。(9、20、41行目)
解決策
ということでパッチを作成してみました。ダウンロードはこちらから
*** qmail-smtpd.c 2014-03-17 13:58:06.000000000 +0900 --- ../../qmail.spf.dkim/qmail-1.03/qmail-smtpd.c 2014-03-17 23:04:04.000000000 +0900 *************** *** 303,308 **** --- 303,309 ---- stralloc spfguess = {0}; stralloc spfexp = {0}; int spf_log = 0; + int dkverify_log = 0; int help_version = 0; void smtp_greet(code) char *code; *************** *** 403,408 **** --- 404,412 ---- x = env_get("SPF_LOG"); if(x) { scan_ulong(x,&u); spf_log = (int) u; } + x = env_get("DKVERIFY_LOG"); + if(x) { scan_ulong(x,&u); dkverify_log = (int) u; } + x = env_get("RELAYREJ"); if(x) { scan_ulong(x,&u); relayrej = (int) u; } *************** *** 1347,1352 **** --- 1351,1357 ---- maybe_die_dk(dkst); dkimst = DKIMVerifyResults(&dkim); + dkstatus = "none (no signature)"; switch(dkst) { case DK_STAT_OK: dkstatus = "pass (ok)"; break; case DK_STAT_BADSIG: dkstatus = "fail (bad sig)"; break; *************** *** 1415,1420 **** --- 1420,1427 ---- qmail_puts(&qqt, dkimstatus); qmail_puts(&qqt, "\n"); + if (dkverify_log) { strerr_warn7(title.s, "Authentication-Results: ", (hostname ? hostname : "localhost"), "; domainkeys=", dkstatus, "; dkim=", dkimstatus,0); } + for (;;) { r = substdio_get(&tempio,&ch,1); *************** *** 1910,1915 **** --- 1917,1923 ---- if (!env_put2("TCPREMOTEINFO",remoteinfo)) die_nomem(); if (!env_unset("SMTP_AUTH_USER")) die_read(); if (!env_put2("SMTP_AUTH_USER",remoteinfo)) die_nomem(); + if (!env_put2("RELAYCLIENT",relayclient)) die_nomem(); out("235 ok, go ahead (#2.0.0)\r\n"); break; case 1:
パッチ適用
このパッチの適用にあたっては、qmail-1.03-jms1.7.10.patchとqmail-1.03-jms1.7.08-dkim-r1.patchが適用されているのが前提です。
# cd qmail-1.03
# patch < ../qmail-1.03-smtpd-dkim.patch # make setup check
設定
もしsyslogにAuthentication-Results:レコードを出力したい場合には環境変数「DKVERIFY_LOG」をqmailのスタートアップスクリプトに仕込んでください。
#!/bin/sh # # qmail: /var/qmail # chkconfig: 2345 80 30 # description: Qmail is a Mail Transport Agent, which is the program \ # that moves mail from one machine to another. # processname: qmail # pidfile: /var/run/qmail # # Source function library. . /etc/rc.d/init.d/functions prog="qmail" PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl" export QMAILQUEUE PORT=465; export PORT SSL=1; export SSL FORCE_TLS=0; export FORCE_TLS DENY_TLS=0; export DENY_TLS REQUIRE_AUTH=0; export REQUIRE_AUTH ALLOW_INSECURE_AUTH=0; export ALLOW_INSECURE_AUTH AUTH_CDB=/var/qmail/control/auth.cdb; export AUTH_CDB SPF_LOG=1; export SPF_LOG DKVERIFY_LOG=1; export DKVERIFY_LOG AUTH_SET_SPF_LOG=1; export AUTH_SET_SPF_LOG QMAILSMTPD_LOG_MAIL=1; export QMAILSMTPD_LOG_MAIL QMAILSMTPD_LOG_RCPT=1; export QMAILSMTPD_LOG_RCPT [ -f /var/qmail/rc ] || exit 0 case "$1" in start) # Start daemons. echo "Starting qmail." csh -cf '/var/qmail/rc &' # STMP tcpserver -v -R -H -l0 -c100 -u 501 -g 500 -x /etc/tcpserver/tcp.smtp.cdb \ 0 smtp /var/qmail/bin/qmail-smtpd kamata-net.com /bin/cmd5checkpw /bin/true \ 2>&1 | /var/qmail/bin/splogger smtpd 3 & (snip)
謝辞
qmail Combined Patch Details は本当にqmailサーバ作成を楽にしてくれる素晴らしいパッチですので、これからqmailを使いたいという人には是非このパッチを適用することをお勧めします。
DKIM and DomainKeys patch for qmail | Brandon's Blog
記事はここまで。