[自分用メモ] 仕事で必要になったのでCentOS上でのpostfixインストール&設定についてメモしておく

ここのところサーバの設定などから遠ざかっていたわけだけれど、ちょっと前にはApache VirualHostの設定SSLの設定をするハメに……もとい仕事が舞い込んできたのでキリキリしながらやっていたわけだけれど、postfixの設定なんて本当にもっと久しぶりだ。たぶん……ああ1年半前ぐらいに少しやっただけか。ちゃんとやってたのはもっと前だな……いやpostfixはそれほど設定やってなかった、sendmailばっかりだった、それなんてもっと前だな……5年以上やってないな……などなど。ということで、postfixの設定メモを残しておく。それほど大それたものじゃないけれど。

設定の前提として、2つのドメイン名を持つメールアドレス宛のメールを受け取るようにする。そして実ドメインをexample.co.jp、仮想ドメインをexample.jpとしておく。
実際には仕事上で必要となった別のドメイン名ではあるが、ここではexampleとして置き換えて話を進める。ドメイン名で設定が変わるわけではないので、まあよいだろ。

[text]
example.co.jp
example.jp
[/text]

CentOSなので(ちなみにAmazon EC2を使っている)、yum listすると以下のようになる。postfixを探してパッケージ名を確認する。なお、FreeBSDであれば/usr/ports/mail/postfixを使えばいいだろう(postfix2[5-8]もあるが、新規インストールなら現時点で最新のpostfix-2.9系の/usr/ports/mail/postfixにするほうがいい)。

[text]
# yum list |grep postfix
postfix.x86_64 2:2.6.6-2.13.amzn1 amzn-main
postfix-perl-scripts.x86_64 2:2.6.6-2.13.amzn1 amzn-main
[/text]

「postfix.x86_64」というのがあるので、これをインストールする。パッケージ名はこの表記と違う場合もあるので自分のシステム・OSバージョンで何であるのかだけは確認しておくほうがいい。

[text]
# yum install postfix.x86_64
[/text]

インストール自体は手順通りに進めれば問題なく完了するはずだ。もしここで失敗するようであれば、yum自体の問題があると思うので、インターネットにアクセスできるか、DNSで名前引きができるかなど、もっと根本を疑って調査しよう。
インストールが完了したら、chkconfigコマンドでpostfixをサービスに登録する。

[text]
# chkconfig –add postfix
# chkconfig postfix on
[/text]

postfixの設定をする。CentOSのyumでインストールすると/etc/postfixディレクトリに設定されるようだ。

[text]
# cd /etc/postfix
[/text]

main.cfファイルを編集する。

[text]
# vi main.cf
[/text]

編集項目は以下の通りだった。デフォルトが設定されているものは変更している場合もある。

[text]
myhostname = myhost.example.co.jp
mydomain = example.co.jp
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.1.0/24, 127.0.0.0/8
virtual_alias_domains = example.jp
virtual_maps = hash:/etc/postfix/virtual
[/text]

myhostnameは「myhost.example.co.jp」は、設定中のサーバのホスト名である。myhostは適当に修正すればいいだろう。
mydomainに実ドメインである「example.co.jp」、virtual_alias_domainsを「example.jp」としている。
myoriginは$mydomain、つまりmydomainで設定した値を使用するようにしている。


inet_interfacesはallとした。特にインタフェースを決め打ちする意味もないだろうと思ってこう設定している。後日何らかの拡張が発生したときに悩むポイントをわざわざ作るのも嫌だったからだが、セキュリティ上必要であれば必要なインタフェースのみに限定したほうがいいかもしれない。ApacheのLISTENと同じでLISTENするインタフェースを指定するだけなので、これがセキュリティ問題に直結するということではないのだが。
mydestinationで自分が受け取るメールアドレスのFQDNを列挙する。カンマセパレートだ。設定ファイル中の変数を使用することもできる。設定上的には「example.jp」など仮想ドメインを直接指定することもできるが、拡張性に富まない上に設定的に理にかなわないので、別途virtual_alias_domainsで指定する。

virtual_alias_domainsでは仮想ドメインを列挙する。今回の設定では2ドメイン名しかないので設定ファイルに直接書いているが、もっと大量に稼働ドメインがある場合や、頻繁にメンテナンスをする必要がある場合には「hash:/etc/postfix/virtual_domains」などのようにhashファイルを指定するようにしたほうがいいだろう。

[text]
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_maps = hash:/etc/postfix/virtual
[/text]

この場合のvirtual_domainsファイルは以下のように記述する。”キー”となる左側(LHS)のあとにスペース(もしくはタブ)を入れ、その次にくる右側(RHS)の”値”はダミーで構わない。ここでは「ok」と設定しているが、これ以外でもよい。未指定だとwarningが出る。

[text]
example.jp ok
[/text]

なお、OS上で設定されていないユーザやメールボックス宛のメールを処理したい場合には、virtual_mailbox_mapsやvirtual_mailbox_domainsを設定する必要があるので必要であれば調べてみるとよい。

[Sponsored Link]


さて、仮想ドメインのマッピングをするvirtualファイルを記述する。

[text]
# vi virtual
[/text]

OS上に存在するuserユーザ宛のメールを、実ドメイン名と仮想ドメイン名でそれぞれ設定すると、このような感じになる。

[text]
user@example.co.jp user
user@example.jp user
[/text]

右側(RHS)に指定するのは別のメールアドレスであっても構わないし、別のユーザ名(mailbox)でも構わない。
マッピングしたら、postmapコマンドでhashデータベースファイルを作る。

[text]
# postmap /etc/postfix/virtual < virtual
[/text]

sendmailと同様にaliasesファイルでエイリアスが作成できるので、必要に応じて設定する。

[text]
# vi /etc/aliases
[/text]

書いたらnewaliasesコマンドを忘れずに。

[text]
# newaliases
[/text]

すべての設定が完了したら、サーバを起動する。

[text]
# service postfix start
[/text]

tail -10 /var/log/maillogぐらいしてサーバログを確認する。以下のようなメッセージが出ていればOK。CentOSなどのLinuxであればserviceコマンドで「OK」と正常起動が見えると思うが、なるべくログを確認する習慣は身に着けておくほうがいい。

[text]
Jan 29 13:10:52 myhost postfix/postfix-script[22370]: starting the Postfix mail system
Jan 29 13:10:53 myhost postfix/master[22371]: daemon started — version 2.6.6, configuration /etc/postfix
[/text]

設定が終わり、サーバが起動できたとしても、使えるかどうかわからないのでテスト。
いきなりメールを出して届くかどうか……などと素人っぽいテストをせず、SMTPでおしゃべりして確認をしてみる。というかこれはもはや修正……。

ポート番号指定可能なtelnetコマンドが使えるOS上でtelnetを使ってSMTPおしゃべりを実施する。同時にサーバ上のログtail -f /var/log/maillogで状況を確認するほうが望ましい。
まず、仮想ドメイン設定が失敗している場合は、以下のような感じになるだろう。

[text]
% telnet myhost.example.jp 25
Trying 192.168.1.123…
Connected to myhost.example.jp.
Escape character is ‘^]’.
220 myhost.example.co.jp ESMTP Postfix
HELO example2.jp
250 myhost.example.co.jp
MAIL FROM:<test@example2.jp>
250 2.1.0 Ok
RCPT TO:<user@example.jp>
550 5.1.1 <user@example.jp> Recipient address rejected: User unknown in virtual alias table
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
[/text]

「550 5.1.1 <user@example.jp> Recipient address rejected: User unknown in virtual alias table」と出ている。postfixはエラーメッセージが具体的なので分かりやすい。この時、サーバログを見ていると、同時にこんな感じのエラーが出ているだろう。結局同じメッセージなのだが。

[text]
Jan 29 13:10:20 ip-10-132-148-202 postfix/smtpd[22262]: NOQUEUE: reject: RCPT from www14.inetd.co.jp[172.16.55.66]: 550 5.1.1 <user@example.jp> Recipient address rejected: User unknown in virtual alias table; from=<test@example2.jp> to=<user@example.jp> proto=SMTP helo=<example2.jp>
[/text]

このエラーはvirtual aliasファイルに問題があったということで、/etc/postfix/virtualが存在しないなどの場合だ。main.cfでの記述が間違えているか、portmapコマンドを叩き忘れているか、hashファイルが作成されていないか……などを確認して修正して、リトライする。

[text]
% telnet myhost.example.jp 25
Trying 192.168.1.123…
Connected to myhost.example.jp.
Escape character is ‘^]’.
220 myhost.example.co.jp ESMTP Postfix
HELO example2.jp
250 myhost.example.co.jp
MAIL FROM:<test@example2.jp>
250 2.1.0 Ok
RCPT TO:<user@example.jp>
250 2.1.5 Ok
DATA
354 End data with <cr><lf>.<cr><lf>
Subject: test
From: test@example2.jp
To: user@example.jp

test
.
250 2.0.0 Ok: queued as 7D23825438
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
[/text]

今度はうまくいったようだ。エラーログを確認する。

[text]
Jan 29 15:11:27 myhost postfix/local[24110]: 1D7DD25439: to=<user@example.co.jp>, orig_to=<user@example.jp>, relay=local, delay=0.07, delays=0.04/0.02/0/0.01, dsn=2.0.0, status=sent (forwarded as 28A1D2543A)
[/text]

ところでログには「to=<user@example.co.jp>, orig_to=<user@example.jp>」のようになっているが、これは実ドメイン名で運用されているホスト宛に仮想ドメイン名を持つアドレス宛のメールが届いた場合、orig_toとしてRCPT TOで渡されたアドレスを保持し、実ドメイン名宛となる「to=<user@example.co.jp>」を示している。
実ドメイン名のアドレスで送った場合には、以下のような感じになる。

[text]
Jan 29 15:13:25 myhost postfix/local[26452]: CE3A5265C5: to=<user@example.co.jp>, relay=local, delay=0.08, delays=0.06/0.01/0/0.01, dsn=2.0.0, status=sent (forwarded as 717FD26605)
[/text]

RCPT TOで指定されたアドレスは実ドメイン名のものだったので、特にorig_toなどが記録されない。

さて、実際に届いているかどうかはメールソフトで確認するか、mboxやmaildirを探してみるのがいいだろう。

実践Postfixメールサーバー構築Postfix実践入門 (Essential Software Guide Book)Linuxで作る完全メールシステム構築ガイド―sendmail/Postfix/qmail対応 (Network Server Construction Guide Series)CentOS 6で作るネットワークサーバ構築ガイド (Network Server Construction Guide S)すっきりわかった!Webサーバ Apacheで作るWebサイト (NETWORK MAGAZINE BOOKS)クラシコ 4チーズアルフレッド 420g

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください