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