お名前.com VPS でdocker-mailserverを使ってみた。
最終的にはWindows 11の標準メールアプリで送受信まで確認できました。
ただ動いてはいるが、いろいろ設定が必要そうなところを端折っているので
セキュリティまで気にする余裕はありません。
またよくわかっていないので普段使いには利用しないつもりです。
あくまでメールの仕組みを勉強するのが目的です。
そんな状態なので、自己責任で実行してください。
環境
パソコン Windows11
VPS OS Ubuntu 20.04.3 LTS、
公式?Usage – Docker Mailserver (docker-mailserver.github.io)をベースにやっていく。
以降、ここのことを公式と呼んでます。
最小限のDNS設定
ドメイン:kikuichigevps.com
hostname:mailではなく適当な名前にした。
ネームサーバーの設定→ドメインのDNS設定→DNS設定/転送設定-機能一覧→ドメインを選択して次へ→DNSレコード設定を利用する。
PTRはないので設定しなかった。(逆引き設定という多分PTRが設定できるものもなかった。)
お名前.comのMXの設定方法はhttps://help.onamae.com/answer/7889
設定値
タイプ | ホスト名 | Value | 備考 |
---|---|---|---|
A | 適当な名前 | 11.22.33.44 | 新規 |
A | kikuichigevps.com | 11.22.33.44 | 設定済み |
MX | 空欄 | 適当な名前.kikuichigevps.com | 新規(優先 :10にした。) |
PTR | 適当な名前.kikuichigevps.com | 11.22.33.44 | TypeにPTRがないので、できないので未 |
「PTRレコード(Pointerレコード)は、DNSのリソースレコードの一種で、特定のIPアドレスに対応するホスト名を定義するレコードです。これは、ドメイン名の逆引きに利用されます」(Bing談)
追加→「DNSレコード設定用ネームサーバー変更確認」のチェックを外す→確認画面へ進む
→有料のサービスは設定しない→設定する。
PTRの設定はVPS(KVM)サーバーコントロールパネルに「DNS逆引き設定」というのがあって、たぶんこれです。しかし設定しないことにしました。後でまた触れます。
実際のメール送信で、設定値が、どう使われているかテストサイト(後述)に送った結果です。
Sender: <user@kikuichigevps.com> ←sudo docker exec -ti <CONTAINER NAME> setup email add user@kikuichigevps.com(後で実行した命令(後述)によってできたもの)
Header-From: <user@kikuichigevps.com>
HELO-Domain: 適当な名前.kikuichigevps.com←DNSのAレコードのホスト名に設定した「適当な名前」とドメイン。またcompose.yamlのhostname: 適当な名前.kikuichigevps.comでも設定している(後述)
Source-IP: 11.22.33.44
SSL/TLS: TLS secured
Validator-Version: 1.19
x-sender: user@kikuichigevps.com
x-receiver: test-b4aed704@appmaildev.com
Received: from 適当な名前.kikuichigevps.com ([11.22.33.44]) by appmaildev.com over TLS secured channel with Microsoft SMTPSVC(8.5.9600.16384);
Fri, 29 Mar 2024 21:36:55 +0000
MIME-Version: 1.0
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kikuichigevps.com;
s=mail; t=1711748216;
bh=JtM5j7略SPE5I=; h=To:From:Subject;
b=E略cQ==
To: "test-b4aed704@appmaildev.com" <test-b4aed704@appmaildev.com>
From: user <user@kikuichigevps.com>
Subject:
Date: Sat, 30 Mar 2024 06:36:54 +0900
Importance: normal
X-Priority: 3
Content-Type: multipart/alternative;
boundary="_606BD3DC-9AC2-468F-85BB-19013479E636_"
Message-Id: <20240329213656.79021241992@適当な名前.kikuichigevps.com>
Return-Path: user@kikuichigevps.com
X-OriginalArrivalTime: 29 Mar 2024 21:36:55.0422 (UTC) FILETIME=[387ED9E0:01DA8221]
SSL証明書をどれに取ればいいか疑問だったんですが、
今のところ個人的な結論としては以下です。(間違っているかもしれません。)
Message-Idで <20240329213656.79021241992@適当な名前.kikuichigevps.com>というのがある。他はuser@kikuichigevps.comで@の後ろに適当な名前がない。
多分、外から見るドメインは「適当な名前」はついてないと思うのでSSLの証明書は適当な名前.kikuichigevps.comで取る必要はないんだと思います。実際に取ってないで使えてます。
もしメールアドレスがuser@別の適当な名前.kikuichigevps.comの場合は
別の適当な名前.kikuichigevps.comでSSL証明書が必要なのではないかと推測します。
別の適当な名前としたのはhostnameとは違う名前のほうがつじつまが合う気がするので。
実際のイメージの展開(Deploying the Actual Image)
dockerディレクトリの下に
mkdir mailserver
cd mailserver
次のコマンドを発行して、必要なファイルを取得します。
DMS_GITHUB_URL="https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master"
wget "${DMS_GITHUB_URL}/compose.yaml"
wget "${DMS_GITHUB_URL}/mailserver.env"
公式にはないけど
wget "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh
もやっておく。DKIMで使う。
compose.yaml編集
hostname: mail.example.com→適当な名前.kikuichigevps.com(hostname.ドメイン)
後でSSL対応するのに備えて
volumes:のところに
- /etc/letsencrypt:/etc/letsencrypt
を追加
これだけですでにkikuichigevps.comの証明書は取っているのでいいはずです。
ただhostnameに指定した適当な名前.kikuichigevps.comには適用されないはずです。
でもこのままやってみる。というのも実際使うときののメールアドレスの@の後ろはkikuichigevps.comになるようなので、hostnameの証明書は必要ないのではと推測した。また、hostnameで証明書を改めて取るのは方法を考えなくてはならないため取り合えずこのままやってみる。
mailserver.envについてはこちらに説明があります。
https://docker-mailserver.github.io/docker-mailserver/latest/config/environment/
2か所だけ変更します。
SSL対応します。
SSL_TYPE=空欄になっている→letsencrypt
(SSL対応は、ややこしいので取り合えずメールを使う場合、空欄でいいかも。
やって確認はしていないですが)
1回最後までやった後以下の設定を変えてみた。
DNSブロックリストは有効にした。
ENABLE_DNSBL=0→1
多分、受信したいメールサーバーが
ブロックリストにリストアップされていたら受信できなくなると思うので覚えておく。
また、https://scribble.washo3.com/docker-mailserver-securityを参考に
いくつか設定してみた。(詳細は把握していない。)
しかし1Gメモリでいろいろ動かしているので、compose upした時点で固まった。
この辺はメモリを食うみたいです。ということで戻した。
CLAMAV、SpamAssassin、Postgreyというセキュリティ関係の機能らしい。
ENABLE_CLAMAV=0→1→0
ENABLE_SPAMASSASSIN=0→1→0
ENABLE_POSTGREY=0→1→0
目次へ
起動して実行する
以下の注意書きがあったので気にしておこうと思います。
https://docker-mailserver.github.io/docker-mailserver/latest/usage/#get-up-and-running
docker compose start / stop
ではなく、docker compose up / down
を使用します。そうしないと、コンテナーが適切に破棄されず、一貫性のない状態のために起動時に問題が発生する可能性があります。Ctrl+C
の使用もサポートされていません!
コンテナを立ち上げるところは公式をベースに
流れはhttps://tech.walkit.net/docker-mailserver#toc6を参考にさせてもらいます。
setup.shは使わないで公式の方式でやった。
sudo docker-compose up -d
「最初の起動時には、少なくとも 1 つのメール アカウントを追加する必要があります (LDAP を使用している場合を除く)。2 分間の猶予がなければ、DMS はシャットダウンして再起動します。アカウントを追加するには、 を実行します。」
ということで以下でアカウント追加できるようなので
sudo docker exec -ti <CONTAINER NAME> setup email add user@example.com
sudo docker psでコンテナ名を調べた。userは新しく任意の名前、
example.comは自分のドメインに変更して実効しました。
パスワードを聞かれるので入力。
全部の設定が完了後Windows11のメールアプリでは、
ここで設定したメールアドレスとパスワードの設定だけで
アカウント設定が完了し、メールの送受信ができた。
その他の手順
TLS(SSL)の設定は済んでいるつもり。
エイリアス
「少なくとも 1 つのエイリアス (postmaster エイリアス) を追加する必要があります。これは一般的な規則ですが、厳密には必須ではありません。」
ということなので
userは先ほどの任意の名前、example.comは自分のドメインに変更して実効しました。
sudo docker exec -ti <CONTAINER NAME> setup alias add postmaster@example.com user@example.com
目次へ
ポート開放
VPS(KVM)サーバーコントロールパネルで作業。
セキュリティグループで設定を追加→グループ名、mail(任意の文字)、インバウンドルール
(ポート)はymlのportで開放している25、143、465、587、993を追加してみた。
サーバー一覧→詳細→IP セキュリティで変更→mailを追加→変更する
Nmapで見ると25が開いてない。
25番はいわくつきのポート(OP25B)のようなのでブロックされてるのか。
このままの状態で次項のようにメール送受信はできた。
PORT STATE SERVICE
80/tcp open http
143/tcp open imap(今回開放)
443/tcp open https
465/tcp open smtps(今回開放)
587/tcp open submission(今回開放)
993/tcp open imaps(今回開放)
あとで分かったがNmapで見てる状態で25が閉じていると判断してはダメなのかも。
実際は開放されて使っているっぽい(後述)
ログはこれで見れた
sudo docker logs コンテナ名 -f 2>/dev/null
目次へ
Windows11のメールで確認
Windows11の標準のメールソフトで
⚙→アカウントの管理→アカウントの追加→そのほかのアカウント→メールアドレスとパスワード入力→サインイン
でアカウントができた。
最初、送受信できなかったが、なぜかできるようになった。
取り合えず動くことは分かったのでIP セキュリティを変更してポートをクローズしておいた。
目次へ
高度なDNS設定 – DKIM、DMARC & SPF
参考:https://qiita.com/idani/items/cc160fa49681919aa215#dkim%E8%A8%AD%E5%AE%9A
参考サイトにあるDKIM、DMARC & SPFのテストサイトは「次のステップ」を押して、
「ください、次のメール アドレスにメールを送信します:」のメールアドレスにメールを送信すると結果が表示されます。何回でも使える。
メールを送信することになる(メールアドレスが分かってしまう)ので
一応、警戒しておいた方がいいかも。
DKIM
DKIM keyを作ります。
sudo ./setup.sh config dkim
以下表示されます。
[ INF ] Creating DKIM private key '/tmp/docker-mailserver/opendkim/keys/kikuichigevps.com/mail.private'
できたkeyの中身を確認するためrootユーザでコンテナの中に入る
sudo docker exec -it --user root コンテナ名 bash
以下の場所にあるmail.txtの中身を見る。
cat /tmp/docker-mailserver/opendkim/keys/kikuichigevps.com/mail.txt
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa;略IDAQAB" ) ; ----- DKIM key mail for kikuichigevps.com
赤字部分をDNSのTXTに登録します。
ホスト名(お名前.comの場合、項目がホスト名と固定されているが、ここではセレクタの意味だと思う)mail._domainkey
typeはTXT。
Valueは上の赤字部分だが、参考サイトをよく見て加工してください。
さらにお名前.comの場合、両端の"は参考サイトとは違い不要です。
参考:https://tech.yuzuyu.mobi/archives/483
目次へ
SPF
spfは
Best Practices | SPF - Docker MailserverA fullstack but simple mail-server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) using Docker.
の; SPF record
example.com. IN TXT "v=spf1 mx ~all"をもとに
ホスト名:空欄
type:TXT
Value:v=spf1 mx ~all
こちらも参考にしましたhttps://scribble.washo3.com/docker-mailserver
MXに関しては、最初に設定したものだけで今回は追加してない。
目次へ
DMARK
dmarkは
Best Practices | DMARC - Docker MailserverA fullstack but simple mail-server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) using Docker.
の_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc.report@example.com; ruf=mailto:dmarc.report@example.com; sp=none; ri=86400"をもとに
ホスト名:_dmarc
type:TXT
Value:v=DMARC1; p=none; rua=mailto:dmarc.report@example.com; ruf=mailto:dmarc.report@example.com; sp=none; ri=86400
結果
DmmainKeyはnoneだけど英語で書いてある通りDKIMがpassならいいみたい。
PTRの中身は
Sender-IP: 11.22.33.44
Query ***.***.***.***.in-addr.arpa
Host: *-*-*-*.*.jp(Vpsのホスト名になってる)
になっていてExistsRecord(存在している)になっているが本来、
HostはDNSでPTR設定をしたものにするのかもしれない。
(今回、PTRは結局デフォルトのままでいじらなかった)
PTRはIPアドレスに対応するホスト名を定義するレコードだから、
メール専用サーバーならメールのホスト名でいいかもしれないけど、
いろんなもので使っているときは問題ないのかな。逆引き自体、何に使うのか分からないけど。
RBLは何なのか調べてません。
目次へ
メールの仕組みを勉強して設定の見直し
まずは動くものがあると実験して勉強しやすいので、
ここから本格的にメールの仕組みを勉強しつつ先へ進みます。
開放するport
下の表を拝借して検討した。
https://zenn.dev/takaha/articles/docker-mailserver#%E6%8E%A5%E7%B6%9A%E3%83%9D%E3%83%BC%E3%83%88%E8%A8%AD%E5%AE%9A
Protocol Explicit TLS Implicit TLS Purpose SMTP 25 N/A Transfer ESMTP 587 465 Submission IMAP4 143 993 Retrieval
この表を理解するためにBingとGeminiにメール周りの用語や基本を聞いた。
Implicit TLS(暗黙のTLS)とExplicit TLS(明示的TLS)は、セキュリティプロトコルで使用される異なる接続方式を指します。以下にそれぞれの意味と特徴を説明します。
- Implicit TLS:
- TCPコネクション開始と同時にTLSセッションがいきなり始まる方式です。
- 例として、HTTPS通信がこれに該当します。
- 平文通信用と暗号通信用に別々のポートを割り当てる必要がありますが、その分低レイテンシーを実現できます。
- 通信が始まるとすぐに暗号化されるため、セキュリティが高いです。
- Explicit TLS:
- TCPコネクションが確立すると、最初は平文で通信が始まり、そこからTLSへ移行する方式です。
- 例として、STARTTLSコマンドを使用するプロトコルがこれに該当します。
- 平文通信と暗号通信を同じポートでカバーできますが、平文から暗号へ切り替わる手順があるため、レイテンシーは大きくなります。
SMTP(Simple Mail Transfer Protocol)、ESMTP(Extended Simple Mail Transfer Protocol)、およびIMAP4(Internet Message Access Protocol version 4)は、電子メールの通信に使用されるプロトコルです。それぞれのプロトコルの違いを以下に説明します。
- SMTP (Simple Mail Transfer Protocol)
- 役割: メール送信に使用されるプロトコル。
- 動作: 送信者からメールサーバーへメッセージを送信する方法を定義します。
- 詳細:
- SMTPはメール送信エージェント(MTA)によって異なるサーバーやコンピュータネットワーク間でメールを転送するために使用されます。
- 最新のSMTPバージョンはRFC 5321で定義されており、以前のバージョン(RFC 821など)を更新しています1.
- ポート:
- ポート 25: 初期の標準ポートで、メールサーバー間の通信とメッセージリレーに使用されます。ただし、スパムを防ぐために多くのクラウドホスティングプロバイダーやメールクライアント(Gmail、Microsoft Outlook、Thunderbird、Yahooなど)でブロックされています。
- ポート 465: 元々SMTPS(SSL上のSMTP)用に指定されていましたが、RFCには準拠していないため、公式のSMTP伝送チャネルとしては認識されていません。ただし、一部のサービスでSMTP over SSL/TLS接続に使用されています1.
- ESMTP (Extended Simple Mail Transfer Protocol)
- 役割: メール送信に使用される拡張プロトコル。
- 動作: SMTPと同様にメール送信を行いますが、一部の拡張機能を提供します。
- ポート:
- ポート 587: メール送信に使用されます。SMTPと同様に、クライアントとサーバーが平文で通信を開始し、その後TLSセッションに切り替えます。
- ポート 465: SMTPS用に指定されていましたが、RFCには準拠していないため、公式のSMTP伝送チャネルとしては認識されていません。ただし、一部のサービスでSMTP over SSL/TLS接続に使用されています1.
- IMAP4 (Internet Message Access Protocol version 4)
- 役割: メール受信に使用されるプロトコル。
- 動作: クライアントとサーバー間でメールを同期し、複数のデバイスからメールを表示する仕組みを提供します。
- ポート:
- ポート 143: メール受信に使用されます。クライアントとサーバーが平文で通信を開始し、その後TLSセッションに切り替えます。
- ポート 993: メール受信に使用されます。クライアントとサーバーが最初からTLSセッションを確立します。
これらのプロトコルは、メールの送受信において異なる役割を果たしており、選択する際にはセキュリティと効率を考慮する必要があります1234.
Explicit TLS(明示的TLS)は、通信開始時は暗号化せずに通常のプレーンテキストの通信を行い、その後でTLS(Transport Layer Security)に切り替える方式です12. 以下に詳細を説明します。
- SMTP (Simple Mail Transfer Protocol) における Explicit TLS:
- 通信開始時は平文で通信を始めます。
- クライアントがサーバーに対して「STARTTLS」コマンドを実行することで、途中から通信内容を暗号化します。
- この方式では、平文で始まってから暗号へ切り替わるため、レイテンシーが大きくなります。
- 通信先のサーバーがSTARTTLSに対応しているかどうかを確認し、対応している場合のみ暗号化を行います。
- FTP (File Transfer Protocol) における Explicit TLS:
- FTPの通信を暗号化するために使用されます。
- 通信開始時は平文で通信を始め、クライアントが「AUTH」コマンドを実行して途中から通信内容を暗号化します。
要するに、Explicit TLSは最初は平文で通信を行い、その後で暗号化に切り替える方式です。ただし、相手がTLS通信に対応していない場合には平文での通信が継続されることに注意してください12.
メールの仕組み:詳細解説
メールの仕組みは、複数の要素が連携して動作します。ここでは、メール送受信の流れを、MTA、MUA、SMTP、POP3/IMAP、DNSといったプロトコルを絡めて詳細に解説します。
1. 送信
- MUA(メールユーザーエージェント)(メールソフト、Webメールなど)でメールを作成します。
- MUAは、作成したメールを**SMTP(Simple Mail Transfer Protocol)**プロトコルを使用して、送信側のMTA(Mail Transfer Agent)(メール送信サーバー)に送信します。
- 送信側のMTAは、DNS(Domain Name System)を使用して、宛先メールアドレスのドメイン名からMXレコードを取得します。MXレコードは、宛先メールアドレスに対応する受信側のMTAのIPアドレスを指します。
- 送信側のMTAは、SMTPプロトコルを使用して、宛先メールアドレスに対応する受信側のMTAにメールを送信します。
2. 受信
- 受信側のMTAは、受信したメールをメールボックスに保存します。
- **MUA(メールユーザーエージェント)**は、**POP3(Post Office Protocol 3)またはIMAP(Internet Message Access Protocol)**プロトコルを使用して、受信側のMTAからメールボックスにアクセスします。
- MUAは、メールボックスからメールをダウンロードして、ユーザーに表示します。
3. プロトコルの役割
- SMTP: メール送信に使用されるプロトコル。送信側のMTAと受信側のMTA間でメールを転送します。
- POP3: 受信側のMTAからメールボックスにメールをダウンロードするために使用されるプロトコル。
- IMAP: 受信側のMTA上のメールボックスをリアルタイムで同期し、メールを閲覧・操作するために使用されるプロトコル。
- DNS: ドメイン名をIPアドレスに変換するために使用されるプロトコル。
4. その他の要素
- メールサーバー: MTAとMUAをまとめて指す呼称。
- メールアドレス: メールを送受信するために使用する識別子。
- ドメイン名: メールアドレスの後半部分。
- メールボックス: メールを保存する場所。
5. セキュリティ
メールは、インターネット上で送信されるため、セキュリティ対策が重要です。
- TLS/SSL: 通信内容を暗号化することで、盗聴や改ざんを防ぐ。
- SPF: 送信側のMTAが正当なものであることを検証する。
- DKIM: 送信者ドメインの偽装を防ぐ。
- DMARC: SPFとDKIMの結果に基づいて、メールの受信可否を判断する。
6. まとめ
メールは、MTA、MUA、SMTP、POP3/IMAP、DNSといった要素が連携して動作することで、送受信されています。これらの要素とプロトコルの役割を理解することで、メールの仕組みをより深く理解することができます。
参考資料
- 電子メールの仕組み|国民のためのサイバーセキュリティサイト – 総務省: https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/basic/basic_service_04.html
- メール送受信の仕組みについて解説!SMTP、POP、IMAP、DNSなどの用語を理解しよう!: https://blastmail.jp/blog/mail-delivery/send-and-receive-mail
- メールサーバーとは?初心者向けに仕組みや役割を徹底解説: https://business.ntt-east.co.jp/content/cloudsolution/column-220.html
メールの仕組みはメールサーバの用語集、初心者がメールサーバの誤解を解いた話が分かりやすいです。
docker-mailserverの主要な本体はPostfixとDovecotで
MTA、MDAはPostfix、MRAはDovecot、MUAがWindows11のメールアプリということだと思います。
SMTPとESMTPは送信用
IMPA4は受信
Implicit TLSは最初からTLS(暗号化)
Explicit TLSは途中からTLS(暗号化、STARTTLSというのも関連ワード)
ということらしい。
受信はWindows11のメールで受信できることで確認できるはず。
多分143はSSL化できてなくても受信できて993はSSL化できてないと通信できなそう。
TLS(SSL化)できているかの確認したいので最初からTLSの993(Implicit TLS)を使う。
送信は不特定多数のMTA間で使われるので一概には決められないのではないかと思った。
でも25は今現在、Nmapで見て閉じているので閉じる。
しかし、25閉じるとダメだったNmapで見るのと開放状態は違うのか?
Nmapできたらブロックされてるのかも。
またmailserver.envにRELAY_PORT=25というのがあるので多分25番は使っているのだろう。
よって開放するのは993、587、465、25にした。
sudo docker-compose up -d
993、587、465、25のセキュリティグループを新たに作って適用
Windows11のメールでアカウントを削除して、もう1回作って
いつも使っているメールアドレスに送受信してみてokだった。
143は閉じた状態で受信できているのでTLS対応はできていそう。
SLLの確認目的で閉じただけで別に開放してもいい気はする。
目次へ
所感
取り合えず送受信できた。
ClamAV(アンチウイルスソフト)などデフォルトでoffになっているので
デフォルト状態では軽いが、これらをonにするとメモリ不足で固まった。
基本的にメールは使わないのでメモリを多量に使うものはoffにしておいて
ポートも全部クローズして使うときだけ開けようと思います。
メールの仕組みのところで生成AIの回答を多用しましたが、
私、以上に信用できないので生成AIの回答は、疑ってみたほうがいいと思います。
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
コメント