クスクス り〜な!
雑記など

メールサーバーを導入します。

例によって、「ローカルネットワークで大げさ!」というご指摘あろうかと思いますが、httpやらなんやらが管理者にメールを出す時、ローカルのメール鯖が動いていると楽なんですよ。いろいろと・・・ (^^;)

さてさて、E-Mailと言えば sendmail ・・・・なんてもう古いぜ!!! これからは Postfix だい!! という声が聞こえてきそうですね。おまけにPostfixはバグも取れてきて、安定使用しておられるサイトも多いようですが、私は昔からqmailなので。

インストール anchor.png Edit

ではまず、qmailも持ってきて解凍します。あ、それと、checkpasswordも忘れずに。

http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz

http://cr.yp.to/software/qmail-1.03.tar.gz

$ wget ftp://ftp.ntnu.no/pub/unix/mail/qmail/qmail-1.03.tar.gz
  --14:16:06--  ftp://ftp.ntnu.no/pub/unix/mail/qmail/qmail-1.03.tar.gz
             => `qmail-1.03.tar.gz.1'
  ftp.ntnu.no をDNSに問いあわせています... 129.241.56.118
  ftp.ntnu.no|129.241.56.118|:21 に接続しています... 接続しました。
  anonymous としてログインしています... ログインしました!
  ==> SYST ... 完了しました。    ==> PWD ... 完了しました。
  ==> TYPE I ... 完了しました。  ==> CWD /pub/unix/mail/qmail ... 完了しました。
  ==> PASV ... 完了しました。    ==> RETR qmail-1.03.tar.gz ... 完了しました。
  長さ: 220,668 (215K) (確証はありません)

  100%[====================================>] 220,668       61.07K/s    ETA 00:00

  14:16:14 (53.04 KB/s) - `qmail-1.03.tar.gz' を保存しました [220668]

$ wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
  --14:18:13--  http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
             => `checkpassword-0.90.tar.gz.1'
  cr.yp.to をDNSに問いあわせています... 131.193.36.21
  cr.yp.to|131.193.36.21|:80 に接続しています... 接続しました。
  HTTP による接続要求を送信しました、応答を待っています... 200 OK
  長さ: 15,631 (15K) [application/x-gzip]

  100%[====================================>] 15,631        30.39K/s

  14:18:14 (30.31 KB/s) - `checkpassword-0.90.tar.gz.1' を保存しました [15631/15631]

$ tar xzvf qmail-1.03.tar.gz
          ・
          ・
          ・
$ tar xzvf qmail-1.03.tar.gz
$ tar xzvf checkpassword-0.81.tar.gz
          ・
          ・
          ・

さて、コンパイルも前。例によって、error.hを修正しましょうね。

( qmail-1.03/ と checkpassword-0.81/ に一個づつあります)

#ifndef ERROR_H
#define ERROR_H

/*extern int errno;*/
#include <errno.h>

extern int error_intr;
extern int error_nomem;
          ・
          ・
          ・

さて、このままコンパイル・・・・してはいけません。先にユーザーを作っておかなくてはいけないのです。qmailは、動作を担当するプログラムを細かく分け、かつ、おのおのができるだけ別のユーザー権限で動こうとするのです。万が一のアタックで一部のプログラムが落ちたり乗っ取られてしまっても安心なわけです。

で。とにかく、まずqmailのディレクトリを作り、以下のようにユーザーを作ってください。

# mkdir /var/qmail
# groupadd nofiles
# adduser -g nofiles -d /var/qmail/alias alias -s /bin/false
# adduser -g nofiles -d /var/qmail qmaild -s /bin/false
# adduser -g nofiles -d /var/qmail qmaill -s /bin/false
# adduser -g nofiles -d /var/qmail qmailp -s /bin/false
# groupadd qmail
# adduser -g qmail -d /var/qmail qmailq -s /bin/false
# adduser -g qmail -d /var/qmail qmailr -s /bin/false
# adduser -g qmail -d /var/qmail qmails -s /bin/false
#

qmailは、コンパイル時にこれらユーザーのUIDとGIDを記憶します。なので、ここで作ったユーザーやグループは、あとでUIDやGIDを変更したりしてはいけません

あとは、例によってこのパターンでコンパイルとインストールを行います。いつもの開発環境を入れますが、qmailだけはもう一個。groff というパッケージが必要です。あらかじめ入れておいてください。これはコンパイルの時だけに必要なので、インストールが終わったら削除してかまいません。

# apt-get install groff
   ・
   ・
   ・
# make
   ・
   ・
   ・
# make setup check
   ・
   ・
   ・
nroff -man addresses.5 > addresses.0
nroff -man envelopes.5 > envelopes.0
nroff -man forgeries.7 > forgeries.0
./install
./instcheck
#

DNSを引ける環境では、 ./config スクリプトを実行すれば、とりあえずの設定をいろいろとやってくれます。(ウチの鯖は当然DNSがちゃんと引けるようになっとります。(^^) )

# ./config

これで、qmailの設定ファイル郡である /var/qmail/control/* が一通り作られます。

次に、エイリアスを作ります。qmail は、root・postmastor・mailerdaemon 宛にやってくるメールを全て /var/qmail/alias/Mailbox に届けます。安全性の確保のためですね。そのための設定は、/var/qmail/alias 以下に、「.qmail」+ユーザー名 という名前でファイルを作っておくのです。具体的には、こうなります。

# cd /var/qmail/alias
# touch .qmail-postmaster
# touch .qmail-mailer-daemon
# touch .qmail-root
# chmod 644 ./.qmail*

さて、これで一通りの設定はできました。

Page Top

動作テスト anchor.png Edit

動作テストをしてみます。まずは、qmail を、仮稼動させてみます。

# ps x
      ・
      ・
      ・
 526 ?        S      0:00 login -- toyotomi
 547 pts/0    S      0:00 su -
 548 pts/0    S      0:00 -bash
2479 pts/0    R      0:00 ps x
# /var/qmail/boot/home &
#ps x
      ・
      ・
      ・
 526 ?        S      0:00 login -- toyotomi
 547 pts/0    S      0:00 su -
 548 pts/0    S      0:00 -bash
2479 pts/0    S      0:00 qmail-lspawn ./Mailbox
2485 pts/0    R      0:00 ps x
#

お?動いているようですね。

この状態で、ローカルにメールを配信してくれるかどうかテストしてみます。

# echo "to:toyotomi"|/var/qmail/bin/qmail-inject
# ls /home/toyotomi/
Mailbox  lib/  rpm/

おぉ!ちゃんと toyotomo ユーザーのホームに、Mailboxというファイルを作って配信してくれたみたいですね。

ひとまずこれでOKです。一旦 qmailを落とします。

# ps x
      ・
      ・
      ・
 526 ?        S      0:00 login -- toyotomi
 547 pts/0    S      0:00 su -
 548 pts/0    S      0:00 -bash
2479 pts/0    S      0:00 qmail-lspawn ./Mailbox
2485 pts/0    R      0:00 ps x
# kill 2479
# ps x
      ・
      ・
      ・
 526 ?        S      0:00 login -- toyotomi
 547 pts/0    S      0:00 su -
 548 pts/0    S      0:00 -bash
2485 pts/0    R      0:00 ps x
#
Page Top

maildir形式にする anchor.png Edit

qmailは、特になにも設定しないと、今回のようにMailboxという形式でメールを配信します。これはようするに、全てのメールが ~/Mailbox という単一ファイルに書き込まれる形式です。この形式は一見便利なようで、様々な問題を含んでいるそうです。また、qmailの場合、この形式では POPアクセスが出来ませんので、「Maildir」形式にしてみましょう。まあようするに、あるディレクトリに、メールごとにファイルを作ってそこに格納するという形式です。

toyotomiユーザーを、Maildir形式で受信できるようにします。手順としては、

  1. まず、toyotomi ユーザーに su する。
  2. toyotomi ユーザーのホームに移動する。
  3. スクリプトを使って、自動でMaildir形式のディレクトリを作る
  4. 「俺にはMaildir形式で配ってね。」と設定する。
  5. toyotomi ユーザーから抜ける

以上です。では、具体的にやってみましょう。

# su toyotomi
$ cd ~
$ /var/qmail/bin/maildirmake Maildir
$ echo $HOME/Maildir/ >.qmail
$ exit
#

・・・以上です。(簡単でしょ?)

動作実験をしてみます。まず、さっきのMailboxファイルを削除しておきます。(わかんなくなっちゃうから)

# rm /home/toyotomi/Mailbox

Maildir の中身を確認してみます。

# ls /home/toyotomi/Maildir/new
#

からっぽですね。

qmail を仮稼動させ、toyotomiにメールを送ってみます。

# /var/qmail/boot/home &
[1] 2497
# echo "to:toyotomi"|/var/qmail/bin/qmail-inject
# ls /home/toyotomi/Maildir/new/
1098967425.2518.toyotomi.hideyosi.local

ほら! ちゃんと配信されてますね!。うまくいったようです。

動作確認ができたら、再び仮稼動のqmailを落としておきます。

# ps x
          ・
          ・
          ・
 526 ?        S      0:00 login -- toyotomi
 547 pts/0    S      0:00 su -
 548 pts/0    S      0:00 -bash
2499 pts/0    S      0:00 qmail-lspawn ./Mailbox
2520 pts/0    R      0:00 ps x
# kill 2499
# ps x
          ・
          ・
          ・
 526 ?        S      0:00 login -- toyotomi
 547 pts/0    S      0:00 su -
 548 pts/0    S      0:00 -bash
2521 pts/0    R      0:00 ps x
#
Page Top

中枢部分をdaemontoolsで起動 anchor.png Edit

さて。仮稼動でほぼ動作がうまくいっていることが確認できたら、この中枢部分をdaemontoolsで起動させましょう。

daemontoolsでの管理。DNSの時にやったのと同じようなパターンになります。

  1. デーモンを動かすユーザーの決定or新設
  2. ログを受け取るユーザーの決定or新設
  3. /var/service以下にディレクトリを作る
  4. 動作させるrunスクリプトを書く
  5. ログ用のディレクトリを作る
  6. ログ受け取り用のrunスクリプトを書く
  7. /servece に、リンクを張る

ちなみに、qmailの場合は動かすユーザーもログ用のユーザーももう決まっています。qmailqとqmaillです。

では、実際に設定してみましょう。

# cd /var/servicd
# mkdir qmail
# chmod +t qmail
# cd qmail
# touch run
# chmod 755 run
# mkdir log
# chmod 755 log
# chown qmaill:nofiles log
# touch log/run
# chmod 755 log/run

さて、それでは、 run と lig/run の中身を書きます。私はこういうふうに書きました。

/var/service/qmail/run

#!/bin/sh

exec env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin " \
qmail-start ./Mailbox

/var/service/qmail/log/run

#!/bin/sh
exec \
setuidgid qmaill \
multilog t ./main

さあ、それでは、/service にリンクを張ってください。数秒したら、先ほどの動作テストと同じことをして、配信がうまくいくかどうか確認します。

# cd /service
# ln -s /var/service/qmail

ちゃんと動いているか、ログをチェックしておきます。

# cat /service/qmail/log/main/current
@4000000048f5815f23f3b27c status: local 0/10 remote 0/20

どうやらうまく稼動しているようですよ??

Page Top

SMTPサーバーの設置 anchor.png Edit

qmailの中枢部分がうまく稼動したら、やっぱり別のマシン(Windowsとかの)から、送信をしてみたいですよね。そこで、qmailのSMTP部分を動かしてみます。

なに。例によってdaemontoolsでチョチョイのちょい!

・・・えー。そろそろ面倒くさくなってきたので、スクリプトだけ載せときます。

# cd /var/servicd
# mkdir smtp
# chmod +t smtp
# cd smtp
# touch run
# chmod 755 run
# mkdir log
# chmod 755 log
# chown qmaill:nofiles log
# touch log/run
# chmod 755 log/run
# touch tcp.smtp

/var/service/smtp/run

#!/bin/sh

#User = qmaild

exec env - PATH="/var/qmail/bin:$PATH" \
tcpserver -v -R -H -l0 -x tcp.smtp.cdb -uxxx -gxxx 0 smtp qmail-smtpd 2>&1

-u と -g は、貴方のqmaildのUIDとGIDに置き換えてください

/var/service/smtp/log/run

#!/bin/sh

exec \
setuidgid qmaill \
multilog t ./main

smtpサーバーはspamメールの温床になりかねませんね。 誰でも、どこからでもこのサーバーを使われてしまうとそれこそ大変です。(自分のsmtpサーバーから世界中にspamが配信されるなんて・・・((((;゜Д゜)))ガクガクブルブル  )

そのため、qmailのsmtpサーバーは初期状態(つまりインスコして稼動させただけ)ではあらゆる配信を行わず拒否します。たぶん他のマシンから送信等のテストを行ったなら、こんなエラーが出ているのではないでしょうか?

553 sorry. that domain isn't in my list of allowed rcpthosts (#5.7.1)

ある部分に、「ウチのドメインからの送信要求は受け付けておくれ。他はいままで通り拒絶ね」という指定をしてやらないといけないのです。

我が家( *.hideyosi.local )からの送信要求を受け付けるように設定します。

Page Top

qmailのコントロールファイル達 anchor.png Edit

 /var/qmail/control/ 以下にあるのがコントロールファイル郡です。

様々な設定ができますし、ある程度は自動で生成されているはずですので、最低限の設定を行います。

Page Top

me anchor.png Edit

自分自身のホスト名を書いておきます。

ウチのように一つの鯖に複数の名前がある場合、とりあえずメインとなる名前を書いておきます。

Page Top

locals anchor.png Edit

ここに書かれているサーバー宛のものはローカルホスト(つまり他に通信をしないで内部のみで行えという意味)として扱われます。

例えばですが、我が家の鯖のように、一つのマシンで複数のIPやホスト名を稼動させているなんて場合ですね。

localhost
www.hideyosi.local
ftp.hideyosi.local
dns.hideyosi.local
pop.hideyosi.local
hideyosi.local

こんなふうに書いておくと、

toyotomi@localhost
hideyosi@www.hideyosi.local
toyotomi@pop.hideyosi.local

こういった宛先のメールはローカルとして自分の内部への配信なんだと理解してくれます。

ちなみに、最後の行に注目してください。

現在では多くの場合、メールアドレスはドメインを指定し、サブドメイン部は書かないことが多いですね。(そのほうが解りやすいし)

最後のものは、 toyotomi@hideyosi.local こういう形式の場合、ローカルだよという意味になります。

Page Top

rcpthosts anchor.png Edit

さあお待たせしました。

ここに書かれているドメイン宛のメール。qmailはそれだけを受け付けて配信しようとし、それ以外は全て拒絶します。

このおかげで、ウチの鯖がyahoo.co.jp等ヨソ宛のメールを配信したりがないわけです。

ウチのドメインは hideyosi.local なので、toyotomi@hideyosi.local等宛のメールは受付け、配信するようにここに書いておきましょう。

localhost
.hideyosi.local
hideyosi.local

さあ!

これで、 toyotomo@pop.hideyosi.local や lina@www.hideyosi.local は送信できるようになったはず!!

他のWindowsマシンとかから送信してみよう!!

Page Top

サブドメイン省略型 anchor.png Edit

・・・でも、イマイチ・・・・

そう。この状態だと、まだ toyotomi@hideyosi.local の形式の配信はしてくれないんだ!!

(rcpthostsで書いたって? おっと。誤解があるようです。あそこはあくまでも、smtpサーバーが受け付けるという設定。受け付けた結果、「こんなアドレスじゃ配信先がわからんぞ?」ということだってある。今はそれに近い状態なわけ。)

サブドメイン部が省略された場合、ちゃんと補完してくれればいいよね?

そのための設定が defaulthost というファイルなわけ。

このファイルは標準では生成されていないはず。自分で作ろう

この名前のファイルに

hideyosi.local

と書いておけばそれでOKなのだー!

このファイルはsmtpだけではなく、配信を司るqmailにも影響するので両デーモンを再起動しておこう

# echo hideyosi.local > /var/qmail/control/defaulthost
# svc -t /service/smtpd
# svc -t /service/qmail

さあ、これで、 toyotomi@hideyosi.local 形式のメールを送信・受付・配信できるようになったはずだよ!

Page Top

POPサーバーの設置 anchor.png Edit

# cd /var/servicd
# mkdir pop
# chmod +t pop
# cd pop
# touch run
# chmod 755 run
# mkdir log
# chmod 755 log
# chown qmaill:nofiles log
# touch log/run
# chmod 755 log/run
# touch tcp.pop

/var/service/pop/run

#!/bin/sh

exec env - PATH=/bin/:/usr/local/bin:/var/qmail/bin \
tcpserver -vRH -c 40 -x ./tcp.pop3.cdb 0 pop-3 \
qmail-popup pop.mana.local checkpassword qmail-pop3d Maildir 2>&1

/var/service/pop/log/run

#!/bin/sh

exec env - PATH=/usr/local/bin:$PATH \
setuidgid qmaill \
multilog t ./main \
-'* status: *' \
-'* from 192.168.1.*' \
-'*' \
+'* status: *' \
=status
なにこれ?
お品書き
雑記など
XOOPS Cube PROJECT