_Mail/qmail

qmail の導入

セキュアで高速なMTAであるqmailのインストールを行う。qmailにはいくつかのパッチが提供されているが、推奨パッチを適用するのであれば、qmail-1.03にrecommended patchを追加した netqmail-1.06を用いるとインストールの手間を軽減できる。

qmalが提供する機能はMTAの基本機能に限られる。実運用ではPOPサービスでのユーザ認証やSMTPサービスの接続制限は必要となってくるため、それぞれ checkpasswordと、ucspi-tcp(tcpserver)を導入して対応する。

事前作業

実行アカウントの作成を行う。安全なMTA運用のために qmail関連のプロセスには root権限を持たない専用のアカウントを用意する。作成するグループ、アカウントは netqmail-1.06/INSTALL.idsで説明されている通りに準備する。

  # groupadd nofiles
  # useradd -g nofiles -d /var/qmail/alias alias         …alias user
  # useradd -g nofiles -d /var/qmail qmaild              …daemon user
  # useradd -g nofiles -d /var/qmail qmaill              …log user
  # useradd -g nofiles -d /var/qmail qmailp              …passwd user
  # groupadd qmail
  # useradd -g qmail -d /var/qmail qmailq                …queue user
  # useradd -g qmail -d /var/qmail qmailr                …remote user
  # useradd -g qmail -d /var/qmail qmails                …send user

インストール

パッケージを取得・展開して、環境に応じてヘッダファイルの修正を行う。パッケージに含まれる error.hは古い glibc向けに作成されているため、必要に応じて修正を行う。ucspi-tcp は提供されているパッチを適用してもよい。インストール先をデフォルトから変更する場合は conf-homeファイルの設定内容を変更する。

netqmail-1.06
  > tar xfz netqmail-1.06.tar.gz
  > cd netqmail-1.06
  > vi conf-qmail        …インストール先を変更する場合に修正するファイル。(非推奨)
  > tar xfz qmail-smtpd-auth-0510.tgz  …SMTP AUTH 
  > ./install_smtpd-auth.sh 
  > make
  # make setup check

checkpassword
  > tar xfz checkpassword-0.90.tar.gz
  > cd checkpassword-0.90
  > vi error.h
  - extern int errno;
  + #include <errno.h>
  > vi conf-home              …/var/qmail/bin をインストール先にする
  - /
  + /var/qmail
  > make
  # make setup check

ucspi-tcp
  > tar xfz ucspi-tcp-0.88.tar.gz
  > cd ucspi-tcp-0.88
  > patch < ../ucspi-tcp-ssl-20050405.patch  …ssl通信パッチ
  patching file error.h
  > vi conf-home
  - /usr/local
  + /usr/local/ucspi-tcp      …/usr/local/ucspi-tcp をインストール先にする
  > make
  # make setup check

設定

各種制御ファイルの設定を行う。基本設定は パッケージで一緒に提供される config-fastを利用するのが便利。メールドメインを引数にして実行すると、必要最小限の設定ファイルを自動生成してくれる。

  > cd netqmail-1.06
  # config-fast mail.domain.name
  Your fully qualified host name is mail.domain.name
  Putting mail.domain into control/me...
  Putting domain.name into control/defaultdomain...
  Putting domain.name into control/plusdomain...
  Putting mail.domain.name into control/locals...
  Putting mail.domain.name into control/rcpthosts...
  Now qmail will refuse to accept SMTP messages except to mail.domain.name
  Make sure to change rcpthosts if you add hosts to locals or virtualdomains!

外部へのメール転送を行うときに、ISPから中継サーバを指定されている場合は smtproutesファイルを生成する。

  # cat > /var/qmail/control/smtproutes
  cat > smtproutes          ... ISPから指定されたSMTPフォワード先(xxx.xxx.xx)を設定
  :xxx.xxx.xx

エイリアスの設定を行う。root@、mailer-daemon@、postmaster@宛のメールを管理者メールアドレス(user-accout@)へ転送されるようにしておく。その他転送が必要なアドレスがあればここで一緒に追加しておく。

  # cd /var/qmail/alias
  # echo "&user-account" > .qmail-root
  # echo "&root" > .qmail-mailer-daemon
  # echo "&root" > .qmail-postmaster
  # echo "&root@ > .qmail-webmaster

ucspi-tcp(tcpserver)の接続制限設定を行う。ローカルホストと、ローカルセグメント(10.0.0.0/24)にある端末からの外部サーバへのメール送信要求を許可(環境変数RELAYCLIENTをクリア)する。

  > cd /var/qmail/smtpd/
  # cat > smtp.cfg
  127.0.0.1:allow,RELAYCLIENT=""
  10.0.0.:allow,RELAYCLIENT=""
  :allow
  # /usr/local/bin/tcprules smtp.cdb smtp.tmp < smtp.cfg
          • 以下、編集素材(メモ)****************

パッケージ入手

必要なパッケージを入手する

No. パッケージ URL 説明
1 qmail-1.03.tar.gz http://cr.yp.to/qmail.html MTA
2 netqmail-1.06.tar.gz http://qmail.org/ qmailにセキュリティパッチを充てたもの
3 ucspi-tcp-0.88.tar.gz http://cr.yp.to/ucspi-tcp.html tcpserver
3a ucspi-tcp-glibc.patch -- tcpserver のglibcパッチ
3b uscpi-tcp-ssl.patch -- tcpserver のsslパッチ
4 checkpassword-0.90.tar.gz http://cr.yp.to/checkpwd.html popパスワード認証
5 qmail-vida-0.51.tar.gz http://qmail-vida.sourceforge.jp/ checkpasswordをAPOP対応化
6 relay-ctrl-3.1.1.tar.gz http://untroubled.org/relay-ctrl/ POP before SMTP
7 daemontools-0.76.tar.gz http://cr.yp.to/daemontools/install.html POP before SMTPで利用
8 qmail-smtpd-auth-0510_tgz_bin http://www.fehcom.de/qmail/smtpauth.html SMTP Auth パッチ

アカウント作成

  # groupadd nofiles
  # useradd -g nofiles -d /var/qmail/alias alias
  # useradd -g nofiles -d /var/qmail qmaild
  # useradd -g nofiles -d /var/qmail qmaill
  # useradd -g nofiles -d /var/qmail qmailp
  # groupadd qmail
  # useradd -g qmail -d /var/qmail qmailq
  # useradd -g qmail -d /var/qmail qmailr
  # useradd -g qmail -d /var/qmail qmails
  # groupadd vida
  # useradd -g vida -d /var/qmail qmailu
  # useradd -g vida -d /var/qmail authdb
  # usermod -g vida -d /var/qmail/pop pop
  # mkdir /var/qmail/pop
  # chown pop.vida /var/qmail/pop

事前準備

  > tar xfz netqmail-1.06.tar.gz
  > tar xfz checkpassword-0.90.tar.gz
  > tar xfz ucspi-tcp-0.88.tar.gz
  > tar xfz qmail-vida-0.51.tar.gz
  > cd checkpassword-0.90
  > vi error.h
  - extern int errno;
  + #include <errno.h>
  > cd ucspi-tcp-0.88
  > patch -p1 < ../ucspi-tcp-glibc.patch
  patching file error.h
// パッケージの展開先の調整
  > cd qmail-vida-0.51
  > vi Makefile
  QMAILSRC         = ../netqmail-1.06
  CHECKPASSWORDSRC = ../checkpassword-0.90
  UCSPITCPSRC      = ../ucspi-tcp-0.88

// checkpassword が /etc/passwd も確認するようにする
  > vi src/checkpassword/conf-withpasswd
  -0
  +1

// netqmail 用にパッチを微修正
  > vi patch/qmail.patch 
  * 337行目
  - void err_authoriz() { err("authorization first"); }
  + void err_authoriz(arg) char *arg; { err("authorization first"); }
  * 339行目
  - void okay() { puts("+OK \r\n"); flush(); }
  + void okay(arg) *arg; { puts("+OK \r\n"); flush(); }
  * 345行目
  -   okay();
  +   okay(0);

// パッチ
  > cd qmail-vida-0.51
  > make patch
  > make copy

コンパイル&インストール

// qmail
  > cd netqmail-1.06
  > make
  # make setup check
// checkpassword
  > cd checkpassword-0.90
  > make
  # make setup check
// tcpserver
  > cd ucspi-tcp-0.88
  > make
  # make setup check
// qmail-vida
  > cd qmail-vida-0.51/src/vida
  > make
  # make setup check

設定

  > cd netqmail-1.06
  # config-fast mail.domain.name
  cat rcpthosts             ... SMTPを許可するFROM ドメイン
  xxxx.xxx.xx
  yyyy.yyy.yy
  cat > smtproutes          ... 外部のSMTPフォワード先
  :xxx.xxx.xxx

  # cd /var/qmail/alias
  # echo "&root-user-account" > .qmail-root
  # echo "&root" > .qmail-mailer-daemon
  # echo "&root" > .qmail-postmaster
  # echo "&root" > .qmail-webmaster
  > cd /var/qmail/smtpd/
  # cat > smtp.cfg
  127.0.0.1:allow,RELAYCLIENT=""
  nnn.nnn.nnn.:allow,RELAYCLIENT=""
  :allow
  # /usr/local/bin/tcprules smtp.cdb smtp.tmp < smtp.cfg
  # /var/qmail/bin/vida-pwdbinit

起動

qmail 起動スクリプト rc.qmail

/var/qmail/boot/home

/usr/local/bin/tcpserver
	-R                                   # IDENTを行わない
	0                                    # ホストを指定しない
	pop3                                 # pop3 ポート
	/var/qmail/bin/qmail-popup           # 起動プログラム
	mail.domain.name                     # メールドメイン
	/var/qmail/bin/checkpassword         # PWチェック
	/var/qmail/bin/qmail-pop3d Maildir & #

/usr/local/bin/tcpserver
	-R                                   # IDENTを行わない
	-u qmaild -g nofiles                 # qmaild/nofiles 権限で起動
	-x /var/qmail/smtpd/smtp.cdb         # 接続制御データベース
	0                                    # ホストを指定しない
	smtp                                 # smtp ポート
	/var/qmail/bin/qmail-smtpd 2>&1      # 起動プログラム
	|/var/qmail/bin/splogger smtpd 3 &   # ロガー

ユーザ環境

  > cd ~
  > /var/qmail/bin/maildirmake Maildir
  > echo ./Maildir/ > .qmail

POP Before SMTP

  > tar xfz daemontools-0.76.tar.gz
  > cd admin/daemontools-0.76/

ヘッダファイルの修正

  > vi src/error.h
  - extern int errno;
  + #include <errno.h>

コンパイル&インストール

必要なenvdirコマンドのみをコンパイル&インストールする

  > package/compile
   ...
  # cp command/envdir /usr/local/bin
  # chown root.root /usr/local/bin/envdir
  > tar xvfz relay-ctrl-3.1.1.tar.gz
  > cd relay-ctrl-3.1.1

インストールパラメータの調整

  > vi conf-bin
  - /usr/local/bin
  + /usr/local/relay-ctrl/bin
  > vi conf-man
  - /usr/local/man
  + /usr/local/relay-ctrl/man
  > make
  # mkdir /usr/local/relay-ctrl/bin
  # mkdir /usr/local/relay-ctrl/man
  # ./installer
  # mkdir -p /var/spool/relay-ctrl/allow
  # chmod 700 /var/spool/relay-ctrl
  # chmod 777 /var/spool/relay-ctrl/allow
  #
  # mkdir /etc/relay-ctrl
  # echo "/var/spool/relay-ctrl/allow" > /etc/relay-ctrl/RELAY_CTRL_DIR
  # echo 900 > /etc/relay-ctrl/RELAY_CTRL_EXPIRY
  # crontab -e
  */5 * * * * envdir /etc/relay-ctrl relay-ctrl-age

/etc/rc.d/rc.qmail

        # POP3 (APOP)
        echo -n "Starting qmail pop daemon: qmail-pop3d"
        # if you need to use POP3, set environment 'ALLOWPLAIN' to ''
        env - ALLOWPLAIN='' PATH='/var/qmail/bin:/usr/local/bin:/usr/bin:/bin' \
                envdir /etc/relay-ctrl relay-ctrl-chdir \
                tcpserver -R 0 pop3 qmail-popup sakamoto.fam.cx \
                checkpassword relay-ctrl-allow qmail-pop3d Maildir &
        echo

        # SMTP
        echo -n "Starting qmail smtp daemon: qmail-smtpd"
        envdir /etc/relay-ctrl relay-ctrl-chdir \
                tcpserver -R -u qmaild -g nofiles 0 smtp \
                relay-ctrl-check /var/qmail/bin/qmail-smtpd \
                2>&1 | /var/qmail/bin/splogger smtpd 3 &
        echo

/usr/local/courier-imap/bin/imapd-relay-ctrl-allow

#!/bin/sh

export USER=${AUTHENTICATED}
/usr/local/bin/relay-ctrl-allow /usr/local/courier-imap/bin/imapd $1

/usr/local/courier-imap/sbin/imapd

 ...
    /usr/local/courier-imap/sbin/courierlogger -pid=$PIDFILE -start $LOGGEROPTS \
    /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-chdir \ ★追加
    ${exec_prefix}/sbin/couriertcpd -address=$ADDRESS \
    -maxprocs=$MAXDAEMONS -maxperip=$MAXPERIP \
    $TCPDOPTS \
    $PORT ${exec_prefix}/libexec/courier/imaplogin \
    /usr/local/courier-imap/bin/imapd-relay-ctrl-allow ${MAILDIRPATH}" ★修正

SMTP Auth

  > tar xfz netqmail-1.06.tar.gz 
  > cd netqmail-1.06/
  > tar xfz qmail-smtpd-auth-0510.tgz 
  > ./install_smtpd-auth.sh 
  > make
  # make setup check



---
update at 2018/03/02 22:04:51

※注:当サイトは特定環境において確認できた事象のみを記述しています。他の環境での動作は一切保証しません。