wiz.code

XMailサーバーのリレー設定

メールリレーの重要性

メールサーバーを立てるにあたり、最も重要と言っていいのが「リレー設定」です。 この設定を誤るとメールサーバーが、スパムメールの「踏み台」として利用されかねないからです。

メールは、メールソフトから送信されると、メールソフトに設定されたSMTPサーバーにメールを送ります。 SMTPサーバーは、メールの宛先のSMTPサーバーにメールを届けます。 この部分が「リレー」と呼ばれる処理。 メールを受け取ったSMTPサーバーはメールを保管し、受信者がPOP3で受け取ります。

SMTPサーバーは、受け取ったメールが自分のサーバー宛であれば保管し、他のサーバー宛であればリレーします。 リレーを無制限に許可した場合、SMTPサーバーはメールを中継する役割になります。 このようなSMTPサーバーがあると、ウィルスメールやスパムメールを送信するための足掛かりとなってしまい、いわゆる「踏み台」と呼ばれるサーバーになってしまいます。

かといって、リレーを一切行わないSMTPサーバーは「受信専用」となってしまい、メールを送信することができません。 そこで「認証したユーザーだけがリレーできる」という制限を加えます。 これが「SMTP認証」と呼ばれるもので、主にPOP3のログインと同じユーザー名とパスワードを使います。 すなわち、POP3でメールを受け取れることを証明できれば、メールのリレーを許可する、というものです。 似たような手法として、POP3で認証してから数分間だけ、リレーを許可する「POP before SMTP」という手法もあります。

XMailでは、SMTP認証が標準で装備されています。 特に設定を変更しなくても、不正なリレーが行われることはありません。

しかし、今度は高すぎる制限のために、プログラムからメールを送信する場合などで使い勝手が悪くなってしまいます。 PHPやASP.NETといったサーバーサイドのプログラムからメールを送信するたびに、SMTPの認証をしなければならないからです。 そのようなケースに対応するため、SMTP認証をしなくてもリレーが許可されるIPアドレスをあらかじめ決めておく方法があります。 XMailの場合、smtprelay.tabに設定されたIPアドレスからの接続は、認証なしでメールのリレーを許可するように設計されています。

通常、このIPアドレスは、メールサーバーと同じコンピュータか、同じローカルネットワークに属するコンピュータに制限されますが、 設定を誤ると、誰でもメールリレーが許可される状態になってしまいますので、smtprelay.tabは間違いのないように設定しなければなりません。

smtprelay.tab

現在のsmtprelay.tabの設定を確認します。

smtprelay.tabの内容
# vi /var/MailRoot/smtprelay.tab
"10.0.0.0"      "255.0.0.0"
"172.16.0.0"    "255.255.0.0"
"192.168.0.0"   "255.255.0.0"

上記はいずれも、ローカルネットワークで使用するIPアドレスの範囲を示します。左側がIPアドレス、右側がサブネットマスクです。 このうち、上2行はよほど大規模なネットワークでない限り使うことはありません。3行目は、小規模なネットワーク(家庭内LAN)などで使われる見慣れたアドレスです。 例えば、192.168.0.1~192.168.0.255までの範囲を指定する場合、IPアドレスは 192.168.0.0、サブネットマスクは 255.255.255.0 とします。 すなわち、サブネットマスクで 0 になっているところは、どんな番号でもよい、という意味です。(厳密にはビット単位で判断されます。)

XMailサーバーは、初期値がすでにローカルネットワーク用に設定されていますが、 古いバージョンではすべてのIPアドレスを許可する"0.0.0.0" "0.0.0.0"が初期値になっているものがあるので必ず確認しなければなりません。

smtprelay.tabの編集後

今回は、CentOS内からのみリレーを許可するように設定するので、上記はすべて削除し、"127.0.0.1" "255.255.255.255"のみを設定します。 viコマンドでカーソルのある行を削除するにはキーボードで[dd]と入力します。

メールリレーのチェック

ローカルコンピュータ(CentOS)内でのチェック

メールのリレーが許可されるかどうかはTelnetを使うことで簡易的に確認できます。 確認するポイントを押さえておきましょう。 ここでは、XMailに登録されているメールアドレスを「内部アドレス」、それ以外を「外部アドレス」と称します。

  • 外部アドレス から 内部アドレス への送信
    自分宛てのメールなので受信されるはず。(これはリレーではない)
  • 内部アドレス から 外部アドレス への送信
    smtprelay.tagで許可されたアドレスなのでリレーできるはず。
  • 外部アドレス から 外部アドレス への送信
    smtprelay.tagで許可されたアドレスなのでリレーできるはず。

ここで使用するSMTPコマンドは次の4つです。

HELO hostname
メールセッションを開始する。hostnameにはクライアントのホスト名を指定する。
MAIL FROM: <MailAddress>
送信元のメールアドレスを指定。
RCPT TO: <MailAddress>
送信先のメールアドレスを指定。(複数回実行可)
QUIT
メールセッションを終了する。

メールセッションは、HELOコマンドで開始され、続いてMAILコマンド、RCPTコマンドの順で実行します。 XMailではこの段階で、リレーが可能であるかどうかが判別できるので、その後メールの送信は行わず、QUITコマンドで終了します。

はじめに、外部アドレス から 内部アドレス に向けたメールセッションを進めます。 では実践してみましょう。 telnetコマンドを対話モードで実行します。 このとき、改行コードが[CR+LF]になるように、set crlfを実行しておきます。 続いて、open localhost 25 でSMTPサーバーに接続します。

外部 → 内部 への受信チェック
# telnet
telnet set crlf
telnet open localhost 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
MAIL FROM: <user@other.local>
250 OK
RCPT TO: <postmaster@wiz-code.private>
250 OK
QUIT
221 ...

外部アドレスから内部アドレスに向けたメールセッションを実行したところ、RCPTコマンドのあとで 250 OK が返されました。 通常のメールセッションでは、このあとDATAコマンドでメールデータを送信するのですが、ここではQUITコマンドでセッションを終了します。 このケースでは、XMailが受け取ったメールをpostmaster@wiz-code.private のメールボックスに保管するだけなので、リレーは関係ありません。

次に、内部アドレスから外部アドレスに向けたセッションです。

内部 → 外部 へのリレーチェック
# telnet
telnet set crlf
telnet open localhost 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
MAIL FROM: <postmaster@wiz-code.private>
250 OK
RCPT TO: <user@other.local>
250 OK
QUIT
221 ...

RCPTコマンドの応答が 250 OK となっています。 これは、外部のSMTPサーバーにメールをリレーすることが許可されたことを示します。

次に外部アドレス(user01@wiz-code.net)から外部アドレス(user02@wiz-code.net)への送信をテストします。

外部 → 外部 へのリレーチェック
# telnet
telnet set crlf
telnet open localhost 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
MAIL FROM: <user01@wiz-code.net>
250 OK
RCPT TO: <user02@wiz-code.net>
250 OK
QUIT
221 ...

250 OK が返されたのでリレーが許可されています。 この状況は、送信元と送信先のいずれもがXMailサーバーに登録されていないメールアドレスであったとしても、送信(リレー)できることを表しています。 もしこれが、外部からの接続でも出来るようになっていると、メールサーバーが踏み台にされてしまうわけです。

ホストコンピュータでリレーチェック

先ほどと同じことを今度はホストコンピュータから行ってみます。 ホストコンピュータは、smtprelay.tabでリレーが許可されていない点で異なります。

先にファイアウォールの設定を確認しておきましょう。 アプリケーションから「諸ツール」を開き、ファイアウォールを選択します。

ファイアウォール 管理者認証

GNOMEを入れ直したせいか、ファイアウォールを開くときに管理者認証が入るようになりました。 以前は、設定を変更する段階での認証でしたが、認証しないと設定を見ることもできないように変更されたようです。

ファイアウォール POP3とSMTPにチェック

SMTPとPOP3にチェックがついた状態にします。 これもGNOMEを入れ直したせいか、HTTPとFTPのチェックがはずれていました。 ついでにチェックをつけておきます。

ホストコンピュータ(Hyper-Vを稼働しているWindows10)のTelnetで接続してみます。 Windows10のTelnetは、コントロールパネルの「プログラムと機能」から「Windowsの機能の有効化または無効化」を開き、Telnetクライアントにチェックを付けると利用できるようになります。

WindowsでTelnetを起動

コマンドプロンプトを開き、telnetを起動します。 先ほどと同様、外部アドレス から 内部アドレス へ向けてメールセッションを進めます。

外部 → 内部 へのリレーチェック
Microsoft Telnet > set crlf
Microsoft Telnet > o wiz-code.private 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
MAIL FROM: <user@other.local>
250 OK
RCPT TO: <postmaster@wiz-code.private>
250 OK
QUIT
221 ...

250 OK が返されました。 このセッションは、外部のSMTPサーバーから自分宛てのメールが届く流れと同じですので、リレーは発生しません。

次に、内部メールアドレスから外部メールアドレスに向けてメールセッションを進めます。 こちらは、メールクライアントからメールが送られ、外部のSMTPサーバーへリレーする流れです。

内部 → 外部 へのリレーチェック
Microsoft Telnet > set crlf
Microsoft Telnet > o wiz-code.private 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
MAIL FROM: <postmaster@wiz-code.private>
250 OK
RCPT TO: <user@other.local>
550 Relay Denied.
QUIT
221 ...

RCPTコマンドに対して、550 Relay Denied.が返されました。 リレーが許可されない、という意味です。

たとえ、FROMのアドレスがXMailに登録されているアドレスであっても、リレーを許可するとスパムメールの踏み台になってしまいます。 このようにTelnetを使えば、MAILコマンドのメールアドレスを容易く指定できるからです。

最後に、外部アドレスから外部アドレスもチェックしておきます。

外部 → 外部 へのリレーチェック
Microsoft Telnet > set crlf
Microsoft Telnet > o wiz-code.private 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
MAIL FROM: <user@other1.local>
250 OK
RCPT TO: <user@other2.local>
550 Relay Denied.
QUIT
221 ...

これが通ってしまったら大問題ですね。 ちゃんとリレーがブロックされています。

しかし、このままでは本当にメールアドレスの所有者であってもメールが送信できません。 そこで、SMTP認証をしてから、外部メールアドレスにメールを送信するセッションを行ってみます。

SMTP認証でリレーチェック

SMTP認証にはいくつかの種類があります。 ここでは、最も簡単なPLAINを使用しますが、これはパスワードが暗号化されないので、実際の運用には使用しません。 認証は AUTHコマンドに続いて、認証方式(ここではPLAIN)とユーザー情報を入力します。 ユーザー情報は「ユーザー名[NULL]ユーザー名[NULL]パスワード」の書式をBase64エンコードした文字列です。

SMTP認証でリレーチェック
Microsoft Telnet > set crlf
Microsoft Telnet > o wiz-code.private 25
220 wiz-code.private ...
HELO localhost
250 wiz-code.private
AUTH PLAIN (Base64 encoded user info)
235 Authentication successful
MAIL FROM: <postmaster@wiz-code.private>
250 OK
RCPT TO: <user@other.local>
250 OK
QUIT
221 ...

このように、AUTHコマンドの認証に成功すれば、外部アドレスへのリレーが許可されます。

メールのセキュリティ

この他にも、SSLを用いたSMTPsPOP3sなどを併用して、メールのセキュリティを保持することができます。 また、外出先から自分のXMailサーバーを使って送信しようとすると、25番ポートがプロバイダによってブロックされ、XMailに接続できない場合があります。 OP25Bという、迷惑メール対策のひとつです。 外出先からSMTPサーバーへ接続したければ、サブミッションポートとして587番も開けておかなければなりません。 これらの設定はまた後日。

この章のまとめ

  • XMailでSMTP認証なしでリレーを許可するには、smtprelay.tabに許可するIPアドレスとサブネットマスクを指定する。