www.mtkn.jp

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

mailserver.html (27797B)


      1 <h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1>
      2 <time>2024-01-19</time><br>
      3 <time>2025-11-03</time> <code>HELO</code>コマンドで表示されるドメイン名を変更<br>
      4 
      5 <h2>はじめに</h2>
      6 <p>
      7 少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。\
      8 当時はドキュメントを追うのに必死で構築手順を整理できていなかった。\
      9 しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。\
     10 そこであらためてサーバーを構築し、その手順を確認することにした。\
     11 あいかわらずDNSの知識は自信がない。\
     12 セキュリティは自己責任で。\
     13 </p>
     14 
     15 <h2>使うもの</h2>
     16 <ul>
     17 <li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li>
     18 <li>OS: OpenBSD 7.4</li>
     19 <li>ドメイン: ムームードメイン (mtkn.jpとする)</li>
     20 <li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li>
     21 <li>IMAPサーバー(MDA): Dovecot 2.3.20</li>
     22 </ul>
     23 
     24 <h2>メールの仕組み</h2>
     25 <p>
     26 メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのが\
     27 SMTPサーバーと呼ばれるソフトウェアである。\
     28 このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも\
     29 呼ばれる。\
     30 今回はMTAとしてOpenSMTPDというのを使う。\
     31 手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、\
     32 そこから受信側のMTAに転送される。\
     33 受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所\
     34 に保存する。\
     35 </p>
     36 <p>
     37 受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、\
     38 自分宛てのメールを確認する。\
     39 この時に使われるのがIMAPというプロトコルである\
     40 (POPというのもあるが今回は割愛)。\
     41 IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する\
     42 役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。\
     43 今回MDAとしてDovecotを使用する。\
     44 </p>
     45 <p>
     46 以上をまとめると以下のようになる:
     47 </p>
     48 <pre>
     49 +------------+        +----------------+
     50 |MTA(mtkn.jp)|--SMTP-&gt;|      MTA       |
     51 +------------+        +--example.com---+
     52       ^               |      MDA       |
     53       |               +----------------+
     54       |                       |
     55      SMTP                    IMAP
     56       |                       |
     57       |                       v
     58 +------------+        +----------------+
     59 |user@mtkn.jp|        |user@example.com|
     60 +------------+        +----------------+
     61 
     62 </pre>
     63 <ol>
     64 <li>メールを書く。</li>
     65 <li>送信側のMTAに送る。</li>
     66 <li>受信側のMTAに転送する。</li>
     67 <li>受信者が受信側のMDAに新着メールの有無を確認する。</li>
     68 </ol>
     69 
     70 <p>
     71 SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、\
     72 いくつかの方法で送信元の本人確認を行う。\
     73 その際第三者としてDNS及び、サーバーのIPアドレスを管理している人\
     74 (今回の場合はさくらインターネット)が登場する。\
     75 DNSにはドメインをIPアドレスにひもづける情報が登録できる。\
     76 またIPアドレスの管理人には、自分が借りているIPアドレスを\
     77 自分のドメインにひもづける情報を登録してもらう。\
     78 これらによって、メールの送信者がドメイン、IPアドレス双方から\
     79 確認できるので、なりすましを防止できる仕組みである。\
     80 </p>
     81 
     82 <p>
     83 最近はgmail等の大手がスパム対策を強化する一環として、\
     84 以下に述べるような本人確認をすべて通らなければ受信しない\
     85 ようにしているらしい。\
     86 </p>
     87 
     88 <h2>MTAどうしのやりとり</h2>
     89 <p>
     90 以下、MTAどうしの通信内容をざっくり説明する。
     91 </p>
     92 
     93 <h3>Aレコード、MXレコードによる送信先の特定</h3>
     94 <p>
     95 MTAがメールを送信する際、まずは宛先のサーバーを\
     96 特定する必要がある。\
     97 この際に使用するのがDNSに登録されているMXレコードである。\
     98 送信元のMTAはまずDNSに宛先のドメインのMXレコード\
     99 を問い合わせる。\
    100 するとメールの送信先のドメイン名が分かるので、続いて\
    101 この送信先のIPアドレスを問い合わせる:\
    102 </p>
    103 <pre>
    104 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 DNS
    105 
    106     example.com宛のメールって
    107     誰に送ったらええん?
    108     ----------------------------------------&gt;
    109 
    110                  mai.example.comやで(MXレコード)
    111     &lt;----------------------------------------
    112 
    113     mail.example.comってどこや?
    114     ----------------------------------------&gt;
    115 
    116                <i>ddd.ddd.ddd.ddd</i>やで(Aレコード)
    117     &lt;----------------------------------------
    118 </pre>
    119 <p>
    120 次にこの宛先のMTAとの通信を開始する。\
    121 しかし受信側のMTA(example.com)は、\
    122 mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:\
    123 </p>
    124 <pre>
    125 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    126     こんちは。mtkn.jpです。
    127     ----------------------------------------&gt;
    128 
    129                   なりすましちゃうか確認したろ
    130 </pre>
    131 
    132 <h3>SPFレコードによる送信元の本人確認</h3>
    133 <p>
    134 受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。\
    135 このときに使うのがSPFレコードである。\
    136 このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいい\
    137 IPアドレスを指定する。\
    138 受信側のMTAは送信元のIPアドレスと、このレコードに\
    139 記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者\
    140 に認められているMTAかどうか判断できる。\
    141 </p>
    142 <pre>
    143 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    144                  mtkn.jpを名乗るやつから連絡
    145                  来てるんやけどこいつ本物?
    146     &lt;----------------------------------------
    147 
    148     IPアドレスが<i>sss.sss.sss.sss</i>
    149     やったら多分本物やわ。(SPFレコード)
    150     ----------------------------------------&gt;
    151 
    152                                      よっしゃ
    153 </pre>
    154 
    155 <h3>PTRレコード</h3>
    156 <p>
    157 次は逆にIPアドレスからドメインを辿って本人確認する。\
    158 これに使われるのがPTRレコードである。\
    159 このレコードはIPアドレスの管理人(ここではさくらインターネット)\
    160 でないと登録できない。\
    161 しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを\
    162 提供しており、PTRレコードをきちんと設定した上でスパムメールを\
    163 送ると、自分の身元がバレるので、スパムの抑止に繋がる。\
    164 </p>
    165 <pre>
    166 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    167 	    <i>sss.sss.sss.sss</i>ってIPアドレスで
    168             mtkn.jpってドメイン登録されてる?
    169     &lt;----------------------------------------
    170 
    171     されてるで。(PTRレコード)
    172     ----------------------------------------&gt;
    173 
    174                                      よっしゃ
    175 </pre>
    176 
    177 <h3>DKIM</h3>
    178 <p>
    179 送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。\
    180 署名は公開鍵方式で行うが、この鍵をドメインキーというようである。\
    181 この署名が付いたメールをDKIM(DomainKey Identified Mail)という。\
    182 送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、\
    183 メール送信時に秘密鍵で署名する:\
    184 </p>
    185 <pre>
    186 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    187 
    188                         本人確認できたわ
    189                         おまたせ。
    190     &lt;----------------------------------------
    191 
    192     userさんにメール送るで。
    193     署名も付けるで。
    194     ----------------------------------------&gt;
    195 </pre>
    196 <p>
    197 受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:\
    198 </p>
    199 <pre>
    200 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    201                  mtkn.jpが署名付きでメール
    202                  くれたんやけどこの署名本物?
    203     &lt;----------------------------------------
    204 
    205     これで確認してみて(DKIM公開鍵)
    206     ----------------------------------------&gt;
    207 
    208                                      よっしゃ
    209 </pre>
    210 
    211 <h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3>
    212 <p>
    213 この他DNSにはDMARCレコードというものを登録することができる。\
    214 これは、以上の本人確認により送信側がにせものであることが確認できた際、\
    215 受信側にどのような行動を取ってほしいかを記述するものである。\
    216 これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、\
    217 受信したサーバーから自分宛てに通報するように頼める\
    218 (この頼みが聞き入れられるかどうかは多分受信側MTAによる)。
    219 </p>
    220 <pre>
    221 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    222                mtkn.jpを名乗る詐欺師から
    223                メールきたんやけどどないしょ?
    224     &lt;----------------------------------------
    225 
    226     ここ(postmaster@mtkn.jp)に通報や。
    227     (DMARCレコード)
    228     ----------------------------------------&gt;
    229 
    230                                      よっしゃ
    231 </pre>
    232 
    233 <h2>サーバーの設定</h2>
    234 <h3>VPSの契約、ドメインの取得</h3>
    235 <p>
    236 VPSとドメインを契約する。\
    237 今回はVPSをさくらインターネットで、\
    238 ドメインをムームードメインでそれぞれ契約した。\
    239 さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい\
    240 (他のVPSを知らないので比較はできないが)。\
    241 ムームードメインは安い。管理画面も悪くはない。\
    242 以前お名前.comでも借りたことがあるが、こちらは広告のメールが\
    243 やたら届いてうっとうしかった記憶がある。\
    244 </p>
    245 
    246 <h3>OpenBSDのインストール</h3>
    247 <p>
    248 さくらのVPSにOpenBSDをインストールする。\
    249 さくらインターネットが用意したISOがあるので、\
    250 OS再インストールの画面からそれを選べばすぐにインストールきる。\
    251 でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。\
    252 </p>
    253 <p>
    254 インストールのこまかい手順は割愛するが、\
    255 ひとつだけひっかかった点があるので書いておく。\
    256 インストール先のディスクをセットアップし、OSに必要なファイルを\
    257 インストールメディアからディスクにコピーすると以下のエラーがでて\
    258 カーネルパニックになった:
    259 </p>
    260 <pre><code>\
    261 wdc_atapi_start: not ready, st = 50
    262 fatal protection fault in supervisor mode
    263 trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410
    264 gsbase 0xffffffff81908ff0 kgsbase 0x0
    265 panic: trap type 4, code=0, pc=ffffffff810081a9
    266 syncing disks...18 18 18 18 18 18 18 18
    267 </code></pre>
    268 <p>
    269 原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗している\
    270 ようで、インストールに必要なファイルをウェブ上からダウンロードする方法\
    271 を選択すると問題なくインストールできた。
    272 </p>
    273 
    274 <h3>ファイアーフォールの設定</h3>
    275 <p>
    276 メールの送受信等に必要なポートを開ける:\
    277 </p>
    278 <ul>
    279 <li>TCP 22: ssh接続用</li>
    280 <li>UDP 53: DNSとの通信用</li>
    281 <li>TCP 25: SMTPの通信用</li>
    282 <li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li>
    283 <li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li>
    284 <li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li>
    285 </ul>
    286 <p>
    287 以上の設定を<code>/etc/pf.conf</code>に設定する:
    288 </p>
    289 <pre><code>\
    290 set skip on lo
    291 
    292 block return    # block stateless traffic
    293 pass in log proto tcp from any to any port 22 #ssh
    294 
    295 pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS
    296 pass out proto udp from any to any port 123 #ntp
    297 
    298 pass proto icmp #ping
    299 pass proto tcp from any to any port { 80, 443 } #www
    300 pass proto tcp from any to any port { 25, 587, 993 } #mail
    301 </code></pre>
    302 <p>
    303 <code>pf(4)</code>の設定を反映:
    304 </p>
    305 <pre><code>\
    306 # pfctl -f /etc/pf.conf
    307 </code></pre>
    308 
    309 <h3>DNSの設定</h3>
    310 <h4>A, MX, SPF, DMARC</h4>
    311 <p>
    312 DNSのレコードを設定する。\
    313 ムームーDNSの場合、コントロールパネルにログインし、サイドバーから\
    314 ドメイン管理&gt;ドメイン操作&gt;ムームーDNSと進み、設定するドメインの変更ボタン\
    315 をクリックすると設定画面がでるので、以下のように設定する:\
    316 </p>
    317 <table>
    318 <thead>
    319 <tr>
    320 <th>サブドメイン</th>
    321 <th>種別</th>
    322 <th>内容</th>
    323 <th>優先度</th>
    324 </tr>
    325 </thead>
    326 <tbody>
    327 <tr>
    328 <td></td>
    329 <td>A</td>
    330 <td><i>sss.sss.sss.sss</i></td>
    331 <td></td>
    332 </tr>
    333 <tr>
    334 <td>mail</td>
    335 <td>A</td>
    336 <td><i>sss.sss.sss.sss</i></td>
    337 <td></td>
    338 </tr>
    339 <tr>
    340 <td></td>
    341 <td>MX</td>
    342 <td>mail.mtkn.jp</td>
    343 <td>10</td>
    344 </tr>
    345 <tr>
    346 <td></td>
    347 <td>TXT</td>
    348 <td>v=spf1 mx -all</td>
    349 <td></td>
    350 </tr>
    351 <tr>
    352 <td>_dmarc</td>
    353 <td>TXT</td>
    354 <td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td>
    355 <td></td>
    356 </tr>
    357 </tbody>
    358 </table>
    359 
    360 <p>
    361 ひとつめのAレコードは、ドメイン名(mtkn.jp)にIPアドレス(<i>sss.sss.sss.sss</i>)を\
    362 紐付けるものである。\
    363 ふたつめはmail.mtkn.jpのIPアドレスを登録するものである。\
    364 みっつめのMXレコードは、このドメイン宛てのメール(user@mtkn.jp等)をどこの\
    365 サーバーに送信するかを決めるものである。上記の設定では、mail.mtkn.jpに送信\
    366 するようにしている。\
    367 以上の設定で、user@mtkn.jp宛てのメールは、mail.mtkn.jpというサーバーに\
    368 送信すればよいことが分かり、さらにこのサーバーのIPアドレスは<i>sss.sss.sss.sss</i>\
    369 であることも分かる。
    370 </p>
    371 <p>
    372 次のTXTレコードはSPFレコードである。\
    373 v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録された\
    374 IPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信\
    375 を禁止している。
    376 </p>
    377 <p>
    378 最後のものはDMARCレコードである。\
    379 v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメール\
    380 について、その受信者が受信を拒否するように指定している。\
    381 rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメール\
    382 を受信した場合の通報先を指定している。\
    383 </p>
    384 
    385 <h4>PTR</h4>
    386 <p>\
    387 PTRレコードを設定する。\
    388 さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>\
    389 ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名\
    390 (mtkn.jp)を入力する。
    391 </p>
    392 
    393 <h3>OpenSMTPDの設定</h3>
    394 <h4>ユーザーの作成</h4>
    395 <p>
    396 メールの送受信を担当するユーザーを作成する:\
    397 </p>
    398 <pre><code>\
    399 # useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail
    400 </code></pre>
    401 
    402 <h4>サーバー証明書の取得</h4>
    403 <p>
    404 <code>httpd(8)</code>の設定ファイルを作成する。\
    405 <code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。\
    406 変更箇所はドメイン名だけでいい。\
    407 編集後、httpdを起動する。\
    408 </p>
    409 <pre><code>\
    410 # cp /etc/examples/httpd.conf /etc/
    411 # vi /etc/httpd.conf
    412 # echo httpd_flags= &gt;&gt; /etc/rc.conf.local
    413 # rcctl start httpd
    414 # rcctl enable httpd
    415 </code></pre>
    416 
    417 <p>
    418 続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。\
    419 まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。\
    420 その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に\
    421 登録することで、証明書が自動で更新されるようにする。\
    422 </p>
    423 <pre><code>\
    424 # cp /etc/examples/acme-client.conf /etc/
    425 # vi /etc/acme-client.conf
    426 # acme-client -v mail.mtkn.jp
    427 # crontab -e
    428 </code></pre>
    429 
    430 <pre><code>\
    431 #minute hour    mday    month   wday    [flags] command
    432 ~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd
    433 </code></pre>
    434 
    435 <h4>ドメインキーの作成とDNSへの登録</h4>
    436 <p>
    437 OpenSMTPD用のDKIMフィルターをインストールする。
    438 </p>
    439 <pre><code>\
    440 # pkg_add opensmtpd-filter-dkimsign
    441 </code></pre>
    442 
    443 <p>
    444 ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。\
    445 DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。
    446 </p>
    447 <pre><code>\
    448 # openssl genrsa -out /etc/mail/dkim/private.key 1024
    449 # openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key
    450 # chown -r _dkimsign:_dkimsign /etc/mail/dkim
    451 # chmod 0400 /etc/mail/dkim/private.key
    452 </code></pre>
    453 
    454 <p>\
    455 作成したドメインキーの公開鍵をDNSに登録する:\
    456 </p>
    457 <table>
    458 <thead>
    459 <tr>
    460 <th>サブドメイン</th>
    461 <th>種別</th>
    462 <th>内容</th>
    463 <th>優先度</th>
    464 </tr>
    465 </thead>
    466 <tbody>
    467 <tr>
    468 <td>selector1._domainkey.mail</td>
    469 <td>TXT</td>
    470 <td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td>
    471 <td></td>
    472 </tr>
    473 </tbody>
    474 </table>
    475 
    476 <p>
    477 サブドメインのselector1は\
    478 以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに
    479 指定してものと同じものであれば他のものでもいい。\
    480 </p>
    481 
    482 <h4>smtpd.confの設定</h4>
    483 <p>
    484 /etc/mail/smtpd.confを以下の通り変更:\
    485 </p>
    486 <pre><code>\
    487 # 認証に使用するサーバー証明書と秘密鍵を&quot;mtkn.jp&quot;という名前で登録。
    488 # 証明書のファイルは先程acme-client(1)で取得したもの。
    489 pki mtkn.jp cert &quot;/etc/ssl/mail.mtkn.jp.fullchain.pem&quot;
    490 pki mtkn.jp key &quot;/etc/ssl/private/mail.mtkn.jp.key&quot;
    491 
    492 # テーブルの登録
    493 # ローカルに届いたメールの転送を設定するテーブル
    494 table aliases file:/etc/mail/aliases
    495 # ユーザーの名前と暗号化されたパスワードのテーブル
    496 table passwd file:/etc/mail/passwd
    497 # メールの転送を設定するテーブル
    498 table virtuals file:/etc/mail/virtuals
    499 
    500 # フィルターの登録
    501 # ドメインキーによる署名を付加するフィルター
    502 filter dkim_sign proc-exec\\
    503 	&quot;filter-dkimsign -d mail.mtkn.jp -s selector1\\
    504 	-k /etc/mail/dkim/private.key&quot; user _dkimsign group _dkimsign
    505 # DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター
    506 filter check_rdns phase connect match !rdns disconnect &quot;550 no rDNS.&quot;
    507 # 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった
    508 # 場合に受信を拒否するフィルター
    509 filter check_fcrdns phase connect match !fcrdns disconnect &quot;550 no FCrDNS.&quot;
    510 
    511 # 各ネットワークインターフェース毎の処理を設定。
    512 listen on socket
    513 listen on lo0
    514 # vio0というインターフェースの25番ポートに届いたものに関する設定。
    515 # 外部からmtkn.jp宛に届いたものの処理である。
    516 # 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、
    517 # 上で設定したDNSに関するフィルターを適応。
    518 listen on vio0 port 25 tls pki mtkn.jp hostname &quot;mail.mtkn.jp&quot;\\
    519 	filter { check_rdns, check_fcrdns }
    520 # vio0というインターフェースのsubmission(587番)ポートに関する設定。
    521 # mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される
    522 # メールに関する設定。
    523 # 上と同様に&quot;mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、
    524 # &quot;passwd&quot;という名前で登録したパスワードで認証し、
    525 # さらにドメインキーでメールに署名する。
    526 listen on vio0 mask-src port submission smtps pki mtkn.jp\\
    527 	hostname &quot;mail.mtkn.jp&quot; auth &lt;passwd&gt; filter dkim_sign
    528 
    529 # 各種メールの処理を定義する。
    530 # 各処理が実行される条件はこの後定義する。
    531 # ローカルメールはデフォルトのまま
    532 action &quot;local_mail&quot; mbox alias &lt;aliases&gt;
    533 # 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。
    534 action &quot;domain&quot; maildir &quot;/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}&quot;\\
    535 	virtual &lt;virtuals&gt;
    536 # 他のドメイン宛ては宛先へ転送。
    537 # 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で
    538 # 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加
    539 action &quot;outbound&quot; relay helo "mtkn.jp"
    540 
    541 # どういう条件でどういう処理をするかを定義する。
    542 # 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。
    543 # ここでは/var/vmail/以下に振り分けて保存する。
    544 match from any for domain mtkn.jp action &quot;domain&quot;
    545 # このサーバー内でのメールはlocal_mailとして処理。
    546 match from local for local action &quot;local_mail&quot;
    547 # このサーバー内から他所へのメールは宛先に転送
    548 match from local for any action &quot;outbound&quot;
    549 # 外部から来た他所宛てのメールは認証されているものに限り転送。
    550 # authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。
    551 match auth from any for any action &quot;outbound&quot;
    552 </code></pre>
    553 
    554 <h4>各テーブルの作成</h4>
    555 <p>
    556 上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。\
    557 <code>/etc/mail/aliases</code>は特に変更しなくてもいい。\
    558 <code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを\
    559 保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:\
    560 </p>
    561 <pre><code>\
    562 # echo user@mtkn.jp:$(smtpctl encrypt) &gt;&gt; /etc/mail/passwd
    563 <i>パスワードを入力し、エンター、Ctrl-D</i>
    564 </code></pre>
    565 
    566 <p>
    567 <code>/etc/mail/virtuals</code>にはメールの転送を設定できる。\
    568 以下のようにする:\
    569 </p>
    570 <pre><code>\
    571 abuse@mtkn.jp         user@mtkn.jp
    572 postmaster@mtkn.jp    user@mtkn.jp
    573 webmaster@mtkn.jp     user@mtkn.jp
    574 user@mtkn.jp          vmail
    575 </code></pre>
    576 <p>
    577 この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。\
    578 abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど\
    579 必要なんかな?
    580 </p>
    581 
    582 <h3>Dovecotの設定</h3>
    583 <p>
    584 MDAとして<code>dovecot(1)</code>をインストールする。\
    585 </p>
    586 <pre><code>\
    587 # pkg_add dovecot
    588 </code></pre>
    589 <p>
    590 dhparamを作成する(時間がかかる):
    591 </p>
    592 <pre><code>\
    593 # openssl dhparam -out /etc/ssl/dh.pem 4096
    594 </code></pre>
    595 
    596 <p>
    597 わかりにくい設定ファイルをどけてシンプルなものに書き直す:
    598 </p>
    599 <pre><code>\
    600 # mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
    601 # vi /etc/dovecot/dovecot.conf
    602 </code></pre>
    603 <p>
    604 ドキュメントは公式ウェブサイトで確認できる。\
    605 分量が多すぎて読む気にならない。\
    606 サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。\
    607 パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>\
    608 と暗号化されていないIMAPを<code>port = 0</code>として無効にする。\
    609 他はとりあえず以下の設定で動く:\
    610 </p>
    611 <pre><code>\
    612 # IPv4は全て監視
    613 listen = *
    614 
    615 # SSL接続のみ許可
    616 ssl = required
    617 
    618 # SSLに使用するファイル
    619 ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem
    620 ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key
    621 ssl_dh = &lt;/etc/ssl/dh.pem
    622 
    623 # メールの保存場所は各ユーザーのホームディレクトリ。
    624 # ホームディレクトリの場所は以下のuserdbで設定。
    625 mail_location = maildir:~
    626 
    627 # パスワードのファイル。
    628 # OpenSMTPDと共有。
    629 passdb {
    630     args = scheme=BLF-CRYPT /etc/mail/passwd
    631     driver = passwd-file
    632 }
    633 
    634 # ユーザーの設定。
    635 # ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i>
    636 userdb {
    637     args = uid=vmail gid=vmail home=/var/vmail/%d/%n
    638     driver = static
    639 }
    640 
    641 # 使用するプロトコル。
    642 protocols = imap lmtp
    643 
    644 # SSLを使ったIMAPSのみを許可。
    645 service imap-login {
    646   inet_listener imaps {
    647     port = 993
    648     ssl = yes
    649   }
    650   # Disable imap
    651   inet_listener imap {
    652     port = 0
    653   }
    654 }
    655 </code></pre>
    656 <pre><code>\
    657 # rcctl start dovecot
    658 # rcctl enable dovecot
    659 </code></pre>
    660 
    661 <p>
    662 サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように\
    663 <code>cron(8)</code>に追加しておく:
    664 </p>
    665 <pre><code>\
    666 crontab -e
    667 </code></pre>
    668 
    669 <pre><code>\
    670 #minute hour    mday    month   wday    [flags] command
    671 ~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd &amp;&amp; rcctl reload dovecot
    672 </code></pre>
    673 
    674 <h3>テスト</h3>
    675 <p>
    676 手元のメールクライアントから送受信のテストをする。\
    677 特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。\
    678 以上の設定で、gmailへの送受信は問題なかった。\
    679 また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン\
    680 及び送受信できることも確認した。\
    681 </p>
    682 <p>
    683 <date>2025-11-03</date> <code>smtpd.conf</code>に<code>helo "mtkn.jp"</code>を追加し、\
    684 <a href="https://www.mail-tester.com/">mail-tester.com</a>というサイトにてテストしたところ満点をもらえた。\
    685 gmailへの送信でよく迷惑メールに分類されていたが、<code>HELO</code>のときにDNSに登録されていない\
    686 ホスト名を返していたのが原因かもしれない。\
    687 </p>
    688 
    689 <h2>参考文献</h2>
    690 <ul>
    691 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-1-what-is-email.html">Arch Linux mail server tutorial - part 1 - What is email?.unixsheikh.com</a></li>
    692 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-2-opensmtpd-dovecot-dkimproxy-and-lets-encrypt.html">Arch Linux mail server tutorial - part 2 - OpenSMTPD, Dovecot, DKIMproxy, and Let's Encrypt.unixsheikh.com</a></li>
    693 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-3-get-dns-right-it-is-important.html">Arch Linux mail server tutorial - part 3 - Get DNS right, it's important!.unixsheikh.com</a></li>
    694 <li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li>
    695 <li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li>
    696 <li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li>
    697 <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li>
    698 <li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li>
    699 <li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li>
    700 <li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li>
    701 </ul>