wiz.code

XMailサーバーのインストール

XMailのビルド、の前に

最近、PCがやたら重い。 メモリの使用量を確認すると8GB中7GBを超えることもある。 仮想マシンのせいかと思ってHyper-Vマネージャを見たら、CentOSに3GB以上のメモリが割り当てられていた。

このままだとホストコンピュータ(Windows10)のメモリ負荷が深刻な状況になるので、 仮想マシン(CentOS)に対するメモリ割り当てを「動的」から「固定(2048MB)」に変更しました。

XMailのビルド

では本題。

OpenSSL(1.1.0c)のビルドとインストールが完了したので、当初の目的だったXMailサーバーのビルドとインストールを行います。 端末(root)は、ホームに展開したXMailのソースディレクトリ(/home/wiz/xmail-1.27/)に移動しています。

展開したディレクトリに「Docs」ディレクトリがあり、その中の「Readme.txt」にビルドの手順が書かれているので、それに従って進めます。

XMailのビルド

まずはMakefileの実行。 XMailのMakefileはOS毎に用意されているので、「-f」オプションを付けて「Makefile.lnx」を指定します。

# make -f Makefile.lnx

正常に終了したように見えたのですが、ログの途中でいくつか、警告が出ていました。 ERR_remove_state関数 と RAND_pseudo_bytes関数 を使用している部分。 どちらもOpenSSLの関数のようで、廃止されているという警告です。 両方をOpenSSLのマニュアルで調べます。

ERR_remove_state関数は、OpenSSLが1.0.1になったときにERR_remove_thread_state関数に置き換えられ、その後OpenSSL 1.1.0のバージョンアップで双方とも廃止されたようです。 SSLBind.cppの2か所(78行目、84行目)でこの関数が呼び出されています。 ソースから削除すればいいのだろうけど、消していいものかどうか…。

ERR_remove_state関数の呼び出しを削除

そこで、OpenSSLのソースを見たところ、関数は定義されているようですが、中身は空。 ってことは、消しても問題ないですね。 78行目はひとつ前の77行目から2行に渡ってif文が構成されているので、2行ともコメントアウト。 84行目もコメントアウト。

RAND_pseudo_bytes関数の呼び出しを変更

もうひとつのRAND_pseudo_bytes関数は、SSLMisc.cppの45行目で呼び出されています。 この関数は、RAND_bytes関数に名称変更されたようなので、書き換えます。

これで警告は出なくなったかな。 ビルドが通らないわけではないので、ソースの書き換えはしなくてもいいかもしれないけど…。

削除…失敗

改めて、ビルドしなおします。 ビルドによってbinディレクトリが出来ているので、一旦消して…。

消せない…。 ディレクトリのアイコンに鍵マークついてたからね…。 多分そうじゃないかと思いましたよ。 ディレクトリを消すには…rmコマンドですね。

rmコマンド
# rm bin
rm: 'bin' を削除できません: ディレクトリです

おっと。 ディレクトリを削除するときは「-d」オプションを付加するんですか。

rm -dコマンド
# rm -d bin
rm: 'bin' を削除できません: ディレクトリは空ではありません

ぐは。 えっと…、ファイルを先に消してから…? いや、そんな面倒な作業のはずがない。

ディレクトリと内部のファイルをまるごと削除するときは「-r」オプションを指定するらしい。

rm -rコマンド
# rm -r bin

まてまてまて…。 ファイル1個1個に削除確認が…。 これは「-f」オプションで表示しないようにできるのか。 一旦[CTRL]+[C]でコマンドを終了。

rm -r -fコマンド
# rm -r -f bin

ふぅ。 やっと削除できた。 ちなみに、ちゃんと調べたらオプションは「-rf」という風に指定できるようです。 これって、rmコマンドだけの話じゃないよね? なるほど。 だから、linuxコマンドのオプションは「-」の後がみんな1文字なのか。

脱線終了。 makeをやり直します。

XMailビルド(警告なし)
# make -f Makefile.lnx

今度は警告なしでビルド完了しました。

XMailのインストール

それでは、XMailをインストールします。 といっても、インストーラは付属していないので、Readme.txt(Docsディレクト内)で手順を確認します。 ちなみに、翻訳は英検4級がやってます。 鵜呑みにしないでください。

  1. Build XMail.

    「XMailをビルドしてね。」はい終わりました。

  2. Log as root.

    「ルートでログインしてね。」でいいのかな。

  3. Copy the supplied MailRoot directory where you want it to reside(normally /var).

    「支給された MailRootディレクトリを、好きなところにコピーしてね(普通は /var だよ)。」そうします。

  4. Do a # chmod 700 /var/MailRoot to setup MailRoot directory access rights.

    「設置したMailRootディレクトリのアクセス権限をコマンド"chmod 700"で変更してね。」

  5. Strip XMail executables if you want to reduce their sizes (strip filename).

    「サイズを削りたければXMailの実行ファイルを削除してもいいよ」ん? これはどういう意味だ?

  6. Copy XMail executables to /var/MailRoot/bin.

    「XMailの実行ファイルを /var/MailRoot/bin にコピーしようね」

  7. Optionally, you can setup a dedicated temporary files directory for XMail, by setting the environment variable XMAIL_TEMP, which defaults to /tmp/. XMail uses such directory when it has to create files that must be accessible to external programs like filters.

    長っ! 「これはオプションだけど、あなたはXMail専用の一時ファイルディレクトリを設置できるよ。 その場合は環境変数にXMAIL_TEMPを作って指定してね。 デフォルトは /tmp/ だよ。 Xmailはアクセス可能な外部プログラム(フィルタとか)のファイルを作るときにそのディレクトリを使うよ。」 /temp/でいいです。

  8. If you have 'inetd' installed, comment out the lines of '/etc/inetd.conf' that involve SMTP, POP3, and Finger. Restart 'inetd' (kill -HUP ...).

    「もし、'inetd'をインストールしてあるなら、/etc/inetd.confの影響するSMTP, POP3あとFingerの行をコメントアウトしてね。 そうしたら'inetd'を再起動するんだよ。」 これは要確認ですね。

  9. Since XMail uses syslog to log messages, enable syslogd if it's not running.

    「XMailはログメッセージに syslog を使うから、syslogd が実行されていなかったら有効にしておいてね。」 こっちも確認。

  10. Setup the 'SERVER.TAB' configuration file (after reading the rest of this document well).

    「設定ファイルの'SERVER.TAB'を設定してね。(このドキュメントの残りをしっかり読んでからだよ!)」

  11. Add your users and domains (after reading the rest of this document well).

    「ユーザーとドメインを追加してね。(ちゃんと最後まで読むんだよ!)」

  12. Change or comment out (#) the example account in 'ctrlaccounts.tab' by using a non-trivial username and password.

    「'ctrlaccounts.tab'に例として書いてあるアカウントは単純じゃないユーザー名とパスワードで変更するかコメントアウトしておいてね。」

  13. Copy the xmail startup script to your init.d directory (it's position depends on your distro). If you've setup XMail to work in a subdirectory other than '/var/MailRoot' you must edit the xmail startup script to customize its boot parameters.

    「XMailの起動スクリプトをinit.dディレクトリにコピーしてね。(場所はディストリビューションに依存するからね) もし、XMailを'/var/MailRoot'以外のサブディレクトリで稼働させるなら、起動スクリプトのブートパラメータをカスタマイズする必要があるよ。」

  14. Use the 'sysv_inst.sh' shell script (from root user) to create SysV boot script - unless your distro has other tools to do this.

    「そのディストリビューションにこれをするための他のツールがなければ、 'sysv_inst.sh'シェルスクリプトを使って、Sysvブートスクリプトを作ってね。(rootユーザで実行するんだよ)」

  15. To start XMail without reboot you can run (from root): /etc/rc.d/init.d/xmail start otherwise reboot your machine.

    「再起動しないでXMailをスタートしたかったら、rootユーザーで'/etc/rc.d/init.d/xmail/を開始してね。 それ以外はコンピュータを再起動させてね。」

  16. Setup the file 'smtprelay.tab' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail).

    「もし、プライベートIPアドレス区分を超えたところにメールをリレーしたかったら、'smtprelay.tab'を設定してね。」 グローバルネットワークへのリレーに必要な設置ですね。

  17. Look at [SSL CONFIGURATION] for information about how to create the required 'server.key' and 'server.cert' files.

    「'server.key'と'server.cert'の作り方は、[SSL CONFIGURATION]の項目を探してね。」 XMailは標準でSMTPsとPOP3sに対応しているので、そのための設定です。

ふぅ疲れた。 部分的に分からなかったところは、Google先生に聞きました。

次にインストール手順を【終わった】【すぐ実行】【後回し】【やらない】【要調査】の5つに分類しよう。

  1. ビルド【終わった】
  2. ルートログイン【終わった】
  3. MailRootを/varにコピー【すぐ実行】
  4. パーミッションの変更【すぐ実行】
  5. サイズ削減【やらない】
  6. 実行ファイルのコピー【すぐ実行】
  7. tmpディレクトリの設定【やらない】
  8. inetdの設定変更【要調査】(inetdが動いているか確認)
  9. syslogdの確認【要調査】(動いてなければ動かす)
  10. SERVER.TABの設定【すぐ実行】
  11. ユーザーとドメインの追加【すぐ実行】
  12. ctrlaccounts.tabの編集【すぐ実行】
  13. 自動起動の設定【すぐ実行】
  14. SysVの作成【要調査】(これちょっとよくわからない)
  15. 再起動【後回し】
  16. リレー設定【後回し】
  17. SSL関連【後回し】

上記のうち、【すぐ実行】としたものを順に行います。

【すぐ実行】

MailRootをコピー

コピーは「cp」コマンド。 rmコマンドと同じように、ディレクトリを中身までまとめてコピーしたい場合は「-r」オプションを付ける。 Readme.txtの説明では、どこにおいてもいいっぽいけど、その場合は自動起動のスクリプトを書き換える必要が出てくるので指示通り /var にコピーします。

# cp -r MailRoot/ /var/

パーミッション変更

MailRootのパーミッションを変更します。 指示では 700 にしろ、とありましたのでその通りに。 ん? これって、所有者(root)以外はなにもできないようにするってことか。

# chmod 700 /var/MailRoot

実行ファイルのコピー

binディレクトリを /var/MailRoot/bin にコピー。

# cp -r bin/ /var/MailRoot/

SERVER.TABの設定

SERVER.TABを設定します。 ディレクトリの権限変えちゃってるから、viコマンドで開くしかないか。 ちなみに、ドキュメントは大文字で書かれていますが、ファイル名はすべて小文字です。

# vi /var/MailRoot/server.tab

viで開いているときに「:set number」というコマンドを打つと、行番号が表示できることを知った。

server.tabの内容

まず、5行目の「RootDomain」。 そういえば、マシンのドメイン考えてなかった。
ん~~~っと「wiz-code.private」にします。 5行目を「wiz-code.private」に変更。

6行目の「SmtpServerDomain」。 これはRootDomainと同じでいいでしょう。 SMTPサーバー用のドメイン、例えば「smtp.wiz-code.private」みたいなのがあればそれを設定すればいいかな。

7行目「POP3Domain」も同じ。

8行目「HeloDomain」にはIPアドレスから逆引きしたドメインを設定する。 今回の場合ここも「wiz-code.private」。

9行目「PostMaster」は、管理者のメールアドレス。 「postmaster@wiz-code.private」としておく。

10行目「ErrorsAdmin」はエラーメールの受け取り先。 「errors@wiz-code.private」としておく。

13行目「Pop3LogPasswd」は、ログにPOP3のパスワードコマンドのパラメータ(すなわちユーザーのパスワード)を記録するかどうか、の設定。 「0(初期値)」は記録しない、「1」はログインに失敗した場合のみ記録、「2」はすべて記録。 ここでは初期値のままにしておく。

とりあえずこんなところですかね。 その他のオプションは稼働させながら調整していきます。

ctrlaccounts.tabの編集

Readme.txtの記述と順番が前後しますが、これを先にやらないとユーザーとドメインの追加ができません。 というのも、これは後述する管理用クライアントにログインするためのユーザー名とパスワードの設定だからです。

ファイルの書式は非常に単純で "username"[TAB]"password"[NEWLINE] とすればよいだけです。 ただし、パスワードは平文ではなく、binディレクトリにある XMCrypt を使って暗号化する必要があります。 ということで、端末のディレクトリを移動して、パスワードを暗号化。

XMCryptでパスワードを暗号化
# cd /var/MailRoot
# bin/XMCrypt wizpass
120c1f15041616

binディレクトリまで入ってしまうと各TABファイルへアクセスしにくくなるので、MailRootにしてあります。 binまで入って行う場合は bin/XMCrypt を ./XMCrypt に置き換えてください。

次に、ctrlaccounts.tab にユーザー名と先ほどの暗号化したパスワードを記入します。

ctrlaccounts.tabの内容
# vi ctrlaccounts.tab
"wiz"[TAB]"120c1f15041616"[ENTER]

[i]で入力モードに入れなかったので[a]で入りました。 空のファイルの場合、[i]では入力モードに移行できないのかな?

これで、管理用クライアントにログインできるようになりました。

ユーザーとドメインの追加

サーバーの設定(server.tab)や管理者アカウント(ctrlaccounts.tab)はファイルに記述しますが、 ユーザーとかドメインの設定は binディレクトリにある CtrlClnt(Control Clientの略だと思う)という管理用クライアントを使って設定します。 CtrlClntを単独で呼び出すとオプションが見られます。

管理用クライアント(CtrlClnt)
# bin/CtrlClnt

まず、ドメイン「wiz-code.private」を作ります。 CtrlClntの管理コマンドは Readme.txt の「XMAIL ADMIN PROTOCOL」という章に書かれています。 ドメインの追加は domainadd[TAB]domain[CR][LF] です。 あれ、[TAB]打てない。 スペースでいいか。

CtrlClntエラー
# bin/CtrlClnt -s localhost -u wiz -p wizpass domainadd wiz-code.private
ErrCode   = -152
ErrString = End of socket stream data

エラー…。 "End of socket stream data"ってのは、ソケットにデータが届いていないっぽいな…。

あ~…、XMailを走らせておかないとダメなんだっけか。 じゃぁ、先に自動起動の設定をやってしまおう。

自動起動の設定

XMailの圧縮ファイルを展開したところに「xmail」というシェルスクリプトがあるので、これを /etc/init.d/ ディレクトリにコピーします。 んで、XMailを起動。

XMailを起動…失敗
# cp /home/wiz/xmail-1.27/xmail /etc/init.d
# /etc/init.d/xmail start

んが? 許可がない…とな…。

スクリプトの実行を許可
# chmod +x /etc/init.d/xmail

許可がない時はスクリプトファイルに対して、上記を実行せよ、という記事を発見。 実行権限を与えるオプションらしい。

起動スクリプトファイルのプロパティ

ファイルのプロパティ見たら「プログラムとして実行」にチェックがついてる。

改めて、起動。

XMailを起動
# /etc/init.d/xmail start

お、今度はちゃんと起動した♪ これで、CtrlClntも動くはず。

それでもCtrlClntが通らない
# bin/CtrlClnt -s localhost -u wiz -p wizpass domainadd wiz-code.private

通らない…。 サーバーがちゃんと動いてないのかな…。

Telnetで接続

SMTPサーバーとPOP3サーバーがちゃんと動いているかどうかを確認するために、Telnetを使って接続してみます。 CentOSにTelnetが入っていなかったので、yumでインストール。 完了したら、SMTPサーバーに接続してみます。

telnetでSMTPに接続
# yum install telnet
# telnet localhost 25
220 localhost.localdomain ESMTP Postfix

んん? Postfix?

Postfixのサービス登録を削除
# systemctl status postfix

あ~~~…。 serverctrlコマンドでサービスの状態確認したらPostfixが動いてら。 てことは、ポート25の待ち受けが競合したために、xmailがちゃんと稼働できていないんだな。

まずは、Postfixを止めて…、どうせXMailがあるわけだからPostfixはサービスからも削除しておきます。

# systemctl stop postfix
# systemctl disable postfix

XMailサーバーを再起動させます。 コマンドはパラメータをstopとstartに分けましたが、単にrestartでもよいと思います。 状態見ようと思って、statusを投げたら、そんなパラメータは知らん、と言われました。

# /etc/init.d/xmail stop
# /etc/init.d/xmail start

telnetで確認。

XMailの待ち受けを確認
# telnet localhost 25
# telnet localhost 110

SMTP(ポート番号 25)とPOP3(ポート番号 110)の両方で、XMailが応答していることが分かりました。

ドメインの追加

では、CtrlClntのテスト。 三度目の正直なるか。

CtrlClntでドメインの追加・一覧・削除
# bin/CtrlClnt -s localhost -u wiz -p wizpass domainadd wiz-code.private

お? 通った?

ドメインがちゃんと追加されているかどうか、domainlistコマンドでチェック。

# bin/CtrlClnt -s localhost -u wiz -p wizpass domainlist
"xmailserver.test"
"wiz-code.private"

ちゃんと追加されていますね。 ついでに、デフォルトで入っているドメイン"xmailserver.test"は削除してしまいましょう。

# bin/CtrlClnt -s localhost -u wiz -p wizpass domaindel xmailserver.test

削除後に、もう一度domainlistを実行して、削除されていることを確認。

ユーザーの追加

続いてメールユーザーの追加。 これは、useraddコマンドです。 書式は useradd [domain] [username] [password] [usertype] となります。 始めに、server.tabに設定した postmaster@wiz-code.private と errors@wiz-code.private の2つを作ります。 ドメインとユーザー名がメールアドレスの書式とは入れ替わるので注意です。 [usertype]は、通常ユーザーであれば[U]、メーリングリストであれば[M]を指定します。 XMailは標準でメーリングリストをサポートしているあたりがお気に入り。

CtrlClntでユーザーの追加・一覧
# bin/CtrlClnt -s localhost -u wiz -p wizpass useradd wiz-code.private postmaster userpass U
# bin/CtrlClnt -s localhost -u wiz -p wizpass useradd wiz-code.private errors userpass U

ユーザーの一覧は、userlistコマンドで調べられます。 ドメインを指定すればそのドメインのみ、指定しなければすべてのユーザーが列挙されます。

# bin/CtrlClnt -s localhost -u wiz -p wizpass userlist

ユーザーのパスワードは暗号化されず、平文で表示されるので注意。 (設定ファイルは暗号化されています。)

この章のまとめ

  • Hyper-Vのメモリ設定を動的にすると、ホストコンピュータの動作が重くなる場合がある。
  • OpenSSL 1.0以降、変更や廃止された関数がある。
  • XMailのビルドで警告が出る場合、ソースのOpenSSLに関する関数をコメントアウトや変更すれば警告は出なくなる。
  • rmコマンド:ファイルやディレクトリを削除する。
  • cpコマンド:ファイルやディレクトリをコピーする。
  • chmodコマンド:ファイルやディレクトリのアクセス権限を変更する。[+x]でプログラムとして実行することを許可する。