FreeBSD7.1RにSMTPサーバ(Postfix)をインストール

Postfix は、メール配信サーバ(MTA)であり、sendmailの代わりに使用する。

ただし、SMTPサーバとしての機能しか持たないため、POPサーバを動かしたい場合はqpopperなどを別途インストールする必要がある。

インストール

  • インストール時にオプション選択画面になった。下記の2つを選んでみた。
    • TLS Enable SSL and TLS support
    • BDB Berkeley DB ( choose version with WITH_BDB_VER )
%su
Password:
# cd /usr/ports/mail/postfix24
# make install clean
 
以降、2回ほど質問されるので共に y で答える。
 
You need user "postfix" added to group "mail".
Would you like me to add it [y]? y
・
・
・
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y
# rehash

インストールが完了すると、postfixユーザとグループが作られて、/etc/mail/mailer.confが書き換わる。

さらに、/usr/local/etc/rc.d/postfix が作られる。

sendmailからPostfixのsendmail互換インターフェイスへ

FreeBSDインストール時のデフォルトのMTAであるsendmail。これをPotfixに置き換える作業から行う。

sendmailは、perlスクリプトの中で、パイプを利用したメール送信などに利用することがある。こういった資産をそのまま活かすための確認も行うことにする。

mailwrapper設定ファイルを確認

Postfixインストール前の /etc/mail/mailer.conf は、次のような内容で、

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

Postfixをインストールすると、これが書き換わって、次のようになる。

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

コマンドラインから次のように入力した時、

# /usr/sbin/sendmail

/usr/sbin/sendmailは、/usr/sbin/mailwrapperへのシンボリックリンクであり、なおかつ、上記の/etc/mail/mailer.confの内容に従ってMTAを起動する。従って、次のコマンドを入力したのと同じである。

# /usr/local/sbin/sendmail

FreeBSDインストール時に動かしていた sendmailコマンドが、postfix(のsendmail互換インターフェイス)に置き換わったことを意味する。

  • ただし、まだpopstfixを起動していないので、従来のsendmailデーモンが動いているままのはずだ。

/etc/rc.confを設定する

さて、/etc/rc.conf の設定の前に、お約束事として /etc/default/rc.conf の中からsendmailについて確認しておく。次のような内容だ。

##############################################################
###  Mail Transfer Agent (MTA) options  ######################
##############################################################

mta_start_script="/etc/rc.sendmail"
                                     # Script to start your chosen MTA, called by /etc/rc.
# Settings for /etc/rc.sendmail and /etc/rc.d/sendmail:
sendmail_enable="NO"                 # Run the sendmail inbound daemon (YES/NO).
sendmail_pidfile="/var/run/sendmail.pid"        # sendmail pid file
sendmail_procname="/usr/sbin/sendmail"          # sendmail process name
sendmail_flags="-L sm-mta -bd -q30m" # Flags to sendmail (as a server)
sendmail_submit_enable="YES"         # Start a localhost-only MTA for mail submission
sendmail_submit_flags="-L sm-mta -bd -q30m -ODaemonPortOptions=Addr=localhost"
                                     # Flags for localhost-only MTA
sendmail_outbound_enable="YES"       # Dequeue stuck mail (YES/NO).
sendmail_outbound_flags="-L sm-queue -q30m"     # Flags to sendmail (outbound only)
sendmail_msp_queue_enable="YES"      # Dequeue stuck clientmqueue mail (YES/NO).
sendmail_msp_queue_flags="-L sm-msp-queue -Ac -q30m"
                                     # Flags for sendmail_msp_queue daemon.
sendmail_rebuild_aliases="NO"        # Run newaliases if necessary (YES/NO).

さらに、/usr/local/etc/rc.d/postfix のヘッダを見る。

# Add the following lines to /etc/rc.conf to enable postfix:
# postfix_enable (bool):        Set it to "YES" to enable postfix.
#                               Default is "NO".
# postfix_pidfile (path):       Set full path to master.pid.
#                               Default is "/var/spool/postfix/pid/master.pid".
# postfix_procname (command):   Set command that start master. Used to verify if
#                               postfix is running.
#                               Default is "/usr/local/libexec/postfix/master".
# postfix_flags (str):          Flags passed to postfix-script on startup.
#                               Default is "".

そして、なんとなく説明を解釈しながら /etc/rc.conf に追記する。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

postfix_enable="YES"

これで従来のsendmailがデーモン起動しなくなり、変わりに /usr/local/etc/rc.d/postfix が動くようになる。

/usr/local/etc/postfix/main.cfを設定する

まず最初に、$myhostnameと$mydomainにはどんな値がセットされているか

$myhostnameは、ローカルマシン名。つまり、/etc/rc.conf の hostname に設定されている文字列。ホスト名を含むドメイン名。

$mydomainは、ローカルドメイン名。つまり、/etc/rc.conf の hostname に設定されている文字列の、先頭文字から最初のドットまでと取り除いた文字列。なので、マシンが持つべきドメイン名。

例えば、/etc/rc.conf の hostname = “mugen.vdobv.com” の場合、$myhostname は、mugen.vdobv.com であり、$mydomain は、vdobv.com となる。

myhostname と mydomain

ここで、/usr/local/etc/postfix/main.cf の、myhostname と mydomain を変更したらどうなるか。

まず、/usr/local/etc/postfix/main.cf の myhostname = virtual.domain.tld とした場合、$myhostname は、virtual.domain.tld となり、$mydomain は、domain.tld となる。

myhostname = virtual.domain.tld

そのまま、/usr/local/etc/postfix/main.cf の mydomain = mydomain.tld とした場合、$myhostname は、virtual.domain.tld のままであり、$mydomain は、mydomain.tld となる。

myhostname = virtual.domain.tld
mydomain = mydomain.tld

また、myhostname は設定せず、/usr/local/etc/postfix/main.cf の mydomain = mydomain.tld とだけを設定した場合、上記の例で言えば、$myhostname は、mugen.vdobv.com となり、$mydomain は、mydomain.tld となる。

#myhostname = virtual.domain.tld
mydomain = mydomain.tld

まとめて表にしてみた

例として、/etc/rc.conf の hostname = “mugen.vdobv.com” と設定してある場合。

myhostnamemydomain$myhostname$mydomain
未設定未設定mugen.vdobv.comvdobv.com
virtual.domain.tld未設定virtual.domain.tlddomain.tld
virtual.domain.tldmydomain.tldvirtual.domain.tldmydomain.tld
未設定mydomain.tldmugen.vdobv.commydomain.tld

メールボックスに保管するメールアドレス

下記はあくまでもサンプルであるが、このような設定をしておくと、○○○@vdobv.com や ○○○@watasinodomain.abc 宛てのメールが流れてきた場合に、自サーバが最終地点であるとしてメールボックスに保管する。

  • $mydomain には、vdobv.com がセットされているものとする。
mydestination = $mydomain, watasinodomain.abc
  • 外部サーバから自サーバへのメール配信においては、DNSで名前解決を正しく設定しておかなければならない。

localhost(つまりサーバ自身)から送信するメールの@以降を設定

以下は自サーバから送信するメールの@以降をvdobv.comとしている。

  • $mydomain には、vdobv.com がセットされているものとする。
myorigin = $mydomain
  • 何も設定をしない場合は、$myhostname が設定される。

簡単にテストするには、自サーバでmailコマンドを使って、外部サーバのメールアドレス宛てに送ってみるとよい。

メールボックスのディレクトリ

下記は、/var/mail 配下にユーザ名ごとのメールボックスを作る設定。デフォルト値と同じ。

  • home_mailbox はコメントアウトでOK。
#home_mailbox = MailBox
#home_mailbox = MailBox/
mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail

メール受信サイズとメールボックスサイズ

数値は適当に。記載場所も適当に。

message_size_limit = 102400000
mailbox_size_limit = 512000000

受信を許可するホスト

下記は、全てのホスト、サーバから受信を許可する。これは、このままで良い。

inet_interfaces = all

リブートしてデーモンを起動する

# reboot

サーバが再起動したら、次のコマンドを入力して、デーモン起動を確認する。

$ su
Password:
# ps aux | grep sendmail
# ps aux | grep post
root      920  0.0  0.2  5636  2428  ??  Ss    6:53PM   0:00.01 /usr/local/libexec/postfi
postfix   921  0.0  0.2  5636  2424  ??  S     6:53PM   0:00.01 pickup -l -t fifo -u
postfix   922  0.0  0.2  5636  2484  ??  I     6:53PM   0:00.01 qmgr -l -t fifo -u

MAILコマンドで自サーバから送信

mailコマンドは簡易メーラーであり、実際にメール送信を担当するMTAは/etc/default/rc.confに記述されたmta_start_script=”/etc/rc.sendmail”である。

Postfixをインストールした後も、sendmail(互換インターフェイスである)が動くことを確認したい。

次のようにすると、yourname@外部ドメイン 宛てにメールが送信できる。

# mail -s "Subject" yourname@外部ドメイン
送信文章
送信文章
送信文章
.

ここで、postfixのデーモンを落とし、さらに、/etc/rc.confの postfix_enable=“YES”をコメントアウトしてみる。

# /usr/local/etc/rc.d/postfix stop
# vi /etc/rc.conf
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
#postfix_enable="YES"

ここで、先ほどと同じように、MAILコマンドを使ってメール送信をしてみると、実際には送信先のサーバまでメールが配信されない。

再び/etc/rc.conf のコメントアウトを外し、/usr/local/etc/rc.d/postfix start をすると、メールが流れ出てゆく。

perlスクリプトでsendmailできるか確認しよう

例えば、従来からperlスクリプト内でsendmailを利用していたと想定して、/usr/sbin/sendmail(Postfixのsendmail互換インターフェイスが動く)を使ったスクリプトをファイルに書き込む。テスト用に外部サーバの送信先メールアドレスを用意して決めておくこと。

# cd
# pwd
/root
# vi mailsend.pl

下記がテスト用のperlスクリプト(mailsend.plの内容)。

#!/usr/local/bin/perl
 
$to = 'yourname@外部ドメイン';     # 確実に受信テストができるメールアドレス
$from = 'root@内部ドメイン';           # 送信テストする送信元メールアドレス
 
open( MAIL, "|/usr/sbin/sendmail -t" );
print MAIL <<EOF;
To:$to
From:$from
Subject:Send Test Perl Mail
 
TEST-BODY
EOF
close( MAIL );
 
1;

保存したら、パーミッションを変えて実行。

# chmod 700 mailsend.pl
# ./mailsend.pl

クライアントパソコンなどのメーラーを使って、yourname@外部ドメイン のメールを受信してみる。

SMTPとしての設定

上記のMAILコマンドによるMTA(メール配信エージェント)との連携は、localhost(つまりサーバ自身)に保存されているメールを閲覧したり、他のサーバへメールを送信したりする場合のテストである。MAILコマンドを利用することで、sendmail(ここではPostfixのsendmail互換機能が動く)がメールを配信し、自サーバのメールを蓄えてくれる。

ところが、別マシンであるクライアントコンピュータから(このサーバに接続して)メールを送受信するためには、このサーバコン上でSMTPサーバとPOPサーバを動かしておく必要がある。PostfixはSMTPサーバとしての機能を持っているため、ここではSMTPサーバの設定方法を記録しておく。

/usr/local/etc/postfix/main.cfを設定する

/usr/local/etc/postfix/main.cf で postfix の動作を設定することができる。main.cf への変更を反映するには、postfixをリスタートすること。

# /usr/local/etc/rc.d/postfix restart
postfix/postfix-script: stopping the Postfix mail system
postfix/postfix-script: starting the Postfix mail system

SMTPクライアントとして許可するIPアドレス

下記は、SMTPクライアントとして、メール送信を受け付けるIPアドレス空間。

mynetworks = 192.168.0.0/24, 127.0.0.0/8
  • mynetworksを有効にする場合はmynetworks_styleは無効になる。
  • mynetworksとmynetworks_styleに何も設定しない場合は、mynetworks_style = subnet として動くので注意。

SMTPクライアントとして許可するホスト

下記は、SMTPクライアントとして、メール送信を受け付けるホスト。

relay_domains = $mydestination

エイリアスを設定してメール転送

/etc/aliases を書き換えて、newaliases を実行すると、Aさんに届いたメールをBさんに送り届けることができる。

  • /etc/aliases は /etc/postfix/aliases へのソフトリンクである。

例えば、/etc/aliasesを次のように書くと、kenjiに届いたメールはrootに流れ、サーバ内のrootに届いたメールはyourname@ホスト名.ドメイン名に流れる。

root: yourname@ホスト名.ドメイン名
kenji: root

/etc/aliases を変更したら、postaliasを実行して /etc/aliases.db を更新すること。

# postalias -v hash:/etc/aliases

Postfixの(spam等)配送制限の判定順序のメモ

以下、smtpd_delay_reject = yes(デフォルト)の場合、RCPT TO:を待ってから判定する。

1.smtpd_client_restrictions

クライアントがPostfixにTCP(Port:25)で接続要求する時に接続元を判定する。

2.smtp_helo_restrictions

smtpd_helo_required = yes の場合に限る。HELOコマンド受付の際に判定する。

3.smtp_sender_restrictions

MAIL FROM: について判定する。

4.smtpd_recipient_restrictions

RCTP TO: について判定する。

5.header_checks と body_checks

ヘッダ部とボディ部の内容で判定する。

ん~と

その他、スパム対策や、バーチャルドメインを利用する場合など、設定を行うたびに追記していくことにする。

freebsd7.1r/postfix.txt · 最終更新: 2009/03/22 15:55 by vdobv
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0