SMTP, POP
電子メールシステムの基本構成について説明する.メールの送受信に必要なプログラム(MTA,MDA,MUA)の役割と,メール転送・受信に使用されるプロトコル(SMTP,POP,IMAP)の仕組みを理解することで,メールサーバの設定や障害対応に必要な基礎知識を習得できる.
メールに必要なプログラム
電子メールシステムは,MTA,MDA,MUAという3種類のプログラムが連携して動作する.この分離により,各プログラムが単一の機能に特化でき,保守性と拡張性が向上する.
MTA(Mail Transfer Agent)
MTAは,計算機間でメールの送受信を行うプログラムである.MTAは,送信するメールの宛先から受信先のリモートホストを調べ,そのホスト上で動作しているMTAと通信してメールを送受信する.
受信したメールの宛先が自分の計算機宛てでない場合は,宛先に応じて他の計算機のMTAへメールを転送する.
Unixで代表的なMTAとしてSendmailがある.現在の多くのLinux環境では,標準のMTAとしてPostfixが使われている(本資料ではSendmailを題材とする).
MDA(Mail Delivery Agent)
MDAは,MTAが受信したメールの宛先を解釈し,そのメールを受け取るユーザのメールスプールファイル(受信メールを一時的に保存するファイル)に書き込むプログラムである.
MUA(Mail User Agent)
MUAは,ユーザがメールを読んだり,メールの文章を作成したりするためのプログラムである.メールを送信するときはMTAと通信し,MTAに送信を依頼する.メールを読むときは,MDAが書き込んだメールスプールファイルからメールを取得する.
メールを扱うためのプロトコル
SMTP(Simple Mail Transfer Protocol)
SMTPは,電子メールの転送を行うためのプロトコルである.MTA間でメールを配送する場合や,MUAがMTAへメールを送信する場合に使用される.TCPポート番号は25である(MTA間の転送に使う).現在は,MUAがMTAへメールを送信する用途には,認証付きの送信専用ポートである587番(サブミッションポート)が一般的に用いられる.Sendmailでは拡張SMTPプロトコル(ESMTP:認証機能や大容量メール対応などの機能を追加したSMTP)が使用されている.
POP/APOP/IMAP
POP,APOP,IMAPは,いずれもメールをサーバから受信するときに使用するプロトコルである.
POP3(Post Office Protocol Version 3)は,メールサーバからクライアントへメールを取得するためのプロトコルである.これにより,メールクライアントはメールをスプールしているサーバからメッセージを取得する.TCPポート番号は110である.メールスプールから直接メールを読むには,スプールを読み書きできる計算機でMUAを動かす必要があるが,POPを使うとスプールを持たない計算機からでも,NFS(Network File System:ネットワーク経由でファイルを共有する仕組み)を使わずにメールを読み出せる.なお,POP3は標準のポート110では認証情報やメール本文を暗号化せずに送るため,現在はTLSで暗号化する方式(ポート995)の利用が推奨される.
APOP(Authenticated POP)は,認証を強化したPOPである.POP3ではサーバへの接続時にパスワードが平文で送信されるが,APOPではパスワードそのものを送らず,MD5というハッシュ関数(入力データから固定長の値を計算する仕組み)を使った値を送ることで,平文での送信を避けている.ただしMD5には弱点が見つかっており,APOPは現在では安全とはみなされず,TLSによる暗号化が推奨される.
IMAP(Internet Message Access Protocol)は,POP3やAPOPのようにメールをクライアントへダウンロードするのではなく,メールを常にサーバ上に保持し,ユーザがサーバ上のメールを読み出す方式のプロトコルである.複数の端末から同じメールボックスにアクセスする場合に適している.現在の標準はIMAP4rev2(RFC 9051)である.
sendmail
sendmailは,メール送信要求を受けると,sendmail.cf(/etc/mail/sendmail.cf)の指示に従って動作する.sendmail.cfの記述に基づいて,そのメールが自ホスト宛てかどうかを判定する.自ホスト宛てであればメールスプールに格納し,自ホスト宛てでなければsendmail.cfのルールに従って転送先を決定し,配送する.
sendmail.cf
sendmailはsendmail.cfの内容に従って動作する.しかしsendmail.cfの記述は複雑で,直接編集するのは難しい.そのため,sendmail.cfを生成するCF(Configuration File generator)というツールを使う.CFを使うと,簡潔な定義ファイルから複雑なsendmail.cfを自動生成できる.
課題:CFを使ったsendmail.cfの作成
本課題では,CFツールを使ってsendmail.cfを作成し,メールの送受信が正常に動作することを確認する.この作業を通じて,sendmailの設定ファイルの構造とメール配送の仕組みを理解する.
注意事項
- 作業前に必ず既存のsendmail.cfのバックアップを取得すること
- テストメールの本文には日本語を使用できない
- 課題完了後は必ず元の設定に戻すこと
suになる
バックアップを取得する
cd /etc/mail
cp sendmail.cf sendmail.cf.back
cd /tmp
ソースファイルを取得する
cp -r /u/kubo/work/rinkou/sendmail/CF* .
以下の3つのファイルがあることを確認する
CF-3.7Wpl2.tar.gz
CF-3.7Wpl2-smtpcheck.patch1
CF-3.7Wpl2-smtpcheck.patch2
cd CF
展開する
gunzip CF-3.7Wpl2.tar.gz
tar xvf CF-3.7Wpl2.tar
cd CF-3.7Wpl2/Master
パッチを適用する
patch < /tmp/CF/CF-3.7Wpl2-smtpcheck.patch1
patch < /tmp/CF/CF-3.7Wpl2-smtpcheck.patch2
cd ..
make cleantools
make tools
make samples
sendmail.cfの元になるファイルをコピーする
cp Standards/sendmail-v8.def ./sendmail.def
viでsendmail.defを編集する
OS_TYPE=bsd4.5
MX_SENDMAIL=yes
MY_DOMAIN=4f.db.is.kyushu-u.ac.jp
MY_NAME=(自分のマシン名)
FROM_ADDRESS='$m'
RECIPIENT_GENERIC=yes
REWRITE_GENERIC_FROM=lower
REWRITE_GENERIC_TO=yes
REWRITE_LOCAL_ON_RELAY=generic
ACCEPT_ADDRS='$m'
SPOOL_HOST='popple.db.is.kyushu-u.ac.jp'
BITNET=mx
REJECT_JUNET=yes
ALIAS_FILE_PATH='/etc/mail/aliases'
PRIVACY_FLAGS='noexpn,novrfy,authwarnings'
MAIL_RELAY_RESTRICTION=yes
LOCAL_HOST_IPADDR=/etc/mail/sendmail.localip
LOCAL_HOST_DOMAIN=/etc/mail/sendmail.localdomain
編集後,make sendmail.cfを実行する
sendmailを停止する
ps -ax | grep sendmail
kill sendmailのプロセス番号
sendmail.cfをコピーする
cp sendmail.cf /etc/mail/sendmail.cf
sendmailをデバッグモードで起動する
sendmail -bt
> 0 ユーザ名
(最後に...returns $# local $: ユーザ名と出力されれば正常)> 0 ユーザ名@マシン名.4f.db.is.kyushu-u.ac.jp
(最後に...returns $# local $: ユーザ名と出力されれば正常)> 0 外部のメールアドレス(自宅のPCのアドレスなど)
(最後に...returns $# smtp $: 外部アドレスと出力されれば正常)
C-dでデバッグモードを終了する
sendmailを起動する
sendmail -bd
mailコマンドで自分にメールを送信する
mail 自分のメールアドレス
subject:(テストメールの題名)
テストメールの文章を入力する(日本語は使用不可)
. を入力して送信する
exitでsuから戻る
minakoで受信を確認する
ssh minako
mail
先ほど送信したメールを受信していることを確認する
確認後はqで終了する
以上で課題は完了である.以下の手順で編集前の状態に戻す.
su
cd /etc/mail
ps -ax | grep sendmail
kill sendmailのプロセス番号
mv sendmail.cf.back sendmail.cf
校閲を実施