maehachi08 Anything Blog

2012年04月21日
qmailメールサーバ構築(第1回)

モノゴトの仕組み

私が初めて自分の携帯電話を持った高校1年生のころには、SMSの他にもEメールが普及していました。携帯電話規格で言えば2.5世代のcdmaoneが既に出ていましたし、翌年には旧ジェイフォンがカメラ付き携帯を発売したような時期です。あ、着メロが4和音だの16和音だのと言ってましたね。懐かしい。

突然ですが、あなたは『なぜ携帯電話が繋がるのか?』を考えたことがありますか?

固定電話だとxxx-xxx-xxxって電話番号は○○県○○市○○町N-N-Nって住所があるからその家に繋げばいいのです。でも、私があなたの携帯電話に電話したとして、あなた、及びあなたの携帯電話が今、どこにいてるのか分からないですよね?GPS?残念、GPSが携帯電話に搭載される前から携帯電話はありますよ。
答えは、そんなに難しくはありません。

携帯電話の基地局(ビルの上とかに立ってるアンテナ)からは常にPingに近い電波が発射されています。それを携帯電話が受信すると、基地局にReplyを返します(ちなみに、このPingの受信感度によって携帯電話画面のアンテナ本数が少なくなったり、まったくPingを受信できない場合は圏外マークを表示する)。基地局が受信したReplyには携帯電話固有の情報が含まれていて、この情報をSCPと呼ばれるデータベースに登録します。携帯電話会社ではこの”SCP”で携帯電話端末の位置を知ることができます。人が電話をかける場合、直接相手に繋がる訳ではありません。発信者のかけた発信電波を近くの基地局が受信し、一旦そこで保留に近い状態で止めます。基地局は発信電波に含まれる接続先情報をSCPに問い合わせます。電話をかけた際に「ツッツッツッ・・」って鳴りますよね。あの時に基地局がSCP問合せを行ってます。そしてSCPに含まれる位置情報から相手の近くの基地局交換機に発信者電話信号を繋ぐのです。相手側の基地局では接続先の携帯電話に呼び出し電波を発信し、それを受けた携帯電話が着信音を鳴らす仕組みです。SCPはキャリアごとに存在しますが、携帯電話番号は上数ケタでキャリア判別が可能なので、接続先が別のキャリアの場合は、そのキャリアのSCPに問合せを行うのです。さっき、”上数ケタでキャリア判別が可能”と書きましたがナンバーポータビリティ制度によってそれも崩れました。でも、実は、ナンバーポータビリティを適用してキャリア変更した番号は前のキャリアのSCPに新しい移行先のキャリア情報を追加するカラムを追加することでナンバーポータビリティ制度を実現していたりします。

僕は以前、携帯電話にかかわるシステムのインフラ構築に関わっていたこともあり、また、MCPC2級を取得していることもあり、このような知識もありますが、普段何気に使っているものが実は大規模なコンピュータシステムによって成り立っているなど、大抵の人は考えていないのでしょう。

メールサーバ構築

今回はメールサーバを構築して独自ドメインでのメール送受信を実現しようと思います。
メールって便利ですけど、たまに相手が夜送ったメールが翌日に届いたりしません??
メールサーバの仕組みを知るとその辺も何となく原因にあたりを付けることができるやもしれませんね。

現在のメールシステムは大きく「MDA」と「MTA」、それに「MUA」で成り立っています。MDAはローカルコンピュータにおいてメール送受信を担います。MTAはリモートメールサーバとのメール送受信を担います。MUAはいわゆるメーラーです。
MDAはLinuxのローカル配送などで使用されているもので/bin/mailなどがあります。MTAはsendmail、postfix、qmailなどがあります。MUAはサンダーバードやOutlookなどです。
一般的にメールサーバと言うとMTAを指してることが多く、本記事でもそのように記載しています。
今回はqmailの構築を行っていきたいと思います。

qmailとは

qmailは、複雑化したsendmailよりもっとシンプルに効率の良いMTAとして開発されました。qmailとsendmailの大きな違いは、qmailはモジュール分割することで1つ1つの処理を高速化していることです。また、モジュール間は疎結合のため、セキュリティ性が高まります。各モジュールを動作させるUIDも違うので、特定UIDでの不正侵入を許してしまったとしても、他のモジュールには影響しないのです。qmailの最大の特徴はセキュリティであるといわれるくらいです。

qmailはメールキューという概念を導入することで信頼性も確保しました。qmailでは受信したメッセージはメールキューに格納されます。qmailはメールサブディレクトリとメッセージの状態に関する情報を使用してメールキュー内のメッセージが消失しないようになっています。
上記した複数のモジュールを使用し、メールキューディレクトリとメッセージ状態の複雑な体系を構築しています。メッセージが宛先まで届けられるまでに様々な状態を経るのだが、qmailがクラッシュしたとしても、クラッシュ前の状態を確認することでメッセージ処理を再開させることが可能になっています。

sendmailでは1つの大きな設定ファイルを使用しているが、複数の設定ファイルに分割されていることでシンプルであることもqmailの特徴です。

以上のような特徴を持つqmail構築について次回以降で紹介したいと思います。