メールサーバーのドメイン移行

この manimani.cc ドメインを取得する前にも別のドメインでメールサーバーを運用していたんですが、スムーズに旧ドメインを廃止して新ドメインに移行するにはどうしたらよいか……という記事です。

うちの環境は 100% 自己満足でやりたい放題するための環境なので、基本的にユーザーは自分しかいませんw なのでワリと思い切りよく作業できるのですが、それでもいくつか旧ドメインのメールアドレスに紐付けて登録したアカウント等もあるので、そこら辺もスムーズに移行できるようにします。

できれば達成したい要件は1つだけですね。

  1. 新旧どちらのドメインも両方受信できる期間を設ける

これは先に書いたとおり、旧ドメインのメールアドレスに紐付けて登録したアカウントの移行をスムーズにするためです。メールアドレスの変更って、変更元アドレスには……

メールアドレスが変更されました。心当たりがない場合はヤバいです。

……みたいなメールが来ると同時に、変更先アドレスには……

メールアドレスを変更します。以下の URL にアクセスして変更を承認してください。

……とか来ることが予想されるからです1)

他に imap や smtps(submission) も移行する必要がありますが、これらに関しては自分から能動的に接続しない限り発生しない2)ので、並行稼働させておく必要もないため、一撃パッツン切り替えでよしとしました。

とりあえず tcp:25 の設定に集中して、新旧ドメインのローカル配送だけはできるようにします。

nginx メールプロキシの設定(tcp:25 ローカル配送)

今回は IP 変更しないので、ここは変更なしです。もともとフロントで可否判断はしていないので、来たものはとりあえずバックエンドの postfix に投げてしまいます。

stream {
    server {
        listen                          ip.addr.for.smtp:25;
        proxy_pass                      upstream_smtp;
        proxy_protocol                  on;
    }
    :

postfix の設定

myhostname mydomain あたりは完全に新ドメインに切り替え。基本は新ドメイン用の postfix として動作させます。

virtual_mailbox_maps の設定

/path/to/vmailbox に新ドメインのアドレスを追記します(最終的に virtual_alias_maps で新ドメインのメールボックスに配送してしまう宛先に関しては、旧ドメインの定義を削除してしまっても大丈夫でした)。

hoge@<新ドメイン> <新ドメイン>/hoge/Maildir/
hoge@<旧ドメイン> <旧ドメイン>/hoge/Maildir/

反映させます。

# postmap /path/to/vmailbox

virtual_alias_maps の設定

旧ドメイン宛のメールが全て新ドメインのメールボックスに届くように、うまいこと /path/to/valiases に追記します。

hoge@<旧ドメイン> hoge@<新ドメイン>

ほんで反映。

# postmap /path/to/valiases

virtual_mailbox_domains の設定

virtual_alias_maps の設定が優先されるような記事もあったので、ためしにこれやらずに別のアカウントからメール送ってみたら Relay access denied でメール弾き返してしまいましたw うちの環境では mydestination とか一切設定してないからですかね? もともと設定されていた $mydomain は新ドメインに変更しているため、カンマで区切って旧ドメインを追加します。

virtual_mailbox_domains = $mydomain, <旧ドメイン>

結果

とりあえず新旧どちらのドメインに送ったメールも、新ドメインのメールボックスに配送されるようになりました。

ちなみに、旧ドメインの Maildir をそのままコピーしただけでもちゃんと内容を引き継いでくれるようです……恐ろしくいいかげん柔軟で融通の利くメールボックス形式ですね Maildir って。

# cp -rp /path/to/vhosts/<旧ドメイン> /path/to/vhosts/<新ドメイン>

この状態で、旧ドメインのメールアドレスに紐付けている各種アカウントの登録メールアドレスを、新ドメインのメールアドレスに変更します。ただし、今回試したアカウント以外に別のアクティベーション方法をとっているシステムもあると思います。もしかしたら新メールアドレスからの返信が必要だったり……とかあるかもしれません。そういう場合は、この時点で後述の submission なり smtps なりの設定を完了している必要があるので、そうすると smtp auth も通らなきゃいけないので…… sasl認証 を dovecot に任せている場合は、結局 imap の設定もしなきゃですね。

うちの環境では postfix の smtp auth を dovecot に任せているので、submission(smtps) の設定をする前に dovecot の設定をやってしまいます。

nginx の設定

うちの環境では nginx が ssl終端になって proxy しているので、サーバー証明書を新ドメイン用のサーバー証明書に切り替える必要があります。

stream {
    server {
        listen                          ip.addr.for.imaps:465 ssl
        proxy_pass                      upstream_imap;
        proxy_protocol                  on;

        ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate                 /path/to/fullchain.pem; # 新サーバー証明書
        ssl_certificate_key             /path/to/privkey.pem;   # 新サーバー秘密鍵
        :
    }
}

サーバー証明書は別途で作成しておきます。ほんで設定を反映させます。

# nginx -t
# systemctl restart nginx

imap (tcp:143) の設定

ssl終端は nginx なので、バックエンドの dovecot はただの imap で受け付けてます。

dovecot の設定

dovecot の設定自体はドメインをさほど意識していない(うちの環境では通信関係は IPアドレスで指定している)ので、そもそもちゃんと動いていた dovecot を新ドメインに移行するだけなら、変更箇所は dovecot.conf3)のみです。

auth_default_realm = <新ドメイン>

ほんで反映。

# systemctl restart dovecot

dovecot.passwd の設定

dovecot 本体の設定よりも、こっちの方が重要かもですね。 dovecot の認証機能は、たいていの場合は postfix からも sasl で参照されているので。

# doveadm pw -s cram-md5 -u hoge@<新ドメイン>

……でパスワードを作って、書式に従って dovecot のパスワードDB に追加します。ワンライナーでやるなら……

# echo "hoge@<新ドメイン>:$(doveadm pw -s cram-md5 -u hoge@<新ドメイン>)" >> /path/to/dovecot.passwd

……ですかね。

いわゆる submission port の SSL版ですね。

nginx の設定

まず nginx ですが、ここも imaps と同じく、サーバー証明書を新ドメイン用のものに置き換えるだけです。

stream {
    server {
        listen                          ip.addr.for.smtps:465 ssl
        proxy_pass                      upstream_smtps;
        proxy_protocol                  on;

        ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate                 /path/to/fullchain.pem; # 新サーバー証明書
        ssl_certificate_key             /path/to/privkey.pem;   # 新サーバー秘密鍵
        :
    }
}

サーバー証明書は別途で作成しておきます。ほんで、設定が完了したら反映させます。

# nginx -t
# systemctl restart nginx

postfix(smtp/submission tcp:587) の設定

アウトバウンドの smtp に関しては、うちの環境はちょっと特殊なので……完全に俺環用の手順です。

vlan2 に置いてある postfix に関しては、smtp の設定 で mydomain やらを変更しているので特にやることはありません。変更は vlan1 に置いてあるアウトバウンドリレー用の postfix です。この postfix の名前を変えてあげます。

myhostname = <新ドメインホスト名>
mydomain = <新ドメイン>

ほんで、反映させます。

# systemctl restart postfix

ここまでで、メール関連の全ての機能が新ドメインに移行しているはずです。基本的にもともとちゃんと動いている環境からの移行なので、変更箇所自体はそんなに多くないですね。

あとは旧ドメインのメールアドレス宛に届くメールがもう存在しないことを確認して、valiases と vmailbox の旧ドメインのメールアドレス用の設定を削除するだけです。

1)
実際にやってみた結果、ゲームメーカーのアカウント2種、twitterアカウント、googleアカウントのいずれも予想どおりの結果になりました。ただしアクティベーション用の URL はいずれも変更後アドレスに送られてきたので、その時点で変更前アドレスが不達になっていても大丈夫なのかもしれません。
2)
ユーザーは自分1人なので……
3)
gentoo の場合は /etc/dovecot/conf.d/10-auth.conf
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:manimani.cc:mail_servers