Mailサーバの構築

SMTPとMTA

インターネット上でメイルのやり取りをするための規定を SMTP(Simple Mail Transfer Protocol)という。

http://www.puni.net/~mimori/rfc/menu.html

RFC2810 1〜3章4,5章6章

メイルサーバは,MTA(Message Transport Agent)といい, 標準ではTCPの25番ポートでクライアント接続を受け付け, SMTPで決められたやり取りをした上で,クライアントからの メッセージを受け取り,ローカル,あるいは別のメイルサーバへ 配送する。

別のドメイン宛のメイルはSMTPサーバどうしでやりとりをしながら 配送が行なわれる。このときのやりとりの進め方の決まりがSMTPである。 SMTPは単純化すると以下のような順番でのやりとりである。

送信側受信側
HELO自己ホスト名の送出
受理
OK
MAIL FROM送信者アドレス
受理
OK
RCPT TO宛先アドレス
受理
OK
DATAヘッダを含む本文
終端記号"." だけの行
OK
QUIT受理
OK

たとえば,taro@host-A から hanako@host-B に送るときのやりとりの流れ は以下のようになる。

host-Aが送る文字列 host-Bが送る文字列
220 host-B SMTP
HELO host-A
220 host-B SMTP
MAIL FROM: taro@host-A
250 ok
RCPT TO: hanako@host-B
250 ok
DATA
354 go ahead
ヘッダと本文
.
250 ok
QUIT
221 host-B

ヘッダと本文は1行空行を入れて境界とする。

qmail

代表的なMTAには以下のものがある。

ここではqmailの

qmailのインストール

http://qmail.org/netqmail-1.06.tar.gz からソースアーカイブを入手し,コンパイル&インストールする。 このとき,qmail-utmpx.diff が必要になるので同じディレクトリに保存しておく。

cd ~/make
fetch -4 http://qmail.org/netqmail-1.06.tar.gz
fetch -4 このリンクのURL
tar zxpf netqmail-1.06.tar.gz
cd netqmail-1.06
cat ../qmail-utmpx.diff | patch
ls
  :
  :

一般的に READMEINSTALL というファイルに最初に必要な手順が 書いてあることが多い。

less README
less INSTALL
See http://lifewithqmail.org/lwq.html

本来はこのページを見て作業を進める。作業手順は

  1. ユーザID/グループIDの追加

    qmailはスーパーユーザ権限で動くプログラムを最小にする というポリシーで設計されている。メイル配送に必要な細かい仕事を 分担する一般ユーザをいくつか作る必要がある。

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

    実際にコンパイルする。

である。このうち1番については「OSによる違いが大きい」, 「面倒だがコピーペーストで終わってしまう」ことから,本講座では 全員分既に完了した状態にしてある。以下では2の作業を行なう。

To create /var/qmail and configure qmail (won't interfere with sendmail):

 1. Create the qmail home directory:
       # mkdir /var/qmail

 2. Read INSTALL.ids. You must set up the qmail group and the qmail
    users before compiling the programs.

 3. Compile the programs and create the qmail directory tree:
       # make setup check

 4. Read INSTALL.ctl and FAQ. Minimal survival command:
       # ./config

 5. Read INSTALL.alias. Minimal survival command:
       # (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon
         .qmail-root)
       # chmod 644 ~alias/.qmail*

この手順に従う。ただし,ここから先はスーパーユーザ権限が要るので ユーザを変更する。

sudo -H -s

スーパユーザでコンパイルとインストールをする。

mkdir /var/qmail
make setup check
./config
(cd ~alias; touch .qmail-{postmaster,mailer-daemon,root})
chmod 644 ~alias/.qmail-*

設定ファイルの作成

最後の ./config で各種設定ファイルを自動生成している。 すでにこれだけでも動かすのに十分な最低限の設定が終わっている。 これらの設定ファイルを見ていこう。

head /var/qmail/control/*
==> /var/qmail/control/defaultdomain <==
is.koeki-u.ac.jp

==> /var/qmail/control/locals <==
qm200.is.koeki-u.ac.jp

==> /var/qmail/control/me <==
qm200.is.koeki-u.ac.jp

==> /var/qmail/control/plusdomain <==
ac.jp

==> /var/qmail/control/rcpthosts <==
qm200.is.koeki-u.ac.jp

もうひとつ,コマンドラインでメイルを送るときにデフォルトで付ける メイルドメインを定義する。/var/qmail/control/defaulthost に そのホストの名前を書き込む。以下のようにする。

hostname > /var/qmail/control/defaulthost
cat !$

これで,defaulhostファイルに qmXXX.is.koeki-u.ac.jp が書き込まれる。

sendmailの置き換え

多くのシステムではメイルを配送するコマンドとして Sendmailを標準的に採用している。FreeBSDも該当し/usr/bin/sendmail を使うことになっている。sendmailではなくqmailのものを使うように変更する。

/etc/mail/mailer.conf に「どのような処理にどのコマンドを 使うか」という定義があるのでこのファイルを書き換える。

vi /etc/mail/mailer.conf

1行目を以下のように書き換える。

修正前

sendmail	/usr/libexec/sendmail/sendmail
send-mail	/usr/libexec/sendmail/sendmail

修正後

sendmail	/var/qmail/bin/datemail
send-mail	/var/qmail/bin/datemail

デーモンプログラムの起動

以上で設定ファイルの作成まで完了した。プログラムを起動するための スクリプトを作成する。/var/qmail/boot に起動スクリプトの見 本があるので,これをコピーしてから編集する。ファイル名は /var/qmail/rc とする。

pushd /var/qmail
cp boot/home rc
vi rc

/var/qmail/rc

#!/bin/sh

Using splogger to send the log through syslog.
Using qmail-local to deliver messages to ~/maildir/.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./maildir/ splogger qmail &

変更点は下線で示した部分。

実際に起動してみる。

/var/qmail/rc
ps ax
  PID  TT  STAT      TIME COMMAND
  953  ??  SsJ    0:00.25 /usr/sbin/syslogd -s
 7206  ??  IsJ    0:00.00 /usr/sbin/sshd
 7207  ??  IsJ    0:00.02 sshd: c103000 [priv] (sshd)
 7210  ??  SJ     0:00.16 sshd: c103000@ttyp2 (sshd)
 7211  p2  SsJ    0:00.07 -zsh (zsh)
17112  p2  SJ     0:00.05 /bin/zsh
18883  p2  IJ     0:00.00 qmail-send
18884  p2  IJ     0:00.00 splogger qmail
18885  p2  IJ     0:00.00 qmail-lspawn ./maildir/
18886  p2  IJ     0:00.00 qmail-rspawn
18887  p2  IJ     0:00.00 qmail-clean
18893  p2  R+J    0:00.00 ps ax

qmail-send のプロセスがあることを確認する。

配送試験

自分宛にメイルを送ってみる。配送試験のときにはログファイルを 垂れ流し表示しておくとよい。screen の2つのウィンドウを利用し, 1つにメイルログを表示し,もう片方で送信してみる。

  1. screenで最低2つのウィンドウを起動しておく
  2. 片方で sudo tail -f /var/log/maillog する
  3. 別のウィンドウに切り替えてサーバ内の自分宛にメイル送信し maillog を表示したウィンドウに戻りログを確認する。

たとえば次のようにすると「今月のカレンダー」が自分宛に送れる。

cal | Mail -s calendar c10XXXX
(XXXXは自分の番号)

以下のようなログメッセージが書かれるはずである。

Mar  6 19:33:57 qm200 qmail: 1141641237.791199 new msg 141939
Mar  6 19:33:57 qm200 qmail: 1141641237.791351 info msg 141939: bytes 387 from <root@itl.koeki-u.ac.jp> qp 19139 uid 0
Mar  6 19:33:57 qm200 qmail: 1141641237.794099 starting delivery 1: msg 141939 to local c103000@qm200.is.koeki-u.ac.jp
Mar  6 19:33:57 qm200 qmail: 1141641237.794184 status: local 1/10 remote 0/20
Mar  6 19:33:57 qm200 qmail: 1141641237.840656 delivery 1: success: did_1+0+0/
Mar  6 19:33:57 qm200 qmail: 1141641237.840854 status: local 0/10 remote 0/20
Mar  6 19:33:57 qm200 qmail: 1141641237.841067 end msg 141939

success と出ていれば配送成功だと分かる。実際に配送されるのは 一般ユーザの ~/maildir/new ディレクトリである。一般ユーザに 戻ってこのディレクトリを確認する。

suspend
zsh: suspended  sudo -s -H
cd          (ホームディレクトリに戻る)
ls -l maildir/new
-rw-------  1 c103000  471  3  6 19:33 1141641237.19142.qm200.is.koeki-u.ac.jp

実際にこのファイルを直接見て,送った内容が正しく届いているか確認する。

less maildir/new/*

個人のメイル配送先を決めるファイルは ~/.qmail で その中には ./maildir/ と書かれている。qmailを初めて導入する ホストのユーザのホームディレクトリには通常 ~/.qmail~/maildir/ も存在しないので,その場合手動で作らなければなら ない。それには一般ユーザで以下のようにする。

/var/qmail/bin/maildirmake ~/maildir
echo ./maildir/ > ~/.qmail

SMTPサーバの起動設定

qmail付属のSMTPサーバプログラムqmail-smtpdは,tcpserver経由で 起動する。

smtpdの起動を管理するディレクトリを新規に作成し,そこに移動する。

mkdir /var/qmail/qmail-smtpd
cd !$

tcpserver用のアクセス制御ファイルを smtp という名前で作成する。

vi smtp

smtp

127.0.0.1:allow,RELAYCLIENT=""
172.19.5.:allow,RELAYCLIENT=""
172.21.90.10:allow,RELAYCLIENT=""
:allow

アクセス制御ファイルをバイナリ形式(smtp.cdb)に変換する。

PATH=/var/local/bin:$PATH
tcprules smtp.cdb tmp < smtp
ls -l
total 6
-rw-r--r--  1 root  qmail    69  3  7 11:55 smtp
-rw-r--r--  1 root  qmail  2166  3  7 11:56 smtp.cdb

qmail-smtpd 起動用シェルスクリプトを作成する。

vi start-smtpd.sh

/var/qmail/qmail-smtpd/start-smtpd.sh

#!/bin/sh
PATH=/usr/local/bin:/var/qmail/bin:/bin:/sbin:/usr/bin:/usr/sbin
mydir=`dirname $0`
uid=`id -u qmaild`
gid=`id -g qmaild`
cd $mydir
exec env - PATH=$PATH \
tcpserver -vR -c40 -p -u $uid -g $gid -x smtp.cdb 0.0.0.0 \
    smtp qmail-smtpd 2>&1 | splogger qmail-smtpd &

シェルスクリプトに実行属性を付ける。

chmod +x start-smtpd.sh

このスクリプトを起動するとSMTP(25)ポートで待ち受ける形でsmtpサーバが 上がる。起動前と起動後の待ち受け状態は netstat と telnet で確認できる。

SMTPのプロトコルコマンドについては次回実験する。

実際に外部ホスト(pan)からメイルを送ってみる。 panで起動しているktermのコマンドラインからメッセージを送信する。 Mailコマンドを利用する。

pan% Mail -s test c10XXXX@qm**.is.koeki-u.ac.jp
とどくかな届くかな。
えいやっ。
C-d

最後の行は C-d をタイプする。

システムの初期化ファイルに登録

リブート後にも起動するよう /etc/rc.local を 作成する。

vi /etc/rc.local

/etc/rc.local

#
# rc.local
#

# Starting qmail
if [ -x /var/qmail/rc ]; then
	/var/qmail/rc; 				echo -n ' qmail'
fi

# Starting qmail-smtpd
if [ -x /var/qmail/qmail-smtpd/start-smtpd.sh ]; then
	/var/qmail/qmail-smtpd/start-smtpd.sh;	echo -n ' smtpd'
fi
yuuji@koeki-u.ac.jp