www.mtkn.jp

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

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>&lt;server_ip&gt;</code>とする。</li>
     11 	<li>さくらのドメイン: ドメイン名は<code>&lt;server_domain&gt;</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.&lt;server_ip&gt;</code>を追加:</p>
     47 <pre><code>domain mail.&lt;server_domain&gt; {
     48 	domain key "/etc/ssl/private/mail.&lt;server_domain&gt;.key"
     49 	domain full chain certificate "/etc/ssl/mail.&lt;server_domain&gt;.fullchain.pem"
     50 	sign with letsencrypt
     51 }</pre></code>
     52 
     53 <pre><code># acme-client -v &lt;server_domain&gt; && rcctl start httpd
     54 # crontab -e
     55 43 1 * * * acme-client -v mail.&lt;server_domain&gt; && rcctl restart smtpd && rcctl reload dovcot
     56 &lt;Esc&gt;:wq</code></pre>
     57 
     58 <h3>smtpdの設定</h3>
     59 <pre><code>pki "mail" cert "/etc/ssl/mail.&lt;server_domain&gt;.fullchain.pem"
     60 pki "mail" key "/etc/ssl/private/mail.&lt;server_domain&gt;.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.&lt;server_domain&gt; -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.&lt;server_domain&gt;"\
     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/&lt;server_domain&gt;/%{dest.user:lowercase}"\
     82 	virtual <virtuals>
     83 action "outbound" relay
     84 
     85 match from any for domain "&lt;server_domain&gt;" 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@&lt;server_domain&gt;         admin@&lt;server_domain&gt;
     93 postmaster@&lt;server_domain&gt;    admin@&lt;server_domain&gt;
     94 webmaster@&lt;server_domain&gt;     admin@&lt;server_domain&gt;
     95 admin@&lt;server_domain&gt;         vmail
     96 contact@&lt;server_domain&gt;       vmail</pre></code>
     97 
     98 <p><code>/etc/mail/passwd</code>:</p>
     99 <pre><code>admin@&lt;server_domain&gt;:$2b$10$.....
    100 contact@&lt;server_domain&gt;:$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>