setting_up_mail_server.html (6579B)
1 <h1>OpenBSD、OpenSMTPDとDovecotによるメールサーバー構築</h1> 2 <time>2022-06-15</time> 3 <h2>はじめに</h2> 4 <p>長らくGmailを利用していたが、Googleが嫌になったので、自分のドメインを入手したのを機に自前のメールサーバーを構築してみた。</p> 5 <h2>環境</h2> 6 <ul> 7 <li>OpenBSD 7.1</li> 8 <li>OpenSMTPD 7.0.0</li> 9 <li>Dovecot 2.3.19</li> 10 <li>さくらのVPS: IPアドレスは<code><server_ip></code>とする。</li> 11 <li>さくらのドメイン: ドメイン名は<code><server_domain></code>とする。</li> 12 </ul> 13 14 <h2>概要</h2> 15 <h3>メール送受信の流れ</h3> 16 <p>メールの送受信に関わるものには主に以下のようなものがある。</p> 17 <dl> 18 <dt>メールソフト</dt> 19 <dd>ユーザーがメールを読み書きし、送受信するためのソフトウェア。Mail Submission Agent(MSA)とも。メールクライアントと呼んだ方が正確な気がする。メールソフトでは後述のメールサーバー用のソフトウェアも含まれるように聞こえる。</dd> 20 <dt>SMTPサーバー</dt> 21 <dd>ユーザーから送られてきたメールを宛先に転送するサーバー。Simple Mail Transfer Protocol(SMTP)を用いて他のSMTPサーバーとメールのデータをやり取りする。Mail Transfer Agent(MTA)とも。</dd> 22 <dt>POPサーバー</dt> 23 <dt>IMAPサーバー</dt> 24 <dd>SMTPサーバーに届いたメールを宛先のユーザーに届けるサーバー。メール配信に利用するプロトコルに応じてそれぞれPOPサーバー、IMAPサーバーと言う。Mail Delivery Agent(MDA)とも。</dd> 25 </dl> 26 27 <p>メールが送信されてから宛先に届くまでのおおまかな流れは以下のようなものである。</p> 28 <ol> 29 <li>メールソフトから送信側のメールサーバーにメールを送信(SMTP)。</li> 30 <li>送信側のドメインから送信されたメールであることを保証するためにDKIMの秘密鍵でメールに署名する。</li> 31 <li>送信側のメールサーバーがメールの宛先のドメインをDNSサーバーに問い合わせて受信側のメールサーバーのIPアドレスを取得</li> 32 <li>取得したIPアドレスを用いて受信側のメールサーバーにメールを送信(SMTP)</li> 33 <li>受信側のメールサーバーがDNSサーバーから送信元のドメインに紐付いたDKIMの公開鍵を取得し、届いたメールの署名を確認。その他いくつかの方法でメールの有効性を確認。</li> 34 <li>迷惑メール用のフィルターにかける。</li> 35 <li>受信側のメールサーバーが届いたメールの宛先を確認して宛先のユーザーのフォルダにメールを保存。</li> 36 <li>受信者がメールソフトから受信側のメールサーバーから新着メールをダウンロード(IMAP、POP)</li> 37 </ol> 38 <p> 39 40 <h2>手順</h2> 41 <h3>vmailユーザーを追加</h3> 42 <pre><code># useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail</code></pre> 43 44 <h3>サーバー証明書の発行と設定</h3> 45 <p>メールサーバーの他にウェブサーバーも設定するので、<code>httpd</code>と共にLet's Encryptを設定。</p> 46 <p><code>/etc/acme-client.conf</code>に<code>domain mail.<server_ip></code>を追加:</p> 47 <pre><code>domain mail.<server_domain> { 48 domain key "/etc/ssl/private/mail.<server_domain>.key" 49 domain full chain certificate "/etc/ssl/mail.<server_domain>.fullchain.pem" 50 sign with letsencrypt 51 }</pre></code> 52 53 <pre><code># acme-client -v <server_domain> && rcctl start httpd 54 # crontab -e 55 43 1 * * * acme-client -v mail.<server_domain> && rcctl restart smtpd && rcctl reload dovcot 56 <Esc>:wq</code></pre> 57 58 <h3>smtpdの設定</h3> 59 <pre><code>pki "mail" cert "/etc/ssl/mail.<server_domain>.fullchain.pem" 60 pki "mail" key "/etc/ssl/private/mail.<server_domain>.key" 61 62 table aliases file:/etc/mail/aliases 63 table passwd file:/etc/mail/passwd 64 table virtuals file:/etc/mail/virtuals 65 66 filter dkimsign_rsa proc-exec\ 67 "filter-dkimsign -d mail.<server_domain> -s selector1\ 68 -k /etc/mail/dkim/private.rsa.key" user _dkimsign group _dkimsign 69 70 filter check_rdns phase connect match !rdns disconnect "550 no rDNS." 71 filter check_fcrdns phase connect match !fcrdns disconnect "550 no FCrDNS." 72 73 listen on socket 74 listen on lo0 75 listen on vio0 port 25 tls pki "mail" hostname "mail.<server_domain>"\ 76 filter { check_rdns, check_fcrdns } 77 listen on vio0 mask-src port submission smtps pki "mail"\ 78 hostname "mail.matsudakenji.xyz" auth <passwd> filter dkimsign_rsa 79 80 action "local_mail" mbox alias <aliases> 81 action "domain_mail" maildir "/var/vmail/<server_domain>/%{dest.user:lowercase}"\ 82 virtual <virtuals> 83 action "outbound" relay 84 85 match from any for domain "<server_domain>" action "domain_mail" 86 match from local for local action "local_mail" 87 match from local for any action "outbound" 88 match auth from any for any action "outbound"</code></pre> 89 90 <h3>メールユーザの設定</h3> 91 <p><code>/etc/mail/virtuals</code>:</p> 92 <pre><code>abuse@<server_domain> admin@<server_domain> 93 postmaster@<server_domain> admin@<server_domain> 94 webmaster@<server_domain> admin@<server_domain> 95 admin@<server_domain> vmail 96 contact@<server_domain> vmail</pre></code> 97 98 <p><code>/etc/mail/passwd</code>:</p> 99 <pre><code>admin@<server_domain>:$2b$10$..... 100 contact@<server_domain>:$2b$10$.....</code></pre> 101 102 <pre><code># rcctl restart smtpd</code></pre> 103 104 <h3>Dovecotの設定</h3> 105 <h4>インストール</h4> 106 <pre><code># pkg_add dovecot</code></pre> 107 108 <h4>ログインクラスの設定</h4> 109 <p>これをしないとなんかエラーが出る。</p> 110 <code>/etc/login.conf</code> 111 <pre><code>dovecot:\ 112 :openfiles-cur=1024:\ 113 :openfiles-max=2048:\ 114 :tc=daemon:</code></pre> 115 <pre><code># usermod -L dovecot _dovecot</pre></code> 116 117 <h3>DNSの設定</h3> 118 119 <h3>ファイアーウォールの設定</h3> 120 121 <h3>DKIMproxyの設定</h3> 122 123 124 <h2>参考</h2> 125 <ul> 126 <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?</a></li> 127 <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</a></li> 128 </ul>