この manimani.cc ドメインを取得する前にも別のドメインでメールサーバーを運用していたんですが、スムーズに旧ドメインを廃止して新ドメインに移行するにはどうしたらよいか……という記事です。
うちの環境は 100% 自己満足でやりたい放題するための環境なので、基本的にユーザーは自分しかいませんw なのでワリと思い切りよく作業できるのですが、それでもいくつか旧ドメインのメールアドレスに紐付けて登録したアカウント等もあるので、そこら辺もスムーズに移行できるようにします。
できれば達成したい要件は1つだけですね。
これは先に書いたとおり、旧ドメインのメールアドレスに紐付けて登録したアカウントの移行をスムーズにするためです。メールアドレスの変更って、変更元アドレスには……
メールアドレスが変更されました。心当たりがない場合はヤバいです。
……みたいなメールが来ると同時に、変更先アドレスには……
メールアドレスを変更します。以下の URL にアクセスして変更を承認してください。
……とか来ることが予想されるからです1)。
他に imap や smtps(submission) も移行する必要がありますが、これらに関しては自分から能動的に接続しない限り発生しない2)ので、並行稼働させておく必要もないため、一撃パッツン切り替えでよしとしました。
とりあえず tcp:25 の設定に集中して、新旧ドメインのローカル配送だけはできるようにします。
今回は IP 変更しないので、ここは変更なしです。もともとフロントで可否判断はしていないので、来たものはとりあえずバックエンドの postfix に投げてしまいます。
stream { server { listen ip.addr.for.smtp:25; proxy_pass upstream_smtp; proxy_protocol on; } :
myhostname
mydomain
あたりは完全に新ドメインに切り替え。基本は新ドメイン用の postfix として動作させます。
/path/to/vmailbox に新ドメインのアドレスを追記します(最終的に virtual_alias_maps
で新ドメインのメールボックスに配送してしまう宛先に関しては、旧ドメインの定義を削除してしまっても大丈夫でした)。
hoge@<新ドメイン> <新ドメイン>/hoge/Maildir/ hoge@<旧ドメイン> <旧ドメイン>/hoge/Maildir/
反映させます。
# postmap /path/to/vmailbox
旧ドメイン宛のメールが全て新ドメインのメールボックスに届くように、うまいこと /path/to/valiases に追記します。
hoge@<旧ドメイン> hoge@<新ドメイン>
ほんで反映。
# postmap /path/to/valiases
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 が 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
ssl終端は nginx なので、バックエンドの dovecot はただの imap で受け付けてます。
dovecot の設定自体はドメインをさほど意識していない(うちの環境では通信関係は IPアドレスで指定している)ので、そもそもちゃんと動いていた dovecot を新ドメインに移行するだけなら、変更箇所は dovecot.conf3)のみです。
auth_default_realm = <新ドメイン>
ほんで反映。
# systemctl restart dovecot
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 ですが、ここも 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
アウトバウンドの smtp に関しては、うちの環境はちょっと特殊なので……完全に俺環用の手順です。
vlan2 に置いてある postfix に関しては、smtp の設定 で mydomain やらを変更しているので特にやることはありません。変更は vlan1 に置いてあるアウトバウンドリレー用の postfix です。この postfix の名前を変えてあげます。
myhostname = <新ドメインホスト名> mydomain = <新ドメイン>
ほんで、反映させます。
# systemctl restart postfix
ここまでで、メール関連の全ての機能が新ドメインに移行しているはずです。基本的にもともとちゃんと動いている環境からの移行なので、変更箇所自体はそんなに多くないですね。
あとは旧ドメインのメールアドレス宛に届くメールがもう存在しないことを確認して、valiases と vmailbox の旧ドメインのメールアドレス用の設定を削除するだけです。