www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | README

commit 18d40f4e052b698edad3eb04bc4e93aa2944845e
parent 266ac1d4a6acfb011fb2490b4e2435d1b506b8a2
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 18 Jan 2024 18:17:46 +0900

update draft

Diffstat:
Mman/draft/mailserver.html | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Mpub/draft/mailserver.html | 80++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
Mpub/rss.xml | 4++--
3 files changed, 146 insertions(+), 23 deletions(-)

diff --git a/man/draft/mailserver.html b/man/draft/mailserver.html @@ -14,8 +14,8 @@ <li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> <li>OS: OpenBSD 7.4</li> <li>ドメイン: ムームードメイン (mtkn.jpとする)</li> -<li>SMTPサーバー(MTA): OpenSMTPD</li> -<li>IMAPサーバー(MDA): Dovecot</li> +<li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> +<li>IMAPサーバー(MDA): Dovecot 2.3.20</li> </ul> <h2>メールの仕組み</h2> @@ -42,6 +42,21 @@ IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達 <p> 以上をまとめると以下のようになる: </p> +<pre> ++------------+ +----------------+ +|MTA(mtkn.jp)|--SMTP->| MTA | ++------------+ +--example.com---+ + /|\ | MDA | + | +----------------+ + | | + SMTP IMAP + | | + | \|/ ++------------+ +----------------+ +|user@mtkn.jp| |user@example.com| ++------------+ +----------------+ + +</pre> <ol> <li>メールを書く。</li> <li>送信側のMTAに送る。</li> @@ -79,7 +94,6 @@ SMTPサーバーがメールを送信する際、まずは宛先のサーバー </p> <pre> MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS - user@example.comにメールしたろ。 example.com宛のメールって 誰に送ったらええん? @@ -95,9 +109,9 @@ MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS <---------------------------------------- </pre> <p> -次にこの宛先のMTAとの通信を開始する:\ +次にこの宛先のMTAとの通信を開始する。\ しかし受信側のMTA(example.com)は、\ -mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある。\ +mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:\ </p> <pre> MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) @@ -467,39 +481,69 @@ DNSのTXTレコードの制約により、鍵の長さは1024ビットにする <h3>/etc/mail/smtpd.confの設定</h3> <p> -/etc/mail/smtpd.confを以下の通り変更:(TODO: 説明)\ +/etc/mail/smtpd.confを以下の通り変更:\ </p> <pre><code>\ +# 認証に使用するサーバー証明書と秘密鍵を"mtkn.jp"という名前で登録。 pki mtkn.jp cert "/etc/ssl/mail.mtkn.jp.fullchain.pem" pki mtkn.jp key "/etc/ssl/private/mail.mtkn.jp.key" +# テーブルの登録 +# ローカルに届いたメールの転送を設定するテーブル table aliases file:/etc/mail/aliases +# バーチャルメールユーザーの名前と暗号化されたパスワードのテーブル table passwd file:/etc/mail/passwd +# バーチャルメールの転送を設定するテーブル table virtuals file:/etc/mail/virtuals +# フィルターの登録 +# ドメインキーによる署名を付加するフィルター filter dkim_sign proc-exec\\ - "filter-dkimsign -d mail.mtkn.jp -s selector1\\ - -k /etc/mail/dkim/private.key" user _dkimsign group _dkimsign + "filter-dkimsign -d mail.mtkn.jp -s selector1\\ + -k /etc/mail/dkim/private.key" user _dkimsign group _dkimsign +# DNSの逆引きができなかった場合に受信を拒否するフィルター filter check_rdns phase connect match !rdns disconnect "550 no rDNS." +# 正引きと逆引きでDNSのレコードが一致しなかった場合に受信を拒否するフィルター filter check_fcrdns phase connect match !fcrdns disconnect "550 no FCrDNS." -smtp max-message-size 25M - +# 各ネットワークインターフェース毎の処理を設定。 listen on socket listen on lo0 +# vio0というインターフェースの25番ポートに届いたものに関する設定。 +# 外部からmtkn.jp宛に届いたものの処理である。 +# 最初に登録した証明書と秘密鍵を使って通信を暗号化し、 +# 上で設定したDNSに関するフィルターを適応。 listen on vio0 port 25 tls pki mtkn.jp hostname "mail.mtkn.jp"\\ filter { check_rdns, check_fcrdns } +# vio0というインターフェースのsubmission(587番)ポートに関する設定。 +# mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される +# メールに関する設定。 +# 上と同様に"mtkn.jp”という名前で登録されたpkiを使って暗号化し、 +# "passwd"という名前で登録したパスワードで認証し、 +# さらにドメインキーでメールに署名する。 listen on vio0 mask-src port submission smtps pki mtkn.jp\\ hostname "mail.mtkn.jp" auth <passwd> filter dkim_sign +# 各種メールの処理を定義する。 +# 各処理が実行される条件はこの後定義する。 +# ローカルメールはデフォルトのまま action "local_mail" mbox alias <aliases> +# 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 action "domain" maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}"\\ virtual <virtuals> +# 他のドメイン宛ては宛先へ転送。 action "outbound" relay +# どういう条件でどういう処理をするかを定義する。 +# 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 +# ここでは/var/vmail/以下に振り分けて保存する。 match from any for domain mtkn.jp action "domain" +# このサーバー内でのメールはlocal_mailとして処理。 match from local for local action "local_mail" +# このサーバー内から他所へのメールは宛先に転送 match from local for any action "outbound" +# 外部から来た他所宛てのメールは認証されているものに限り転送。 +# authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 match auth from any for any action "outbound" </code></pre> @@ -552,29 +596,50 @@ dhparamを作成する(時間がかかる): # mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig # vi /etc/dovecot/dovecot.conf </code></pre> +<p> +ドキュメントは公式ウェブサイトで確認できる。\ +分量が多すぎて読む気にならない。\ +サンプルの設定ファイルにも各項目の説明と既定値が書いてあるが、\ +これも分かりにくい。\ +パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>\ +と暗号化されていないIMAPを<code>port = 0</code>として無効にする。\ +他はとりあえず以下の設定で動く:\ +</p> <pre><code>\ +# IPv4は全て監視 listen = * +# SSL接続のみ許可 ssl = required +# SSLに使用するファイル ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key ssl_dh = &lt;/etc/ssl/dh.pem +# メールの保存場所は各ユーザーのホームディレクトリ。 +# ホームディレクトリの場所は以下のuserdbで設定。 mail_location = maildir:~ +# パスワードのファイル。 +# OpenSMTPDと共有。 passdb { args = scheme=BLF-CRYPT /etc/mail/passwd driver = passwd-file } +# ユーザーの設定。 +# ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> userdb { args = uid=vmail gid=vmail home=/var/vmail/%d/%n driver = static } +# 使用するプロトコル。 +# lmtpはいらんかも。 protocols = imap lmtp +# SSLを使ったIMAPSのみを許可。 service imap-login { inet_listener imaps { port = 993 diff --git a/pub/draft/mailserver.html b/pub/draft/mailserver.html @@ -34,8 +34,8 @@ <li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> <li>OS: OpenBSD 7.4</li> <li>ドメイン: ムームードメイン (mtkn.jpとする)</li> -<li>SMTPサーバー(MTA): OpenSMTPD</li> -<li>IMAPサーバー(MDA): Dovecot</li> +<li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> +<li>IMAPサーバー(MDA): Dovecot 2.3.20</li> </ul> <h2>メールの仕組み</h2> @@ -48,6 +48,21 @@ <p> 以上をまとめると以下のようになる: </p> +<pre> ++------------+ +----------------+ +|MTA(mtkn.jp)|--SMTP->| MTA | ++------------+ +--example.com---+ + /|\ | MDA | + | +----------------+ + | | + SMTP IMAP + | | + | \|/ ++------------+ +----------------+ +|user@mtkn.jp| |user@example.com| ++------------+ +----------------+ + +</pre> <ol> <li>メールを書く。</li> <li>送信側のMTAに送る。</li> @@ -66,7 +81,6 @@ SMTPサーバーどうしが通信する際、スパムメールをフィルタ SMTPサーバーがメールを送信する際、まずは宛先のサーバーを特定する必要がある。この際に使用するのがDNSに登録されているMXレコードである。送信元のSMTPサーバーはまずDNSに宛先のドメインのMXレコードを問い合わせる。するとメールの送信先のドメイン名が分かるので、続いてこの送信先のIPアドレスを問い合わせる:</p> <pre> MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS - user@example.comにメールしたろ。 example.com宛のメールって 誰に送ったらええん? @@ -82,7 +96,7 @@ MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS <---------------------------------------- </pre> <p> -次にこの宛先のMTAとの通信を開始する:しかし受信側のMTA(example.com)は、mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある。</p> +次にこの宛先のMTAとの通信を開始する。しかし受信側のMTA(example.com)は、mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:</p> <pre> MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) こんちは。mtkn.jpです。 @@ -358,37 +372,67 @@ OpenSMTPD用のDKIMフィルターをインストールする。 <h3>/etc/mail/smtpd.confの設定</h3> <p> -/etc/mail/smtpd.confを以下の通り変更:(TODO: 説明)</p> -<pre><code>pki mtkn.jp cert "/etc/ssl/mail.mtkn.jp.fullchain.pem" +/etc/mail/smtpd.confを以下の通り変更:</p> +<pre><code># 認証に使用するサーバー証明書と秘密鍵を"mtkn.jp"という名前で登録。 +pki mtkn.jp cert "/etc/ssl/mail.mtkn.jp.fullchain.pem" pki mtkn.jp key "/etc/ssl/private/mail.mtkn.jp.key" +# テーブルの登録 +# ローカルに届いたメールの転送を設定するテーブル table aliases file:/etc/mail/aliases +# バーチャルメールユーザーの名前と暗号化されたパスワードのテーブル table passwd file:/etc/mail/passwd +# バーチャルメールの転送を設定するテーブル table virtuals file:/etc/mail/virtuals +# フィルターの登録 +# ドメインキーによる署名を付加するフィルター filter dkim_sign proc-exec\ - "filter-dkimsign -d mail.mtkn.jp -s selector1\ - -k /etc/mail/dkim/private.key" user _dkimsign group _dkimsign + "filter-dkimsign -d mail.mtkn.jp -s selector1\ + -k /etc/mail/dkim/private.key" user _dkimsign group _dkimsign +# DNSの逆引きができなかった場合に受信を拒否するフィルター filter check_rdns phase connect match !rdns disconnect "550 no rDNS." +# 正引きと逆引きでDNSのレコードが一致しなかった場合に受信を拒否するフィルター filter check_fcrdns phase connect match !fcrdns disconnect "550 no FCrDNS." -smtp max-message-size 25M - +# 各ネットワークインターフェース毎の処理を設定。 listen on socket listen on lo0 +# vio0というインターフェースの25番ポートに届いたものに関する設定。 +# 外部からmtkn.jp宛に届いたものの処理である。 +# 最初に登録した証明書と秘密鍵を使って通信を暗号化し、 +# 上で設定したDNSに関するフィルターを適応。 listen on vio0 port 25 tls pki mtkn.jp hostname "mail.mtkn.jp"\ filter { check_rdns, check_fcrdns } +# vio0というインターフェースのsubmission(587番)ポートに関する設定。 +# mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される +# メールに関する設定。 +# 上と同様に"mtkn.jp”という名前で登録されたpkiを使って暗号化し、 +# "passwd"という名前で登録したパスワードで認証し、 +# さらにドメインキーでメールに署名する。 listen on vio0 mask-src port submission smtps pki mtkn.jp\ hostname "mail.mtkn.jp" auth <passwd> filter dkim_sign +# 各種メールの処理を定義する。 +# 各処理が実行される条件はこの後定義する。 +# ローカルメールはデフォルトのまま action "local_mail" mbox alias <aliases> +# 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 action "domain" maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}"\ virtual <virtuals> +# 他のドメイン宛ては宛先へ転送。 action "outbound" relay +# どういう条件でどういう処理をするかを定義する。 +# 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 +# ここでは/var/vmail/以下に振り分けて保存する。 match from any for domain mtkn.jp action "domain" +# このサーバー内でのメールはlocal_mailとして処理。 match from local for local action "local_mail" +# このサーバー内から他所へのメールは宛先に転送 match from local for any action "outbound" +# 外部から来た他所宛てのメールは認証されているものに限り転送。 +# authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 match auth from any for any action "outbound" </code></pre> @@ -427,28 +471,42 @@ dhparamを作成する(時間がかかる): <pre><code># mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig # vi /etc/dovecot/dovecot.conf </code></pre> -<pre><code>listen = * +<p> +ドキュメントは公式ウェブサイトで確認できる。分量が多すぎて読む気にならない。サンプルの設定ファイルにも各項目の説明と既定値が書いてあるが、これも分かりにくい。パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>と暗号化されていないIMAPを<code>port = 0</code>として無効にする。他はとりあえず以下の設定で動く:</p> +<pre><code># IPv4は全て監視 +listen = * +# SSL接続のみ許可 ssl = required +# SSLに使用するファイル ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key ssl_dh = &lt;/etc/ssl/dh.pem +# メールの保存場所は各ユーザーのホームディレクトリ。 +# ホームディレクトリの場所は以下のuserdbで設定。 mail_location = maildir:~ +# パスワードのファイル。 +# OpenSMTPDと共有。 passdb { args = scheme=BLF-CRYPT /etc/mail/passwd driver = passwd-file } +# ユーザーの設定。 +# ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> userdb { args = uid=vmail gid=vmail home=/var/vmail/%d/%n driver = static } +# 使用するプロトコル。 +# lmtpはいらんかも。 protocols = imap lmtp +# SSLを使ったIMAPSのみを許可。 service imap-login { inet_listener imaps { port = 993 diff --git a/pub/rss.xml b/pub/rss.xml @@ -5,8 +5,8 @@ <description>ウェブページの更新履歴</description> <language>ja-jp</language> <link>https://www.mtkn.jp</link> -<lastBuildDate>Wed, 17 Jan 2024 09:37:48 +0900</lastBuildDate> -<pubDate>Wed, 17 Jan 2024 09:37:48 +0900</pubDate> +<lastBuildDate>Thu, 18 Jan 2024 18:17:34 +0900</lastBuildDate> +<pubDate>Thu, 18 Jan 2024 18:17:34 +0900</pubDate> <docs>https://www.rssboard.org/rss-specification</docs> <item> <title>使用しているハードウェア、ソフトウェア</title>