banner
Moraxyc

Moraxyc's Rhapsody

Passion Forever! 永远热爱!
twitter
telegram
github
medium
discord server

自分で軽量メールサーバーを構築する?まずは伝送原理を理解しよう!

電子メール

メール伝送原理#

Mermaid Loading...

注:

  • 灰色部分は相手のサーバーを示します
  • 参考用です。誤りがあればコメント欄で議論してください!

基本定義#

  • MUA(Mail User Agent)はメールユーザーエージェントで、ユーザーがメールを送受信するために使用するソフトウェアです。MUA は IMAP または POP3 プロトコルを使用して MRA と通信します。
  • MTA(Mail Transfer Agent)はメール転送エージェントで、メールサーバー上のソフトウェアで、SMTP プロトコルを通じてメールを送信および転送する役割を担います。MTA は受信者アドレスのドメインに基づいて対応するメールサーバーを照会し、メールを配信します。
  • MDA(Mail Delivery Agent)はメール配信エージェントで、MTA が受信したメールをローカルディスクまたは指定された場所に保存するソフトウェアです。MDA は通常、スパムメールやウイルススキャンを行い、メールフィルタリングや自動返信などの機能を提供します。
  • MRA(Mail Receive Agent)はメール受信エージェントで、IMAP および POP3 プロトコルを実装し、MUA と対話します。MRA はユーザーがメールサーバーからメールをダウンロードまたは表示するのを助けます。
  • SMTP(Simple Mail Transfer Protocol)は電子メールの送信に使用される標準プロトコルです。インターネット上で電子メールを送信および配信する方法を定義します。SMTP はクライアント / サーバープロトコルで、TCP をトランスポート層プロトコルとして使用し、デフォルトポートは 25、ESMTP は 465/587 ポートを使用します。
  • IMAP(Internet Message Access Protocol)は電子メールの保存およびアクセスに使用される標準プロトコルです。IMAP プロトコルは通常 143/993 ポートを使用します。
  • POP3(Post Office Protocol version 3)は電子メールのダウンロードに使用される標準プロトコルで、ユーザーがメールクライアントを通じてメールサーバーからメールをローカルコンピュータにダウンロードできるようにします。110 ポートを使用して送信され、SMTP プロトコルと組み合わせて使用されます。POP3 プロトコルはダウンロードに重点を置いており、サーバー上でのメール管理をサポートしていません。

一般的な MUA には:Outlook、Apple Mail、Mutt、Fairemail

一般的な MTA には:Sendmail、Postfix

一般的な MDA には:procmail、dropmail、Cyrus

一般的な MRA には:dovecot、Fetchmail、Getmail

伝送プロセス#

メール伝送のプロセスは以下のステップに分けられます:

このプロセスでは「小明」 <[email protected]>が「小紅」 <[email protected]>に送信するシミュレーションを行います。

1. 送信#

小明は MUA を通じてメールを作成し、[email protected]を指定して送信ボタンをクリックします。MUA は SMTP (s) を使用してメールをsmtp.qq.com25/465/587ポートに送信します。

2. 配信#

smtp.qq.comは送信元アドレスがそのアカウントに属しているかを確認し、属している場合は配信を続行します。smtp.qq.comは DNS を使用して[email protected]に対応するドメインの MX レコードを照会します1。照会が成功すると、メールはgmail-smtp-in.l.google.comに転送されます。

3. 受信#

このプロセスは最も複雑です。メール送信には身元確認のメカニズムがないため、スパムやフィッシング、偽装詐欺メールの配信を防ぐために、受信側の MTA はメールの信頼性を確保するためにさまざまなチェックを行います。MDA も MTA が受信を確認した後にウイルススキャンなどの処理を行います。チェックに合格しなかった場合、重い場合は直接返送され、軽い場合はスパムフォルダに振り分けられます。

メールを受信する際、Gmail は DKIM/SPF/DMARC などのレコードおよび PTR レコードを確認し、メールの送信者が実在し、信頼できるものであり、メールが改ざんされていないことを確認します。

DNSSEC
その後のチェックは基本的に DNS システムに基づいているため、
ドメイン名は DNSSEC をサポートする必要があります。

具体的には、受信側の MTA はメールを受信する際に以下のプロセスで検証を行います:

  1. DKIM 検証:メールに署名された DKIM ヘッダーが含まれているかを確認します。含まれている場合、Gmail は公開鍵を使用してメッセージを検証し、そのメールが対応するドメインの秘密鍵で署名されたものであることを確認し、メールが改ざんされていないことを防ぎます。
  2. SPF 検証:メールの送信サーバーが送信ドメインの SPF レコードにリストされているかを確認します。リストされていない場合、そのメールは偽造されたスパムまたはフィッシングメールであると見なされます。
  3. DMARC 検証:メールが送信ドメインの DMARC ポリシーに準拠しているかを確認します。DMARC は、DKIM または SPF 検証に合格しなかったメールの処理方法を指定できます。たとえば、これらのメールをスパムとしてマークするか、配信を拒否するよう要求できます。
  4. PTR 検証:メールが送信された IP アドレスが送信メールのドメインの PTR レコードと一致するかを確認します。PTR レコードは通常、逆引き DNS 照会に使用され、メール送信者の身元を確認するために使用されます。

これらの検証を通じて、受信側の MTA はメールが信頼できる送信者からのものであるかを判断し、スパムメールや詐欺を効果的に防止できます。

4. 保存#

gmail-smtp-in.l.google.comがメールを受信したことを確認した後、MDA が処理を行います。たとえば、スキャンや自動返信などです。その後、[email protected]のメールボックスに保存されます。

5. 確認#

小紅が Push をサポートする MUA(たとえば Gmail クライアント)を使用している場合、今すぐメール通知を受け取っているはずで、開くと小明からのメールを見ることができます。

小明小紅という名前を使ってごめんなさい、私は名前を付けるのが苦手です

自建メールサーバー#

一般的に、現在自建メールサーバーを構築する場合、グラフィカルインターフェースやその他の追加機能が不要であれば、基本的な送信、受信、スパムメールのブロックだけで十分であり、過度に複雑なメールサーバー完全解決策を使用する必要はありません。たとえば、iRedmail などです。

この部分では、docker-mailserverを例にしてメールサーバーを構築します。これはpostfixdovecotSpamAssianOpenDKIMOpenDMARCFail2Banなどのサービスを含み、簡単に設定されており、すぐに使用できる状態になっています。基本的に 30 分ほどで機能的なメールサーバーを構築できます。

docker-mailserver#

サーバーの準備#

いくつかの条件を満たす必要があります。

  • IP アドレスとサーバーのドメイン名がブラックリストに載っていないこと(MX Super Toolでブラックリストを確認できます)
  • 25 ポートを開放すること
  • rDNS/PTR レコードを設定可能(オプション、できるだけ)
  • クリーンなシステムで、インストール時に hostname をメールサーバーのドメイン名(例:mail.example.org)に設定すること

もし docker-mailserver を使ってシンプルなメールサーバーを構成するだけで、使用人数が少ない場合は、設定はそれほど高くなく、1c 512m で十分です。

もちろん、docker および docker-compose をインストールする必要があります。

設定#

メールサーバーがサブドメインの下に設定される場合(例:mail.example.org)、hostnameをサブドメインに設定し、domainnameをアペックスドメイン2に設定すればよいです。

ここでは送信ドメインを入力するのではありません
ここではメールサーバーの所在ドメインを設定するだけです。たとえば、mail.example.orgに設定すると、後のセクションでの送信ドメインの MX レコードはそれを指します。

もしアペックスドメインを直接使用する場合は、hostnameexample.orgに設定し、domainnameを削除します。

version: '3.3'
services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest
    container_name: mailserver
    hostname: mail
    domainname: example.org
    env_file: mailserver.env
    environment:
      - SSL_TYPE=letsencrypt
    ports:
      - "25:25"    # SMTP  (明示的TLS => STARTTLS)
      - "143:143"  # IMAP4 (明示的TLS => STARTTLS)
      - "465:465"  # ESMTP (暗黙的TLS)
      - "587:587"  # ESMTP (明示的TLS => STARTTLS)
      - "993:993"  # IMAP4 (暗黙的TLS)
    volumes:
      - ./docker-data/dms/mail-data/:/var/mail/
      - ./docker-data/dms/mail-state/:/var/mail-state/
      - ./docker-data/dms/mail-logs/:/var/log/mail/
      - ./docker-data/dms/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
      - /etc/letsencrypt:/etc/letsencrypt
    restart: always
    stop_grace_period: 1m
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
      timeout: 3s
      retries: 0

環境変数#

以下は私が使用している環境変数です。使用前にすべてのexample.orgプレースホルダーを自分の設定する主送信ドメインに変更してください。

他にもいくつかのオプションが設定可能です。関連する環境変数の意味についてはドキュメントを参照してください。

証明書を取得するために certbot を使用することを強くお勧めします!前のセクションのdocker-compose.ymlは certbot と letsencrypt に対応するように設定されているため、コンテナ外で certbot を使用してメールサーバーのドメインの SSL 証明書を取得するだけで使用できます。

SSL の設定方法についてはドキュメントを参照してください。

OVERRIDE_HOSTNAME=
DMS_DEBUG=0
LOG_LEVEL=info
SUPERVISOR_LOGLEVEL=info
ONE_DIR=1
ACCOUNT_PROVISIONER=
[email protected]
ENABLE_UPDATE_CHECK=1
UPDATE_CHECK_INTERVAL=1d
PERMIT_DOCKER=none
TZ=Asia/Shanghai
NETWORK_INTERFACE=
TLS_LEVEL=
SPOOF_PROTECTION=1
ENABLE_SRS=0
ENABLE_OPENDKIM=1
ENABLE_OPENDMARC=1
ENABLE_POP3=
ENABLE_CLAMAV=0
ENABLE_RSPAMD=1
ENABLE_RSPAMD_REDIS=
ENABLE_AMAVIS=1
AMAVIS_LOGLEVEL=1
ENABLE_DNSBL=1
ENABLE_FAIL2BAN=1
FAIL2BAN_BLOCKTYPE=drop
ENABLE_MANAGESIEVE=
POSTSCREEN_ACTION=enforce
SMTP_ONLY=
SSL_TYPE=
SSL_CERT_PATH=
SSL_KEY_PATH=
SSL_ALT_CERT_PATH=
SSL_ALT_KEY_PATH=
VIRUSMAILS_DELETE_DELAY=
POSTFIX_DAGENT=
POSTFIX_MAILBOX_SIZE_LIMIT=
ENABLE_QUOTAS=1
POSTFIX_MESSAGE_SIZE_LIMIT=
CLAMAV_MESSAGE_SIZE_LIMIT=
PFLOGSUMM_TRIGGER=
PFLOGSUMM_RECIPIENT=
PFLOGSUMM_SENDER=
LOGWATCH_INTERVAL=weekly
LOGWATCH_RECIPIENT=
LOGWATCH_SENDER=
[email protected]
REPORT_SENDER=
LOGROTATE_INTERVAL=weekly
POSTFIX_INET_PROTOCOLS=all
DOVECOT_INET_PROTOCOLS=all
ENABLE_SPAMASSASSIN=1
SPAMASSASSIN_SPAM_TO_INBOX=1
ENABLE_SPAMASSASSIN_KAM=1
MOVE_SPAM_TO_JUNK=1
SA_TAG=-100000.0
SA_TAG2=5.0
SA_KILL=15.0
SA_SPAM_SUBJECT=***SPAM*****
ENABLE_FETCHMAIL=0
FETCHMAIL_POLL=300
ENABLE_LDAP=
LDAP_START_TLS=
LDAP_SERVER_HOST=
LDAP_SEARCH_BASE=
LDAP_BIND_DN=
LDAP_BIND_PW=
LDAP_QUERY_FILTER_USER=
LDAP_QUERY_FILTER_GROUP=
LDAP_QUERY_FILTER_ALIAS=
LDAP_QUERY_FILTER_DOMAIN=
DOVECOT_TLS=
DOVECOT_USER_FILTER=
DOVECOT_PASS_FILTER=
DOVECOT_MAILBOX_FORMAT=maildir
DOVECOT_AUTH_BIND=
ENABLE_POSTGREY=0
POSTGREY_DELAY=300
POSTGREY_MAX_AGE=35
POSTGREY_TEXT="Delayed by Postgrey"
POSTGREY_AUTO_WHITELIST_CLIENTS=5
ENABLE_SASLAUTHD=0
SASLAUTHD_MECHANISMS=
SASLAUTHD_MECH_OPTIONS=
SASLAUTHD_LDAP_SERVER=
SASLAUTHD_LDAP_BIND_DN=
SASLAUTHD_LDAP_PASSWORD=
SASLAUTHD_LDAP_SEARCH_BASE=
SASLAUTHD_LDAP_FILTER=
SASLAUTHD_LDAP_START_TLS=
SASLAUTHD_LDAP_TLS_CHECK_PEER=
SASLAUTHD_LDAP_TLS_CACERT_FILE=
SASLAUTHD_LDAP_TLS_CACERT_DIR=
SASLAUTHD_LDAP_PASSWORD_ATTR=
SASLAUTHD_LDAP_AUTH_METHOD=
SASLAUTHD_LDAP_MECH=
SRS_SENDER_CLASSES=envelope_sender
SRS_EXCLUDE_DOMAINS=
SRS_SECRET=
DEFAULT_RELAY_HOST=
RELAY_HOST=
RELAY_PORT=25
RELAY_USER=
RELAY_PASSWORD=

起動&ログ確認#

起動

docker-compose up -d

リアルタイムログを確認

docker-compose logs -f

管理#

あなたの最良の友人!Setup.sh!

wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/setup.sh
chmod a+x ./setup.sh

setup.shをダウンロードした後、直接実行してヘルプ情報を取得できます。

docker-mailserverは仮想ドメインを使用しているため、関連アカウントを追加した後にのみ、任意のドメインの設定が生成されます。

たとえば、./setup.sh email add [email protected] "<password>"を使用すると、example.orgの設定と保存場所が生成されます。

ログイン#

任意の MUA を選択:

IMAP:
    host: mail.example.org
    port: 993
    encryption: tls
    username: [email protected]
    password: <password>
SMTP:
    host: mail.example.org
    port: 465
    encryption: tls
    username: [email protected]
    password: <password>

このようにパラメータを入力してログインできます。

DNS レコードの設定#

次に、ドメインサービスプロバイダーに移動してください。ここでは、メールサーバーのドメインがmail.example.orgに設定されており、A レコードがサーバーを指していると仮定します。送信ドメインはexample.orgです。

ドメイン名が DNSSEC を適切に設定されていることを確認してください。

MX#

このレコードは、ドメインがメールを処理するサーバーを宣言するために使用されます。

タイプ名称内容優先度TTL
MX@mail.example.org101 時間

SPF#

SPF(Sender Policy Framework)はメールの偽造を防ぐために使用され、どの IP アドレスがそのドメインを代表して電子メールを送信する権限があるかを指定できます。

SPF レコードの構文は次のとおりです:

v=spf1 a mx ip4:192.0.2.0/24 ip6:2001:0db8::/32 include:example.org ~all
  • a:このドメインの A レコードが指す IP アドレスがそのドメインを代表してメールを送信することを許可します。
  • mx:このドメインの MX レコードが指す IP アドレスがそのドメインを代表してメールを送信することを許可します。
  • ip4/ip6:そのネットワークセグメントの IP がメールを送信することを許可します。
  • include.com:example.com ドメインの SPF レコードに含まれる IP アドレスもそのドメインを代表して電子メールを送信できます。
  • ~all:上記のメカニズム以外のすべての IP アドレスがそのドメインを代表して電子メールを送信しようとできますが、スパムとしてマークされます。ここを-allに変更すると、前に許可されたアドレス以外はそのドメインを代表してメールを送信できなくなります。-allの使用をお勧めします。

次のように設定することをお勧めします:

タイプ名称内容TTL
TXT@v=spf1 mx -all1 時間

DMARC#

DMARC(Domain-based Message Authentication, Reporting & Conformance)は SPF と DKIM に基づいており、メール受信者が送信者の身元を検証し、ドメイン所有者に送信者の認証結果に関するレポートを提供することができます。

メール受信者が電子メールを受信すると、SPF と DKIM 技術を使用して送信者の身元を検証します。送信者の電子メールアドレスが SPF レコードおよび DKIM 署名と一致する場合、そのメールは合法と見なされます。そうでない場合、そのメールはスパムまたは詐欺メールの可能性があります。ドメイン所有者が DMARC を有効にしている場合、メール受信者は検証結果をドメイン所有者に報告します。

DMARC レコードの構文は次のとおりです:

v=DMARC1; p=quarantine; sp=none; rua=mailto:[email protected]; ruf=mailto:[email protected];
  • p: メールの処理方法を指定します。値は 3 つあり、none は報告のみで何も行わない、quarantine はメールを受信者のスパムフォルダに入れる、reject はメールを直接拒否します。
  • sp: サブドメインの処理方法を指定します。値は p と同じです。
  • rua: メール認証レポートを受信するアドレスを指定します。複数のメールアドレスをカンマで区切って指定できます。
  • ruf: メール処理レポートの受信アドレスを指定します。他は同様です。

次のように設定することをお勧めします:

タイプ名称内容TTL
TXT_dmarcv=DMARC1; p=quarantine; sp=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected];1 時間

DKIM#

まず、./setup.sh config dkim domain "<domain>"を使用して送信ドメインの DKIM 公開鍵 / 秘密鍵を生成します。

次に、docker-data/dms/config/opendkim/keys/<domain>/<selector>.txtを確認すると、DNS に公開する必要がある DKIM 公開鍵が見つかります。形式は<selector>._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; " "p=xxxxxxx" "xxxxxxx" "xxxxxxx" ) ; ----- DKIM key mail for example.orgです。

使用時には引用符と空白を取り除き、引用符内の内容を DNS に公開します。以下のようにします:

タイプ名称内容TTL
TXT<selector>._domainkeyv=DKIM1; h=sha256; k=rsa; p=xxxxxxxxxxxxxxxxxxxxx1 時間

高度な:複数ドメインの使用#

仮想ドメインを使用しているため、docker-mailserverには主ドメインの概念がなく、関連アカウントが追加された任意のドメインがメール送信に使用できます。そのため、偽装メールを送信して返送され、ドメイン / IP がブラックリストに載るのを防ぐために、アカウントの追加には注意が必要です。

上記のようにexample.orgが設定されている場合、2 つ目のtest.comを追加するにはどうすればよいでしょうか?

「setup.sh を使用してアカウントを追加する」このステップから、送信ドメインを追加する準備ができた 2 つ目のドメインに全て変更し、プロセスを再度実行すれば、正常に送信 / 受信できるようになります。

複数のドメインも同様です。

最適化#

PTR/rDNS#

PTR レコードは IP アドレスとドメイン名の間のマッピング関係を提供します。

メール伝送プロセス中、メールサーバーは IP アドレスに基づいてメール送信者のドメイン名を特定します。メールサーバーが未知の IP アドレスからのメールを受信した場合、その IP アドレスに対応するドメイン名を PTR レコードを使用して検索しようとします。検索が成功し、そのドメイン名がメールの送信者のドメイン名と一致する場合、そのメールは合法と見なされます。

たとえば、iCloud Mail のある MX サーバーの IP アドレスが17.42.251.62であれば、dig -x 17.42.251.62を実行することで、その IP が指すドメインを逆引きできます。

追加:ブラックリスト / ホワイトリスト解除#

DNSWLは良い IP アドレスライブラリで、ドメインと一致する IP をホワイトリストとして認証できます。

SpamHausもブラックリストを確認するために使用でき、自助申請を提供しています。

チェック#

Mail Testerを使用すると、スコアを非常に簡単に確認でき、10 点を取得すれば基本的にスパムフォルダに入ることはありません。

得意げに

Footnotes#

  1. このレコードは、大規模なメールサービスプロバイダーにとっては、一般的に複数の MTA が存在し、これは優先度が最も高いものです。たとえば、dig MX gmail.comを使用すると、gmail には 5 つの MX レコードalt4.gmail-smtp-in.l.google.com,gmail-smtp-in.l.google.com,alt3.gmail-smtp-in.l.google.com,alt2.gmail-smtp-in.l.google.com,alt1.gmail-smtp-in.l.google.comがあることがわかります。

  2. アペックスドメインは、ドメイン名の最高レベルを指し、サブドメインを含みません。たとえば、www.example.orgドメインでは、example.orgがアペックスドメインです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。