IT pass HikiWiki - [ITPASS2017]qmail のインストールと設定 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

[((<ITPASSサーバ構築・運用ドキュメント>)) へ戻る]

= exim4 のアンインストール

qmail をインストールするにあたってかち合わないように debian に標準搭載されている exim4 をアンインストールする.

exim4 関連のパッケージを確認する.

  # dpkg -l | grep exim

exim 関連パッケージを設定ファイルからアンインストールする.

  # apt-get remove --purge exim4 exim4-base exim4-config exim4-daemon-light

= qmail のインストールと設定

qmail のインストールと設定を行う.

== ソース・パッチの取得

ディレクトリを作成した.

  # mkdir /var/qmail

ユーザ・グループを追加した. qmail は専用のアカウントとグループを作成してその権限で起動する.

  # groupadd -g 200 nofiles
  # adduser --system --ingroup nofiles --home /var/qmail/alias alias
  # adduser --system --ingroup nofiles --home /var/qmail qmaild
  # adduser --system --ingroup nofiles --home /var/qmail qmaill
  # adduser --system --ingroup nofiles --home /var/qmail qmailp
  # groupadd -g 201 qmail
  # adduser --system --ingroup qmail --home /var/qmail qmailq
  # adduser --system --ingroup qmail --home /var/qmail qmailr
  # adduser --system --ingroup qmail --home /var/qmail qmails

このときに, 以下のようなレスポンスが返ってくるが問題ない.

  # adduser --system --ingroup nofiles --home /var/qmail qmaild
  警告: 指定されたホームディレクトリ /var/qmail はすでに存在しています。
  システムユーザ `qmaild' (UID 119) を追加しています...
  新しいユーザ `qmaild' (UID 119) をグループ `nofiles' に追加しています...
  ホームディレクトリ `/var/qmail' はすでに存在します。`/etc/skel' からのコピーを行いません。
  adduser: 警告: ホームディレクトリ `/var/qmail' は、現在作成中のユーザの所属になっていません。

ソース, パッチの取得と展開を行う.

当てる patch は以下のとおりである.

  * qmail-103.patch (DNS応答に関するパッチ)
  * qmail-1.03-realrcptto-2006.12.10.patch (存在しないユーザ宛のメールを受け取らないようにするパッチ)
  * qmail-date-localtime.patch (ローカルタイムに関するパッチ)
  * qmail-smtpd-relay-reject (リレーサーバとして利用させないためのパッチ)
  * qmail-smtpd-auth-0.31.tar.gz (smtp-auth のためのパッチ)

  # cd /usr/local/src
  # wget http://www.qmail.org/netqmail-1.06.tar.gz
  # tar zxf netqmail-1.06.tar.gz
  # wget http://www.ckdhr.com/ckd/qmail-103.patch
  # wget http://code.dogmap.org./qmail/qmail-1.03-realrcptto-2006.12.10.patch
  # wget -U test http://www.ksknet.net/sample/qmail-date-localtime.patch

  # wget http://www.qmail.org/qmail-smtpd-relay-reject
  # wget http://tomclegg.net/qmail/qmail-smtpd-auth-0.31.tar.gz
  # tar zxvf qmail-smtpd-auth-0.31.tar.gz

== パッチの適用とコンパイル

展開したディレクトリに移動した後, 上で取得したパッチを当てビルドする. ビルドとチェックを行い, エラーが出ないことを確認する.
patch の当て方については詳しくは ((<[TEBIKI]patch コマンド>)) を参照のこと.
  
  # cd netqmail-1.06
  # patch -p1 < ../qmail-103.patch
  # patch -p1 < ../qmail-1.03-realrcptto-2006.12.10.patch
  # patch -p1 < ../qmail-date-localtime.patch
  # patch -p1 < ../qmail-smtpd-relay-reject
  # make man
  # make
  # make setup check

== 設定

./config のスクリプトは, DNS を使って下に示す制御ファイルに情報を書くものであるが実行できないため, 下のそれぞれの内容を手動でファイルに書く.

* /var/qmail/control/defaultdomain に下の内容を書く

    scitec.kobe-u.ac.jp

* /var/qmail/control/locals に下の内容を書く

    localhost
    tako-itpass.scitec.kobe-u.ac.jp
    epa.scitec.kobe-u.ac.jp
    aoe.scitec.kobe-u.ac.jp

* /var/qmail/control/me に下の内容を書く

    tako-itpass.scitec.kobe-u.ac.jp

* /var/qmail/control/plusdomain に下の内容を書く

    ac.jp

* /var/qmail/control/rcpthosts に下の内容を書く

    localhost
    tako-itpass.scitec.kobe-u.ac.jp
    epa.scitec.kobe-u.ac.jp
    aoe.scitec.kobe-u.ac.jp

* /var/qmail/control/databytes に下の内容を書く

    100000000

  * 補足
    * メールの容量制限をする. 以上のように設定することで, 100MB 以上のサイズのメールは拒否される.

* /var/qmail/control/defaulthost に下の内容を書く

    tako-itpass.scitec.kobe-u.ac.jp

* パーミッションの変更

    # chmod 644 /var/qmail/control/databytes
    # chmod 644 /var/qmail/control/defaulthost


* 確認

  それぞれのファイルに書き込み終了後には, 正しく上の情報が書かれていることをcat(1) で確認する.  例:

  # cat /var/qmail/control/me
  tako-itpass.scitec.kobe-u.ac.jp


  これらの情報を qmail-showctl(8) で確認する.

  # /var/qmail/bin/qmail-showctl

== システムのメールアドレスの転送先設定

root 宛のメールをフォワードする先に itpadmin を指定する.
なお, "_at_" は "@" に読み替えること.

  # cd /var/qmail/alias
  # echo '&itpadmin_at_itpass.scitec.kobe-u.ac.jp' > .qmail-root
  # echo '&root' > .qmail-postmaster
  # echo '&root' > .qmail-mailer-daemon
  # echo '&root' > .qmail-bin
  # echo '&root' > .qmail-daemon
  # echo '&root' > .qmail-games
  # echo '&root' > .qmail-ingres
  # echo '&root' > .qmail-nobody
  # echo '&root' > .qmail-sys
  # echo '&root' > .qmail-uucp
  # echo '&root' > .qmail-mail
  # echo '&root' > .qmail-anonymous
  # echo '&root' > .qmail-www-data
  # chmod 644 .qmail-*

== メールの配送先設定

/etc/profileに以下を追記する.

  MAIL="$HOME/Mailbox"
  MAILDROP="$HOME/Mailbox"
  export MAIL MAILDROP

/etc/csh.cshrcに以下を追記する.

  setenv MAIL $HOME/Mailbox
  setenv MAILDROP $HOME/Mailbox

== インストールした実行ファイルへのパスの設定

インストールした qmail の実行ファイル群へパスを通す.

((<[ITPASS2017]パスの設定>)) の((* <一般ユーザ用コマンドのパス> *)) に ((*/var/qmail/bin*)) を追加する. (システム用コマンドも一般ユーザ用コマンドと同じ場所にインストールされているため, システム用コマンド用の設定を別途行う必要は無い).

  * 具体的には, 以下のようにする.
    * /etc/bash.bashrc の冒頭に

       # add PATH for local installed softwares
       PATH="${PATH}:/var/qmail/bin"
       # add PATH for local installed softwares (for root)
       if [ "`id -u`" -eq 0 ]; then
       PATH="${PATH}:/var/qmail/bin"
       fi
       export PATH

      を追加する.

    * /etc/csh.cshrc の冒頭に

       # add PATH for local installed softwares
       set path = ($path /usr/local/bin /usr/bin /bin /var/qmail/bin)
       # add PATH for local installed softwares (for root)
       if ( "`id -u`" == 0 ) then
       set path = ($path /usr/local/sbin /usr/sbin /sbin /var/qmail/bin)
       endif
    
      を追加する.

    * /etc/zsh/zshenv に

       # add PATH for local installed softwares
       export PATH="$PATH:/var/qmail/bin”
       # add PATH for local installed softwares (for root)
       if [ "`id -u`" -eq 0 ]; then
         export PATH="$PATH:/var/qmail/bin”
       fi

      の記述を追加する.

== インストールしたマニュアルへのパスの設定

/etc/manpath.config に以下の行を追加する.
詳しくは ((<[ITPASS2017]パスの設定>)) を参照のこと.

  MANDATORY_MANPATH                  /var/qmail/man
  MANPATH_MAP        /var/qmail/bin  /var/qmail/man
  MANDB_MAP          /var/qmail/man  /var/qmail/man

== 起動

* 起動方法の変更

/etc/systemd から qmail を立ち上げないようにする.

  # systemctl stop qmail.service
  # systemctl disable qmail.service

再起動する.

  # reboot

/etc/systemd/system/qmail.service を削除する.

  # rm /etc/systemd/system/qmail.service

qmail が起動していないことを確認した上で /etc/init.d から qmail を立ち上げるために起動スクリプトを作成する.

  # systemctl
  # vi /etc/init.d/qmail
  # chmod +x /etc/init.d/qmail

スクリプトの中身は以下の通り:

#!/bin/bash
#
# /etc/init.d/qmail : start or stop the qmail mail subsystem.
#
# source from http://www.atmarkit.co.jp/ait/articles/0211/02/news001.html
#
#
# modified by Rin Fujibayashi (2017/11/14)
# updated by MIKAMI Takashi (2015/12/15)
# updated by MIKAMI Takashi (2014/06/12)
# created by MIKAMI Takashi (2014/06/11)

### BEGIN INIT INFO
# Provides:          qmail
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:      $network $syslog
# Should-Stop:       $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop qmail
# Description:       qmail is qmail
### END INIT INFO

PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin

#[ -f /var/qmail/rc ] || exit 0
[ -f /var/qmail/bin/qmail-start ] || exit 0
[ -f /var/qmail/bin/qmail-send ] || exit 0


case "$1" in
     start)
        # Start daemons.
        echo "Startig mail-transfer agent: qmail."
        sh -c '/var/qmail/rc &'

        # For SMTP
#        sh -c " /sbin/start-stop-daemon --start --quiet --user qmaild \
#        --pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
#        --exec /usr/local/bin/tcpserver -- -HRv -u ` id -u qmaild ` \
#        -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb 0 smtp \
#        /usr/local/bin/rblsmtpd -r bl.spamcop.net \
#      /var/qmail/bin/qmail-smtpd 2>&1 \
#      | /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"

        # For SMTP over SSL
#       sh -c "/sbin/start-stop-daemon --start --quiet --user qmaild \
#       --pidfile /var/run/tcpserver_ssmtp.pid --make-pidfile \
#       --exec /usr/local/bin/tcpserver-ssl -- -s -HRv -u \
#       ` id -u qmaild ` -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb \
#        -n /var/qmail/server.key/qmail.pem 0 ssmtp \
#        /usr/local/bin/rblsmtpd -r bl.spamcop.net \
#      /var/qmail/bin/qmail-smtpd-auth tako-itpass.scitec.kobe-u.ac.jp \
#        /bin/checklocalpwd /bin/true 2>&1 \
#      | /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"

        # For POP3
#      sh -c "/sbin/start-stop-daemon --start --quiet --user root \
#      --pidfile /var/run/tcpserver_pop3d.pid --make-pidfile \
#      --exec /usr/local/bin/tcpserver -- -v -u 0 -g 0 0 pop3 \
#      /var/qmail/bin/qmail-popup \
#      tako-itpass.scitec.kobe-u.ac.jp /bin/checkapoppw \
#      /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
#      | /var/qmail/bin/splogger pop3d 3 > /dev/null 2>&1 &"

        # For POP3 over SSL
#      sh -c "/sbin/start-stop-daemon --start --quiet --user root \
#      --pidfile /var/run/tcpserver_pop3s.pid --make-pidfile \
#      --exec /usr/local/bin/tcpserver-ssl -- -s \
#       -n /var/qmail/server.key/qmail.pem \
#      -v -u 0 -g 0 0 pop3s \
#      /var/qmail/bin/qmail-popup \
#      tako-itpass.scitec.kobe-u.ac.jp /bin/checkapoppw \
#      /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
#      | /var/qmail/bin/splogger pop3d 3 > /dev/null 2>&1 &"

        ;;

     stop)
        # Stop daemons.
        echo "Stopping mail-transfer agent: qmail"
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ; then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi

#      /sbin/start-stop-daemon --user qmails --stop --quiet --oknodo --exec /var/qmail/bin/qmail-send # qmail-send
#      /sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_smtpd.pid --exec /usr/local/bin/tcpserver # smtp
#        /sbin/start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3d.pid --exec /usr/local/bin/tcpserver # pop3
#      /sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_ssmtp.pid --exec /usr/local/bin/tcpserver-ssl # smtp over SSL
#      /sbin/start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3s.pid --exec /usr/local/bin/tcpserver-ssl # pop3s


        ;;

        # ===modified by Mikami Takashi (2014/06/11)===
     restart)
        $0 stop
        $0 start
        ;;

        # ===modified by Mikami Takashi (2014/06/11)===
     cdb)
        echo "Rebuilding tcp.smtp.cdb"
        cd /etc
        /usr/local/bin/tcprules /etc/tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp
        ;;

     *)
        echo 'Usage: /etc/init.d/qmail {start|stop|restart|cdb}'
        exit 1
esac

exit 0

ブート時に自動的に起動させるため, 以下のコマンドで各/etc/rc.X ディレクトリからシンボリックリンクを貼る.

  # update-rc.d qmail defaults

再起動する.

  # reboot

#qmail を起動する.

#  # /etc/init.d/qmail start

qmail が起動しているか確認する.

  # ps aux | grep qmail
  # service qmail status  
  
== 配送テスト

配送テスト (ローカル配送, リモート送り出しテスト) を行う.

=== [テスト 1] ローカル配送テスト part1

Mailbox が生成されるように .qmail を作成し, 以下のように書き込む.

    $ vi .qmail
    /home/chikuwa/Mailbox

配送テストを行う. 自分に送ってみる. 以下のコマンドを実行して, ~chikuwaXX/Mailbox にメールが送られることを確認する.

    $ echo to: chikuwaXX | /var/qmail/bin/qmail-inject
    $ lv ~chikuwa/Mailbox

=== [テスト 2] ローカル配送テスト part2

存在しない宛先に送ってみる. バウンスメールが ~chikuwaXX/Mailbox に送られてく
ることを確認する.

    $ echo to: nonexistent | /var/qmail/bin/qmail-inject
    $ lv ~chikuwaXX/Mailbox

=== [テスト 3] リモート送り出しテスト part1

他のホスト上のアカウントへ送って, 届いていることを確認する.

    $ echo to: hoge_at_gfd-dennou.org | /var/qmail/bin/qmail-inject

=== [テスト 4] リモート送り出しテスト part2

他のホスト上の存在しない宛先に送る.
-f オプションでバウンスの送り先を指定する.

    $ echo to: hoge_at_gfd-dennou.org | /var/qmail/bin/qmail-inject -f chikuwa_at_tako-itpass.scitec.kobe-u.ac.jp

chikuwa_at_tako-itpass.scitec.kobe-u.ac.jp にバウンスが来ていることを確認する.

    $ lv ~chikuwaXX/Mailbox

== sendmail の「置き換え」

まず, exim4 が起動している場合は停止.
#ここで, exim4 は起動していないことが期待される.

   # /etc/init.d/exim4 stop

exim のブートスクリプトは, /etc/init.d/exim4 で, これに
/etc/rc[2-5].d/S20exim, /etc/rc{1,6}.d/K20exim からリンクが張られてい
る. これを無効にする.

    # chmod 000 /etc/init.d/exim4
    # mv /etc/init.d/exim4 /etc/init.d/exim4.bak
    # update-rc.d exim4 remove

cron から exim が呼び出される処理を無効にする.
/etc/cron.daily/exim4-base の先頭の方に次の行を書き足す.

  * 3 行目の [ と ! の間にはスペースがあることに注意. 詰めて書いてはいけない (man [(1)). (「[」と「と」, 「と」と「!」の間にスペースを入れた)

  #!/bin/sh
  # by Yasuhiro MORIKAWA, 2007-08-10. We need not exim.
  if [ ! -f /etc/exim.conf ]; then
    exit 0
  fi

これで, /etc/cron.daily/eximは, /etc/exim.confが存在しない場合には何もせず終了するようになる.

そして, sendmailを置き換える.

  # chmod 000 /usr/lib/sendmail
  # chmod 000 /usr/sbin/sendmail

  # mv /usr/lib/sendmail /usr/lib/sendmail.bak
  # mv /usr/sbin/sendmail /usr/sbin/sendmail.bak

  # ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
  # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

次のコマンドで exim4 関係のパッケージを hold して, 更新されないようにする.

  # echo exim4 hold | dpkg --set-selections
  # echo exim4-base hold | dpkg --set-selections
  # echo exim4-config hold | dpkg --set-selections
  # echo exim4-daemon-light hold | dpkg --set-selections

Debian パッケージの枠組で cron と exim4 (MTA なら何でもよい) は依存関係があるので, exim4 を消してしまうと cron が利用するメールサーバが Debian パッケージの枠組内では存在しないと認識されてしまう. そのため, exim4 を消さずにあえて残している.

== とりあえず用の smtp の設定

後で tcpserver をインストールするので, 最終的にこの設定は不要になる. とりあえず受信テストのために, 以下のように inetd を設定する.

/etc/inetd.conf に以下を追加する.

  smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd

/etc/inetd.conf を読み直させるために次を実行する.

  # /etc/init.d/openbsd-inetd restart

#qmail の設定ファイルを作成する. chikuwa のアカウントの設定ファイル .qmail を#作成し,

#  /home/ユーザ名/Mailbox

#と書く.

mail コマンドをインストールして, 以下のコマンドを実行する.

  $ sudo apt-get install bsd-mailx
  $ export MAIL=~/Mailbox
  $ mail

他のホストのアドレスで chikuwaXX_at_tako-itpass.scitec.kobe-u.ac.jp へメールを送信し, Mailbox の中身を確認する.

  $ mail

参考:((<URL:http://man.qmail.jp/jinstall/test.receive.html>))

== 2017 年度 ITPASS サーバ再構築作業でのメモ

* 2017 年度 ITPASS サーバ再構築作業時に 2016 年度以前と同様 qmail-1.03 をインストールしたところ, qmail がうまく起動しなかった.
  * 起動失敗の原因は debian (stretch) のアップデートにあると考えられる.
  * ((<"メールサーバ構築 (qmil, dovecot) (北大 EPnetFaN)"|URL:http://www.ep.sci.hokudai.ac.jp/~epmail/y2017/dvlop/qmail.html>)) を参考に qmail のインストールを行うことで対処した.
    * 2018 年度以降の再構築にも同様の作業を行うこととする.

== 参考資料

* ((<[ITPASS2016]qmail のインストールと設定>))

* ((<"メールサーバ構築 (qmil, dovecot) (北大 EPnetFaN)"|URL:http://www.ep.sci.hokudai.ac.jp/~epmail/y2017/dvlop/qmail.html>))

* ((<"セカンダリメールサーバの構築 (北大 EPnetFaN)"|URL:http://www.ep.sci.hokudai.ac.jp/~epmail/y2011/dvlop/www.html>))

* ((<qmail netqmail における 512 バイトを超える DNS 応答の不適切な取り扱いについて|URL:http://jprs.jp/tech/notice/2011-03-03-inappropriate-handling-for-long-dns-packet.html>))

* ((<Life with qmail|URL:http://ya.maya.st/mail/lwq.html#dns-patches>))

* ((<qmail を DNSSEC に対応させるパッチの適用|URL:http://blog.netandfield.com/shar/2011/02/qmail-dnssec.html>))


[((<ITPASSサーバ構築・運用ドキュメント>)) へ戻る]