[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

FreeBSD/NetBSD で postfix

NetBSD をインストールしてみたら(→
こちら)、 postfix がデフォルトで入って いました。
少し qmail を使ったくらいで、ほとんどのマシンで sendmail を動かして おりました。ここらでぼちぼち別の MTA も触ってみようと思い、設定して みました。

目次


1. 環境

OS:FreeBSD-4.1R (しかも VMware 上…) or NetBSD-1.5/sparc
package:postfix-19991231.08.tgz (FreeBSD の場合)
配送経路:in.usupi.org-> 自分(192.168.0.1)
test.usupi.org-> 192.168.1.250
その他-> 192.168.0.211 に丸投げ

このマシンは、外の世界と直接設定しません。内部のわかっているところ には自力で配送しますが、外部には別のマシンに丸投げします。

2. 設定

パッケージを使いますので、インストールは割愛します。
設定ファイルは /usr/local/etc/postfix 以下にあります。(NetBSD だと /etc/postfix)
まずは main.cf を編集します。

myhostnameこのホストの FQDN 名を指定します。
ex: myhostname = mail.in.usupi.org
mydomainホスト名を除いたドメイン名を指定します。
ex: mydomain = in.usupi.org
myoriginlocal で送信されるメールに使われるドメインを指定します。
ex: myorigin = $mydomain
mydestinationこのマシンで処理するアドレスを指定します。
ex: mydestination = $myhostname, localhost.$mydomain
relay_domains 信頼できないマシンからでも許可する宛先アドレスを指定します。
ex: relay_domains = usupi.org
mynetworks信頼できるマシンを指定します。
ex: mynetworks = 192.168.0.0/24, 127.0.0.0/8
transport_maps独自の配送経路を指定します。
ex: hash:/usr/local/etc/postfix/transport
relay_host配送経路のわからないメールの丸投げ先を指定します。
(これがなければ MX を見ます。)
ex: relay_host = [192.168.0.211]

transport_maps で指定したファイルの中身は、例えば以下のようにします。

  in.usupi.org        local:
  .in.usupi.org       local:
  test.usupi.org      smtp:[192.168.1.250]
  .test.usupi.org     smtp:[192.168.1.250]
  # default relay == $relayhost

# で始まる行やブランクは無視されます。
最初にドメインを指定し、マッチしたときの動作を次に指定します。
例えば、1行目は、in.usupi.org 宛のメールを local で受け取る指定を 行っています。2行目も同じようなものなのですが、ドメインの先頭に . を書くと、サブドメインもすべて受け取るようになります。
前述の mydestination で指定をしても、transport_maps を指定すると 効果がなくなるようですので、こちらでも明記しておく必要があります。
smtp: ですと、: の後に指定したホストに投げるようになります。DNS が 引ける環境でしたらそのままホスト名(FQDN 名)を指定すればよいですし、 IPアドレスで指定するなら [] で囲んでやります。
# この辺は CF と同じなのでわかりやすいですね。
最後に、テキストの形式よりも効率のよい形式に変換してやります。

  # postmap /usr/local/etc/postfix/transport

# くどいですが、NetBSD だと /etc/postfix/transport です。

3. 起動とテスト

sendmail が動いているなら、止めます。また、キューに溜っていないか mailq で調べ、残っていたら処理させます。

  # kill sendmailのPID
  # mailq
  ...残っているなら...
  # sendmail -q

そして、以下のようにして起動します。

  # postfix start

何やら warning のようなものが出力されますが、気にしないでおきます。
次に、Mail コマンドなどで確認します。

  % echo "This is a test." | Mail -s test メールアドレス

例えば、ローカルユーザにメールを出したとしますと、今まで通り /var/mail/ユーザ に届きます。前述の main.cf で、home_mailbox = Mailbox としますと、ホームの Mailbox というファイルに届きます。
/var/log/maillog で確認します。(\ で折り返しています。)

  # tail /var/log/maillog
  ...略
  日時 mail postfix/pickup[5005]: E875A16481: uid=0 from=<root>
  日時 mail postfix/cleanup[5013]: E875A16481: message-id=...
  日時 mail postfix/qmgr[5006]: E875A16481: from=...
  日時 mail postfix/local[5015]: E875A16481: to=... relay=local, delay=1, \
  status=sent (mailbox)

status=sent になっていれば、問題なく配送されています。
リモートアドレスに対しても確認しておきます。

  # echo "test to remote."|Mail -s test usu@some.where.com
  # tail /var/log/maillog
  日付 mail postfix/cleanup[5058]: 0403916481: message-id=...
  日付 mail postfix/qmgr[5006]: 0403916481: from=...
  日付 mail postfix/smtp[5060]: 0403916481: to=<usu@some.where.com>, \
  relay=192.168.0.211[192.168.0.211], delay=1, status=sent (250 2.0.0 \
  f6A8wbw17190 Message accepted for delivery)

別のマシンがこのマシンに丸投げするようになっている場合は、それも確か めておきます。

  cli% echo "test from cli.in.usupi.org"|Mail -s test usu@test.usupi.org

  # tail /var/log/maillog
  ...略
  日付 mail postfix/smtpd[4717]: connect from cli[192.168.0.20]
  日付 mail postfix/smtpd[4717]: C26C216481: client=cli[192.168.0.20]
  日付 mail postfix/cleanup[4718]: C26C216481: message-id=...
  日付 mail postfix/qmgr[221]: C26C216481: from=...
  日付 mail postfix/smtpd[4717]: disconnect from cli[192.168.0.20]
  日付 mail postfix/smtp[4720]: C26C216481: to=<usu@test.usupi.org>, \
  relay=192.168.1.250[192.168.1.250], delay=26, status=sent \
  (250 Message accepted for delivery)

これは外部にさらされるマシンではないため、スパム等のリレーホストに される心配はない(あるいはされても気にしない?)のですが、mynetworks 以外 からは、relay_domains 以外のアドレスを拒否することを確認しておきます。
(直接 SMTP で確認しています。雑誌などには、mynetworks に含まれるマシン からでも、最初の HELO で別のドメインを指定すれば拒否されると書かれて いましたが、やってみるとうまくいきません。ですのでわざわざ外のマシン から試しました…。)

  % telnet 192.168.0.1
  Trying 192.168.0.1...
  Connected to mail.in.usupi.org.
  Escape character is '^]'.
  220 mail.in.usupi.org ESMTP Postfix
  HELO cli2.test.usupi.org
  250 mail.in.usupi.org
  MAIL FROM:<usu@usupi.org>
  250 Ok
  RCPT TO:<usu@some.where.com>
  554 <usu@some.where.com>: Recipient address rejected: Relay access denied
  QUIT
  221 Bye
  Connection closed by foreign host.

上記で不都合があれば、main.cf や transport を修正します。 修正したら、postfix に知らせます。
# transport を修正したら、以下の前に postmap の実行を忘れないようにしましょう。

  # postfix reload
  postfix-script: refreshing the Postfix mail system


4. sendmail からの移行

まず、OS 起動時に sendmail が動かないようにします。
/etc/rc.conf で sendmail_enable が YES になっている(NetBSD の場合は sendmail=YES)と思いますので、NO に変更します。
次に、OS 起動時に postfix が起動するようにします。
NetBSD の場合は、/etc/rc.conf に postfix=YES と書くだけです。FreeBSD の場合は、/usr/local/etc/rc.d に以下のようなスクリプトを置きます。

  #!/bin/sh
  /usr/local/sbin/postfix $*

あとは、mailq や newaliases などが、postfix の sendmail 互換プログラム を経由するようにします。 FreeBSD の場合は、/etc/mail/mailer.conf を以下のように変更します。

  sendmail	/usr/local/sbin/sendmail
  send-mail	/usr/local/sbin/sendmail
  mailq		/usr/local/sbin/sendmail
  newaliases	/usr/local/sbin/sendmail

NetBSD の場合は、/etc/mailer.conf を以下のように変更します。

  sendmail        /usr/libexec/postfix/sendmail
  send-mail       /usr/libexec/postfix/sendmail
  mailq           /usr/libexec/postfix/sendmail
  newaliases      /usr/libexec/postfix/sendmail
  hoststat        /usr/libexec/postfix/sendmail
  purgestat       /usr/libexec/postfix/sendmail

# hosttstat や purgestat が何なのかよくわかってませんが…。(^__^;;;

5. 感想

sendmail ですと、CF 等で sendmail.cf を作成し(もはや素で書いたりは しないと思いますが…昔は直接編集することもありましたが…もう忘れま した…それにスクラッチで書いたりはしないですよね…)、 sendmail を一旦殺して…という手順が必要でした。
postfix だと、main.cf などを編集して reload するだけで設定が反映 されますので、楽だな〜という印象を受けました。
また、Maildir 形式も扱えますので、のちのち Mailbox 形式で致命的な セキュリティホールなどがブーム(?)になっても、ささっと移行できる… かもしれません。
ただ、sendmail に慣れ過ぎていることもあって、上記よりももっと細かい 設定をよくわかってません。バーチャルドメインなど結構ややこしそう (裏を返せばいろいろできるってことだと思いますが…)なので、これから 勉強して覚えないとな〜と思いました。

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Wed Jul 11 04:50:04 2001