文書の過去の版を表示しています。
目次
2 台の dovecot サーバでの冗長化構成(2021/05)
前提
間借りしていたメールサーバーがもうすぐなくなりそうと言うことで,自分でさくらの VPS なサーバを借りた.だが,vCPU が 2 core,メモリ 1GB ということで,全文検索などあまり多くの機能を動かすとすぐにメモリがリソースが溢れそう.リソースと言う意味では,必ず 1 台は,設置場所の停電などで止まることがあるが,グローバル IP の振られている自分のマシンを確保している.そこで,さくら VPS はメールを受けとる専用,もう一台をメインで imap 接続したり spam 処理,全文検索処理などを行う構成にした.
- さくら VPS (FreeBSD 12.2-Stable)
- postfix + dovecot + spamassasin
- dovecot replicator でオンプレマシンと同期.
- オンプレマシン (FreeBSD 11.4-Stable)
- pontfix + dovecot + FTS(Solr) + imapfilter
- dovecot replicator でオンプレマシンと同期.
- Solr で全文検索のインデックス作成
- Thunderbird や iPhone Mail にてアーカイブすると,特定フォルダにメールが移動し,事前に設定しておいたルールに応じてフォルダ分けする.
- imapfilter で 10 分おきに適用
間借りサーバから新サーバへのメール移動
- imapsync を利用
- replicator との相性が悪く,メールを保存するたびに replicate しようとするため,imapsync の動作が大変遅くなる (数 KB/s しか出なくなる.)
- そのため,replicator の設定をする前に,メールは移動しておいた方が良いと思われる.
コマンド例
- 全てのメールを移動
% imapsync --host1 mail2.sakaki.works --port1 143 --authmech1 LOGIN --user1 skk.bps@sakaki.works --password1 "Password" --host2 mail2.sakaki.works --port2 143 --authmech2 LOGIN --user2 skk.bps@sakaki.works --password2 "Password"
- 特定のフォルダだけ移動.その際,フォルダ名を変えたい.
% imapsync --host1 mail2.sakaki.works --port1 143 --authmech1 LOGIN --user1 skk.bps@sakaki.works --password1 "Password" --host2 mail2.sakaki.works --port2 143 --authmech2 LOGIN --user2 skk.bps@sakaki.works --password2 "Password" --folder コピー元対象フォルダ --f1f2 コピー元対象フォルダ=コピー先対象フォルダ
dovecot 基本設定
(2007 年時点の設定参照)
変更点1
後で,FTS (Full Text Search) を行うため,ports インストールをする際に SOLR を選択する.すでに設定してしまっている人は,以下のように ports ディレクトリに移動して make config する.
% cd /usr/ports/mail/dovecot % make config
変更点2
Maildir から dbox にした.Maildir は,1メール1ファイルで,既読管理をファイル名に頼っている.そのため,メール数が増えてきた時に,ストレージへのアクセスが大量に発生するため,パフォーマンスが落ちやすい.
dbox はメールを 10MB までのファイルにパッキングしつつ管理している.メタ情報は 10MB までのファイルの中に書いているため,ストレージへのアクセスがバランス良くなっているものと思われる.ちなみに mbox 形式は,1 フォルダのメールを 1 ファイルに入れるため,メールが多くなってきた時に,大量のデータを読み込まねばならず,これはこれでパフォーマンスの劣化につながっていた.
mail_location = mdbox:/home/mail/%d/%n
参考情報
- 本家の dbox 解説文章:https://wiki2.dovecot.org/MailboxFormat/dbox
変更点3
さくら VPS は 100GB しかストレージがないので,メールを圧縮するようにした.
以下の設定をしておけば,新規に到着するメールからは dbox ファイルの中で,そのメールだけ gzip 圧縮される.gzip 以外にも bzip2 などの圧縮形式は選択できる.新規到着メールから圧縮されるようになるのと,そこまでメール閲覧に関してパフォーマンスが悪くなった印象はないので,早い段階で設定しておいた方が良いと思う.後で dbox 形式のメールを全部圧縮するには,一度 dsync や imapsync などを利用してメールボックスを移動させて,圧縮が動作するようにしなければならないので,めんどくさい.
mail_plugins = $mail_plugins zlib plugin { zlib_save = gz zlib_save_level = 6 }
参考情報
変更点4
SSL/TLS に対応した.Let's encrypt を利用.Let's Encrypt の利用は別のページ参照.
dovecot.conf に以下の設定を行う.dh.pem については,存在していないので,事前に以下のコマンドで作成しておく.
% dd if=/var/db/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > /usr/local/etc/dovecot/dh.pem
dovecot.conf 設定:
service imap-login { inet_listener imaps { port = 993 ssl = yes } } ssl = yes ssl_dh = </usr/local/etc/dovecot/dh.pem ssl_cert = </usr/local/etc/letsencrypt/live/mail2.sakaki.works/fullchain.pem ssl_key = </usr/local/etc/letsencrypt/live/mail2.sakaki.works/privkey.pem
イコールのあとの ”<” は typo でないので注意.
参考情報
-
- REMSYSTEM TECHLOG:CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う
- SSL/TLS 周りの設定を,Let's Encrypt も含めてかなり細かく記述してくれている.
doveadm コマンド
doveadm コマンドを活用しまくると,コマンドラインにてメールの検索,メールボックスのサイズ取得,などが行えるので,シェルなどの操作がしやすい.普段の仕事では Thunderbird(+external edit) を使うので,コマンドラインを使うことはないが,管理していく際には活用しやすい.
doveadm の man の中に,色々なコマンドが書いてあり,doveadm-command という名前で man が準備されている. 基本的に root (または,mail ユーザ)でないと動作しない.
doveadm search
マニュアル
% man doveadm-search
基本
返ってくるのは,guid と uid という,内部管理の ID なので,次の fetch と併用して利用することになる.
% doveadm search -u <username> <キー>
具体例
- 件名で検索したい場合
% doveadm search -u <username> subject "件名"
- From で検索したい場合
% doveadm search -u <username> from 'hoge@hoge.com'
- 特定のフォルダの中で検索をしたい場合
% doveadm search -u <username> mailbox 'Archives'
doveadm fetch
マニュアル
% man doveadm-fetch
基本
guid, uid をベースに検索するので,ほぼ search と併用する.
具体例
- From で検索して,件名を一覧表示したい場合
Note: 以下では,nkf -w にて subject 部分で encode された文字を日本語に戻している% doveadm search -u skk.bps@sakaki.works from 'hoge@hoge.com| while read guid uid; do doveadm fetch -u <username> mailbox mailbox-guid $guid uid $uid | nkf -w \\ done
- Archives フォルダの中のメールの From を全て一覧表示したい
Note: grep の部分は,from のメールアドレスのみを抜き出している% doveadm search -u <username> mailbox 'Archives' | while read guid uid; do doveadm fetch -u <username> hdr.from mailbox-guid $guid uid $uid | grep -o "[-_a-zA-Z0-9\.]*@[-a-zA-Z0-9\.]*" done
doveadm user
マニュアル
% man doveadm-user
基本
dovecot が認識しているユーザについての情報の表示・コントロールを行うコマンド.
passdb において,以下のような設定がしてある場合,dovecot.passwd.db に書いてあるユーザのみが一覧表示されるはず.
passdb { args = /usr/local/etc/dovecot.passwd.db driver = passwd-file }
具体例
- dovecot のユーザ一覧を表示する
% doveadm user '*'
- 特定ユーザについての情報を表示する
% doveadm user -u <username>
doveadm mailbox
マニュアル
% man doveadm-mailbox
基本
メールボックスの中で設定されているフォルダに関する情報を得るためのコマンド.
具体例
- 全フォルダの利用サイズを取得したい.
% doveadm -f table mailbox status -u skk.bps@sakaki.works "vsize" '*'
- フォルダのサイズ順にソートする
% doveadm -f table mailbox status -u skk.bps@sakaki.works "vsize" '*' | awk -F' ' '{print $2 " " $1}' | sort -n
- 特定フォルダの利用サイズを取得したい.
% doveadm -f table mailbox status -u skk.bps@sakaki.works "messages vsize" spam
- ちゃんと調査しきれていないが,vsize は dbox の中に記述されている各メールサイズを足し算したものなのではないか?と想像している.実際に利用されているストレージ量が算出されているわけではなさそう.
doveadm quota
マニュアル
% man doveadm-quota
基本
以下が dovecot.conf に書いてある場合にのみ,利用できるコマンド.現状では特に quota を設定していないので,設定の仕方は分からない.
mail_plugins = $mail_plugins quota plugin { quota = count quota_vsizes = yes }
具体例
- 特定ユーザが利用しているストレージ情報を得る.
% doveadm quota get -u skk.bps@sakaki.works
doveadm replicator
マニュアル
% man doveadm-replicator % mad doveadm-dsync
基本
具体例
参考情報
- mailcow: dockerized documentation:https://mailcow.github.io/mailcow-dockerized-docs/u_e-dovecot-more/
dovecot replicator
doveadm user で出てくるユーザ全てを同期する.特定ユーザのみ同期したくない場合は,dovecot.passwd.db (passwd-file) の対象ユーザに,以下のような記述をしておく.
username:{plain}hogehoge:5000:5000::/home/mail/%d/%n::userdb_noreplicate=y
master/master 同期を行うためには,さくら VPS・オンプレマシンの両方に同じ設定を書いておく必要がある.
dovecot FTS 設定
基本
- FTS エンジンには xapian,solr などがある.
- xapian は使いものにならなかった.5 日間ほど動かしておいてみたが,ストレージへのアクセスが 10MB/s 〜 20MB/s が続いているのにいつまでも終了せず.replicator との相性か?と思ったが,多分,単品で動かしても安定しないのでは…と思った.
- solr は java のインストールなど時間がかかったが,安定して動作.
- TODO:
- 未:日本語 tokenizer 対応
-
- 公式にも言語別設定が書いてある.
- https://fumiyas.github.io/dovecot/fts-solr.html Dovecot FTS + Apache Solr - ダメ出し Blog
- Solr 使った日本語向けの設定が日本語で書いてある.
-
参考情報
- dovecot 正式情報:Full Text Search (FTS) plugin:https://doc.dovecot.org/settings/plugin/fts-plugin/
サーバサイドでのフォルダ分け
- sieve と replicator の相性が悪い気がする.
- sieve は記述言語の癖が大きいのと,記述ミスをするとメールがなくなる時があり,なかなか恐い.
- imapfilter は,lua というプログラミング言語で記述するため,振り分けルールの中の記述自由度が高い.変数なども使える.記述を間違った際は,imapfilter が動作しないだけなので,メール紛失の危険が低い.
postfix 基本設定
(2007 年時点の設定参照)
変更点1
SSL/TLS に対応した
変更点2
relay_host で SMTPS 対応しようとして,失敗した. そのかわり,Amazon SES は 465(smtps) だけでなく,587(submission) でも動作することが分かった.
spamassassin 設定
(2007 年時点の設定参照)
dovecot + spamassasin + dovecot-sieve の設定方法(2012/11)
virtual domain 前提。
ソフトウェア準備
- ports から、dovecot と、dovecot-sieve を入れる。メモ時点でのバージョンは下記の通り。
dovecot-1.2.17 Secure and compact IMAP and POP3 servers dovecot-sieve-1.2+0.1.18_1 A Sieve plugin for the Dovecot 'deliver' LDA
設定
- dovecot.conf
- sieve ファイルを設置する場所を記述
plugin { ... sieve=/home/mail/%d/%n/.dovecot.sieve }
- sieve プラグインを利用することを宣言
protocol lda { ... mail_plugins = sieve }
- 注:cmusieve ではない。
- postfix / master.cf
- spam assassin をフィルタとして使いつつ、dovecot の deliver という lda (local delivery agent) を利用するようにする。
filter unix - n n - 10 pipe flags=DRhu user=mailuser argv=/usr/local/bin/spamc -e /usr/local/libexe
c/dovecot/deliver -f ${sender} -d ${recipient}
- user で指定される uid は MTA が動作している UID。これと、spam assassin で利用している uid が異なっている場合、同一にすること。permission 問題が発生する。
- /usr/local/etc/mail/spamassassin/local.cf
- [SPAM] がつくようにする。
rewrite_header Subject [SPAM]
postfix + dovecot 初期構築 (2007/03)
postfix + dovecot でメールサーバ構築.環境は,FreeBSD 5.5R.
2007/03/17 作業.
構築要件
- サーバは,グローバル IP を取得した,専用サーバ.
- どんなドメインでメール環境を運用するかわからないので,完全 virtual domain 対応にする必要がある.
- postfix も dovecot も virtual domain を謳っているので,とりあえず選択してみた.
- smtp auth が必要.
- imap/pop3 をするために,ユーザ管理を行なう必要がある.smtp auth と共用できた方が楽なので,そうする.
- postfix: postfix-2.3.8,1
- dovecot: dovecot-1.0.r27
postfix のインストールと設定
- ports でインストールするのが,後の運用も考えると便利.
# portupgrade -N mail/postfix
- デフォルトで入っている sendmail を自動起動しないように /etc/rc.conf を書き換える.
sendmail_enable="NO" // もし,yes となっていたら. postfix_enable="YES"
- /etc/aliases に,次の記述.
postfix: root
- 動作の設定は,/usr/local/etc/postfix/main.cf に.次の記述.
myhostname = banana2887.maido3.com mydomain = maido3.com myorigin = $mydomain inet_interfaces = all mynetworks = 127.0.0.0/8 ## virtual mailbox virtual_mailbox_domains = ztdn.org virtual_mailbox_base = /home/mail virtual_mailbox_maps = hash:/usr/local/etc/postfix/vmailbox virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_alias_maps = hash:/usr/local/etc/postfix/virtual ## sasl smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
- myhostname: サーバのホスト名.今回の場合,間違ってなければ,なんでもよし.
- mydomain: myhostname のドメイン部分を書き出す.
- myorigin: mydomin でも書いておく.
上記3つは,ローカル配送したときとかに利用されるドメインになる.一番のベースドメインと言える.現在の設定ではヘッダの中に名前が出てしまうのでかっこわるい.
- inet_interface = all にしておかないと,外部からの smtp を受け付けなくなってしまう.
- mynetworks: どこからの smtp を受け付けるかを,ネットワークベースで制限できる.dovecot との連携において,smtp-auth をかけるので,ローカルからの配送のみを許しておけば十分.
ここまでで,smtp server としての基本が終わり.次から,virtual host 設定と認証の設定に入る.
- virtual_mailbox_domains = ztdn.org : 運用したいドメイン名を書く.
- virtual_mailbox_base = /home/mail : メールをためておく場所を書く.ユーザディレクトリ内の Maildir に相当する.
- virtual_mailbox_maps = hash:/usr/local/etc/postfix/vmailbox : ztdn.org に対して届いたメールをどのように扱うかを記したファイル.後述.
- virtual_minimum_uid = 100 : 不明
- virtual_uid_maps = static:5000 : /home/mail 以下のファイルは uid 5000 で取り扱われる.
virtual_gid_maps = static:5000 : /home/mail 以下のファイルは gdi 5000 で取り扱われる. virtual_alias_maps = hash:/usr/local/etc/postfix/virtual : 後述.alias ファイルに近い.
- vmailbox: 中には,以下のように記述する.
skk@ztdn.org ztdn.org/skk/ yuki@ztdn.org ztdn.org/yuki/ www@ztdn.org ztdn.org/www/
- 変更したら次のコマンドで db をアップデート
# postmap /usr/local/etc/postfix/vmailbox
- skk@ztdn.org へのメールを,/home/mail/ztdn.org/skk/ 以下に,Maildir 形式で落とす,という意味.もし,ztdn.org/skk と,スラッシュを書かないと,mbox 形式で保存されるので注意.
- virtual: 中には,alias のような記述を行う.
info@ztdn.org skk@hoge.com ml@hoge.com ml@localhost
- vmailbox と virtual は共存可能.先に vmailbox が処理されるのかも.
- ml@localhost の場合,ローカルに配送されるので,/etc/alias に次のような処理を書くことが可能.
ml: "|/path/to/mlprogram"
virtual host のケースによっては,他の実装方法がよいかもしれない.他の方法に関しては,ここを参照.
特定の smtp サーバのみにリレーする方法
- freebsd では,ports インストール時に sasl ライブラリを compile in する必要あり.(デフォルトだとされていない)
- main.cf に以下を追記
# restrict mail relay only to ice.bps smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/usr/local/etc/postfix/relay_password smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous data_directory = /var/db/postfix
- relay_password に,smtp auth 認証用情報を記述しておく
# vi /usr/local/etc/postfix/relay_password [smtp.hoge.jp]:587 hoge@hoge.jp:hogepassword # postmap /usr/local/etc/postfix/relay_password
- 参考
- http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_(SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth)
dovecot のインストールと設定
- ports でインストールする.
- /usr/local/etc/dovecot.conf を sample をコピーして作成する.
- dovecot.conf の中身を,それぞれ以下のように書き換える
protocols = imap pop3 listen = * mail_location = maildir:/home/mail/%d/%n first_valid_uid = 500 last_valid_uid = 5000 first_valid_gid = 0 last_valid_gid = 5000 auth default { # Space separated list of wanted authentication mechanisms: # plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi mechanisms = plain login passdb passwd-file { # Path for passwd-file args = /usr/local/etc/dovecot.passwd.db } passdb passwd-file { # Path for passwd-file args = /usr/local/etc/dovecot.passwd.db } socket listen { client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } }
- 次に,パスワード兼ユーザ情報ファイルを作成する.(dovecot.passwd.db)
skk@hoge.com:{CRAM-MD5}thaoseuh:5000:5000:/home/mail/%d/%n yuki@hoge.com:{plain}password:5000:5000:/home/mail/%d/%n
- %d を有効にするために,ユーザの後ろには必ず@でドメインを指定する必要がある.virtual host を有効にするにはこの設定が必要.
- CRAM-MD5 とかのハッシュ値を作成するには,dovecotpw というコマンドを利用すれば簡単に作成できる.
参考文献
- postfix 和訳ページ ; postfix 関係は,ほとんどここ. – &new{2007-03-17 (土) 21:10:31};
- postfix virtual domain ; postfix の virtual domain の簡単なところはここで理解するのがわかりやすい. – &new{2007-03-17 (土) 21:11:25};
- /etc/aliases を有効に使う方法(postfix virtual domain 環境) – &new{2007-03-17 (土) 21:12:07};
- dovecot wiki ; dovecot の正式なドキュメント – &new{2007-03-17 (土) 21:14:28};
その他
Maildir 内に保存されるファイル名,命名規則について
The standard filename definition is: "<base filename>:2,<flags>". Dovecot has extended the <flags> field to be "<flags>[,<non-standard fields>]". This means that if Dovecot sees a comma in the <flags> field while updating flags in the filename, it doesn't touch anything after the comma. However other maildir MUAs may mess them up, so it's still not such a good idea to do that. Basic <flags> are described here. The <non-standard fields> isn't used by Dovecot for anything currently. Dovecot supports reading a few fields from the <base filename>: - ,S=<size>: <size> contains the file size. Getting the size from the filename avoids doing a stat(), which may improve the performance. This is especially useful with Maildir++ quota. - ,W=<vsize>: <vsize> contains the file's RFC822.SIZE, ie. the file size with linefeeds being CR+LF characters. If the message was stored with CR+LF linefeeds, <size> and <vsize> are the same. Setting this may give a small speedup because now Dovecot doesn't need to calculate the size itself. A maildir filename with those fields would look something like: 1035478339.27041_118.foo.org,S=1000,W=1030:2,S
- ということで,<base filename>:2,<flags> という形式の模様.
- new の中にある段階では,:2, がまだつけられていない感じ.
- flags の意味は以下の通り.新しい flag が追加されている可能性がある.flag は ASCII 順で , 以降に付け加えられなければならない.
“P” | (passed) | the user has resent/forwarded/bounced this message to someone else. |
“R” | (replied) | the user has replied to this message. |
“S” | (seen) | the user has viewed this message, though perhaps he didn't read all the way through it. |
“T” | (trashed) | the user has moved this message to the trash; the trash will be emptied by a later user action. |
“D” | (draft) | the user considers this message a draft; toggled at user discretion. |
“F” | (flagged) | user-defined flag; toggled at user discretion. |