MENU
カテゴリー
アーカイブ

Postfix でマルチドメイン(SNI)

Mastodon 用に急いでメールサーバーを用意したけど、まともにメモを残していなかったから改めて整理しておこう。

目次

準備

このあたりは自鯖環境によってマチマチなので必要に応じてということで。

メールの送受信は LAN 外から普通にできるように Wi-Fi ルーターで port 587 と port 993 をメールサーバーに向けておく(port 25 だけは Proxmox Mail Gateway に)。

MyDNS の DOMAIN INFO から MX レコードを追加しておく。mail.ex1.mydns.jp や smtp.ex2.mydns.jp のように、運用する各ドメインごとに設定すること。spf レコードは表示されていないけど自動で設定してくれる。

v=spf1 +ip4:123.123.123.123 a:auth.gate-on.net a mx -all
※IPアドレスは適当。

あと、Let's Encrypt の証明書を取得・更新するため、reverse proxy で port 80 がメールサーバーに到達するように設定しておく。httpd は動作していなくてもOK。

仮想マシンの準備

今回は CT ではなく、普通に VM(Ubuntu 22.04.1)にしてみた。

初期設定

とりあえず qemu-guest-agent のインストールと日本語 locale の設定。

$ sudo apt install qemu-guest-agent
$ sudo apt install -y language-pack-ja
$ sudo localectl set-locale 'LANG=ja_JP.utf8'
$ sudo apt install -y manpages-ja manpages-ja-dev
$ sudo timedatectl set-timezone Asia/Tokyo

Let's Encrypt

続いて certbot をインストール。

$ sudo apt install certbot

証明書の取得は自動更新がされるよう、運用する mail.jisaba.life などドメインごとに取得した。

$ sudo certbot certonly --standalone -d mail.jisaba.life
※運用するドメインの数だけ実行する。

Postfix のインストール

外部と送受信するメールサーバーとして設定する。ホスト名(mail)は MyDNS の設定と同じものにすること。

$ sudo apt install postfix
Postfix設定
インターネットサイト用に設定
FQDNで入力(mail.jisaba.life)

SPF の設定

次のコマンドでインストールするとユーザー追加その他諸々設定してくれる。

$ sudo apt install python3-spf-engine 
$ sudo apt install pyspf-milter

Postfix の設定(main.cf)

初期設定ファイルを編集して、取り敢えず単独のドメイン(jisaba.life)でメールの送受信ができるように設定する。マルチドメイン対応(SNI)は一通り設定が終わってから。

参考にしたのはこちらのサイト。

設定ファイルの最終行に relayhost = [192.168.1.109]:26 としているのは、送信先として Proxmox Mail Gateway を指定するため。

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.

### コメントを外す ###
myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6


smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mail.jisaba.life

### 追加 ###
mydomain = jisaba.life

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname

### $mydomainを追加 ###
mydestination = $myhostname, mail.jisaba.life, mail, localhost.localdomain, localhost, $mydomain

relayhost = 

### 変更 ###
mynetworks = 192.168.1.0/24 127.0.0.0/8

### 追加 ###
home_mailbox = Maildir/

mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

### 変更 ###
inet_protocols = ipv4

### 以下追加 ###
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net,
                            reject_rbl_client cbl.abuseat.org,
                            reject_rbl_client zen.spamhaus.org,
                            permit
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_sasl_authenticated,
                               check_relay_domains,
                               reject
debugger_command =
    PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
    ddd $daemon_directory/$process_name $process_id & sleep 5
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.jisaba.life/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.jisaba.life/privkey.pem
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1

smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes

mua_client_restrictions =
mua_helo_restrictions =
mua_sender_restrictions =

### Proxmox Mail Gateway にリレー ###
relayhost = [192.168.1.109]:26

Postfix の設定(master.cf)

Thunderbird などの送信用に port 587(送信)で待ち受ける。リレーホストとの通信は main.cf の設定どおり port 26 にする。

26      inet  n       -       y       -       -       smtpd
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

### 以下変更なし ###
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
#qmgr     unix  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
        -o syslog_name=postfix/$service_name
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
maildrop  unix  -       n       n       -       -       pipe
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

Dovecot のインストールと設定

インストール

pop は使わずに imap だけで運用する。

$ sudo apt install dovecot-imapd

設定

/etc/dovecot/conf.d/ 内のファイルを修正する。長いからコメント行なしで。

mail_location = maildir:~/Maildir
namespace inbox {
 inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}
service imap-login {
  inet_listener imap {
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
  }
  inet_listener pop3s {
  }
}
service submission-login {
  inet_listener submission {
  }
}
service lmtp {
  unix_listener lmtp {
  }
}
service imap {
}
service pop3 {
}
service submission {
}
service auth {
  unix_listener auth-userdb {
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}
service auth-worker {
}
service dict {
  unix_listener dict {
  }
}
auth_mechanisms = plain
include auth-system.conf.ext
ssl = yes
ssl_cert = </etc/letsencrypt/live/mail.jisaba.life/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.jisaba.life/privkey.pem
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = </usr/share/dovecot/dh.pem

SNI によるマルチドメイン

ここまでの設定で、普通にメールの送受信ができると思う。ここからマルチドメインで運用するために設定ファイルを修正する。

次のサイトが詳しく、ほぼ記述のとおりで大丈夫だった。

Postfix(main.cf)の変更

### 削除(コメントアウト) ###
# mydomain = jisaba.life

### $mydomainの修正 ###
mydestination = $myhostname, localhost.$mydomain, localhost

### 追加 ###
tls_server_sni_maps=hash:/etc/postfix/tls_server_sni_maps
virtual_transport = virtual
virtual_mailbox_domains = /etc/postfix/virtual_mailbox_domains
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_mailbox_base = /var/spool/virtual
virtual_alias_maps = hash:/etc/postfix/virtual_aliases
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000

関係ファイル

tls_server_sni_maps

$ sudo vi /etc/postfix/tls_server_sni_maps


jisaba.life /etc/letsencrypt/live/mail.jisaba.life/privkey.pem /etc/letsencrypt/live/mail.jisaba.life/fullchain.pem
example.com /etc/letsencrypt/live/mail.example.com/privkey.pem /etc/letsencrypt/live/mail.example.com/fullchain.pem

db 化。

$ sudo postmap -F /etc/postfix/tls_server_sni_maps

virtual_mailbox_domains

$ sudo vi /etc/postfix/virtual_mailbox_domains


jisaba.life
example.com

virtual_mailbox_maps

メールアカウントとメールボックスをマッピング。

$ sudo vi /etc/postfix/virtual_mailbox_maps


support@jisaba.life	  jisaba.life/support/Maildir/
support@example.com   example.com/support/Maildir/
info@example.com      example.com/info/Maildir/

db 化。

sudo postmap /etc/postfix/virtual_mailbox_maps

virtual_aliases

右側には外部のメールアドレス(Gmail など)の設定も可能。

$ sudo vi /etc/postfix/virtual_aliases


support@jisaba.life	support@jisaba.life
info@example.com		info@example.com

db 化。

sudo postmap /etc/postfix/virtual_aliases

Postfix を再起動して /var/log/mail.log にエラーメッセージがないことを確認。

Dovecot 設定ファイルの修正

10-auth.conf

sudo vi /etc/dovecot/conf.d/10-auth.conf


auth_mechanisms = plain login
!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
!include auth-static.conf.ext

auth-passwdfile.conf.ext

scheme の変更。

sudo vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext


passdb {
  driver = passwd-file
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}

doveadm でユーザーの暗号化パスワードを作成。

$ sudo doveadm pw
Enter new password: 
Retype new password: 
{CRYPT}$2y$05$./W9lSrjDYOMwqI9cCCkUe99Ym9PKjN2SoyjIQTjGrQZUfB3h/aaA

作成したパスワードをファイルに記述。

$ sudo vi /etc/dovecot/users


suppport@jisaba.life:{CRYPT}$2y$05$./W9lSrjDYOMwqI9cCCkUe99Ym9PKjN2SoyjIQTjGrQZUfB3h/aaA
support@example.com:{CRYPT}$2y$05$8nYUkYsRCtkCbXUrlDCEG.N9iY3Y6iaUNGZZ/O99y.3lqcjt/NOxu

auth-static.conf.ext

コメント行を編集(args = のところ)して有効化。

$ sudo vi /etc/dovecot/conf.d/auth-static.conf.ext


userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/spool/virtual/%d/%n
}

10-ssl.conf

SNI 対応として追加。

ssl_cert = </etc/letsencrypt/live/mail.jisaba.life/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.jisaba.life/privkey.pem

### 以下を追加 ###
local_name mail.jisaba.life {
    ssl_cert = </etc/letsencrypt/live/mail.jisaba.life/fullchain.pem
    ssl_key = </etc/letsencrypt/live/mail.jisaba.life/privkey.pem
}

local_name mail.example.com {
    ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
    ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
}

15-mailboxes.conf

自分の環境だと、Thunderbird でアカウントを追加した直後に「送信済みトレイ」がなかった。
以下のファイルを編集して auto = subscribe と追加、systemctl restart dovecot.service とすれば Thunderbird を再起動すると出てくる。以下の例では mailbox Sent に追加している。

##
## Mailbox definitions
##

# Each mailbox is specified in a separate mailbox section. The section name
# specifies the mailbox name. If it has spaces, you can put the name
# "in quotes". These sections can contain the following mailbox settings:
#
# auto:
#   Indicates whether the mailbox with this name is automatically created
#   implicitly when it is first accessed. The user can also be automatically
#   subscribed to the mailbox after creation. The following values are
#   defined for this setting:
# 
#     no        - Never created automatically.
#     create    - Automatically created, but no automatic subscription.
#     subscribe - Automatically created and subscribed.
#  
# special_use:
#   A space-separated list of SPECIAL-USE flags (RFC 6154) to use for the
#   mailbox. There are no validity checks, so you could specify anything
#   you want in here, but it's not a good idea to use flags other than the
#   standard ones specified in the RFC:
#
#     \All       - This (virtual) mailbox presents all messages in the
#                  user's message store.
#     \Archive   - This mailbox is used to archive messages.
#     \Drafts    - This mailbox is used to hold draft messages.
#     \Flagged   - This (virtual) mailbox presents all messages in the
#                  user's message store marked with the IMAP \Flagged flag.
#     \Important - This (virtual) mailbox presents all messages in the
#                  user's message store deemed important to user.
#     \Junk      - This mailbox is where messages deemed to be junk mail
#                  are held.
#     \Sent      - This mailbox is used to hold copies of messages that
#                  have been sent.
#     \Trash     - This mailbox is used to hold messages that have been
#                  deleted.
#
# comment:
#   Defines a default comment or note associated with the mailbox. This
#   value is accessible through the IMAP METADATA mailbox entries
#   "/shared/comment" and "/private/comment". Users with sufficient
#   privileges can override the default value for entries with a custom
#   value.

# NOTE: Assumes "namespace inbox" has been defined in 10-mail.conf.
namespace inbox {
  # These mailboxes are widely used and could perhaps be created automatically:
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Trash {
    special_use = \Trash
  }

  # For \Sent mailboxes there are two widely used names. We'll mark both of
  # them as \Sent. User typically deletes one of them if duplicates are created.
  mailbox Sent {
    special_use = \Sent
    auto = subscribe
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }

  # If you have a virtual "All messages" mailbox:
  #mailbox virtual/All {
  #  special_use = \All
  #  comment = All my messages
  #}

  # If you have a virtual "Flagged" mailbox:
  #mailbox virtual/Flagged {
  #  special_use = \Flagged
  #  comment = All my flagged messages
  #}

  # If you have a virtual "Important" mailbox:
  #mailbox virtual/Important {
  #  special_use = \Important
  #  comment = All my important messages
  #}
}

メールクライアントの設定(Thunderbird の場合)

最初のアカウントの受信サーバー、送信サーバーは以下のとおり。

2つ���のアカウント(support@example.com)の送信サーバーは、デフォルトの証明書(mail.jisaba.life)を使用してしまうため mail.jisaba.life に変更した。Gmail でも @nifty でも、確実に送信できる SMTP サーバーであれば良いと思う。

iPhone も基本的に同様の設定で、送信サーバーだけ既存の SMTP サーバーを選択する。

  • 名前 : お好みで。
  • メールアドレス : 例では support@jisaba.life を入力。
  • パスワード   : sudo doveadm pw で作ったパスワード。
  • 受信サーバー
    • プロトコル : IMAP
    • ポート番号 : 993
    • 接続の保護 : SSL/TLS
    • 認証方式  : 暗号化されたパスワード認証
    • ユーザー名 : support@jisaba.life
  • 送信サーバー
    • ホスト名  : mail.jisaba.life
    • ポート番号 : 587
    • 接続の種類 : STARTTLS
    • 認証方式  : 暗号化されたパスワード認証
    • ユーザー名 : support@jisaba.life

最後に

思ったより長いページになってしまったけど、1つの port 993 で複数ドメインに IMAP 接続できるようになった。
メールサーバーは普通に動作している限り設定変更することはあまりないから、メモを残しておかないと後々困りそう。

送信メールのなりすまし対策として SPF 以外にも DKIM や DMARC の導入が進んでいるらしいから、おいおい調べてみようかな。

自鯖環境だと限られた数のメールアカウントだから大したこと無いけれど、業務用で多くのアカウントが必要なら PostfixAdmin とかで管理するほうが良さそうだね。

コメント

コメントする

目次