Linux Server

Improving Brandon's combined patch

  

ご注意下さい

この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。

5
(1)

ある時に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 List

These 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.patchqmail-1.03-jms1.7.08-dkim-r1.patchが適用されているのが前提です。

# wget https://blog.kamata-net.com/patch/qmail-1.03-smtpd-dkim.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

記事はここまで。

この記事は役に立ちましたか? | Is this article useful for you?

評価をお願いします | Please leave your rating.

平均 | Av.: 5 / 5. 投票数 | Votes: 1

最初の評価を下さい | Please vote for the first rating.

-Linux Server
-, ,

© 1999 - 2021 蒲田ネット