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->| 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 ----------------------------------------> 109 110 mai.example.comやで(MXレコード) 111 <---------------------------------------- 112 113 mail.example.comってどこや? 114 ----------------------------------------> 115 116 <i>ddd.ddd.ddd.ddd</i>やで(Aレコード) 117 <---------------------------------------- 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 ----------------------------------------> 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 <---------------------------------------- 147 148 IPアドレスが<i>sss.sss.sss.sss</i> 149 やったら多分本物やわ。(SPFレコード) 150 ----------------------------------------> 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 <---------------------------------------- 170 171 されてるで。(PTRレコード) 172 ----------------------------------------> 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 <---------------------------------------- 191 192 userさんにメール送るで。 193 署名も付けるで。 194 ----------------------------------------> 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 <---------------------------------------- 204 205 これで確認してみて(DKIM公開鍵) 206 ----------------------------------------> 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 <---------------------------------------- 225 226 ここ(postmaster@mtkn.jp)に通報や。 227 (DMARCレコード) 228 ----------------------------------------> 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 ドメイン管理>ドメイン操作>ムームー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= >> /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 && 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 # 認証に使用するサーバー証明書と秘密鍵を"mtkn.jp"という名前で登録。 488 # 証明書のファイルは先程acme-client(1)で取得したもの。 489 pki mtkn.jp cert "/etc/ssl/mail.mtkn.jp.fullchain.pem" 490 pki mtkn.jp key "/etc/ssl/private/mail.mtkn.jp.key" 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 "filter-dkimsign -d mail.mtkn.jp -s selector1\\ 504 -k /etc/mail/dkim/private.key" user _dkimsign group _dkimsign 505 # DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター 506 filter check_rdns phase connect match !rdns disconnect "550 no rDNS." 507 # 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった 508 # 場合に受信を拒否するフィルター 509 filter check_fcrdns phase connect match !fcrdns disconnect "550 no FCrDNS." 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 "mail.mtkn.jp"\\ 519 filter { check_rdns, check_fcrdns } 520 # vio0というインターフェースのsubmission(587番)ポートに関する設定。 521 # mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される 522 # メールに関する設定。 523 # 上と同様に"mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、 524 # "passwd"という名前で登録したパスワードで認証し、 525 # さらにドメインキーでメールに署名する。 526 listen on vio0 mask-src port submission smtps pki mtkn.jp\\ 527 hostname "mail.mtkn.jp" auth <passwd> filter dkim_sign 528 529 # 各種メールの処理を定義する。 530 # 各処理が実行される条件はこの後定義する。 531 # ローカルメールはデフォルトのまま 532 action "local_mail" mbox alias <aliases> 533 # 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 534 action "domain" maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}"\\ 535 virtual <virtuals> 536 # 他のドメイン宛ては宛先へ転送。 537 # 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で 538 # 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加 539 action "outbound" relay helo "mtkn.jp" 540 541 # どういう条件でどういう処理をするかを定義する。 542 # 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 543 # ここでは/var/vmail/以下に振り分けて保存する。 544 match from any for domain mtkn.jp action "domain" 545 # このサーバー内でのメールはlocal_mailとして処理。 546 match from local for local action "local_mail" 547 # このサーバー内から他所へのメールは宛先に転送 548 match from local for any action "outbound" 549 # 外部から来た他所宛てのメールは認証されているものに限り転送。 550 # authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 551 match auth from any for any action "outbound" 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) >> /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 = </etc/ssl/mail.mtkn.jp.fullchain.pem 620 ssl_key = </etc/ssl/private/mail.mtkn.jp.key 621 ssl_dh = </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 && rcctl restart smtpd && 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>