Postfix は、メール配信サーバ(MTA)であり、sendmailの代わりに使用する。
ただし、SMTPサーバとしての機能しか持たないため、POPサーバを動かしたい場合はqpopperなどを別途インストールする必要がある。
%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 が作られる。
FreeBSDインストール時のデフォルトのMTAであるsendmail。これをPotfixに置き換える作業から行う。
sendmailは、perlスクリプトの中で、パイプを利用したメール送信などに利用することがある。こういった資産をそのまま活かすための確認も行うことにする。
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互換インターフェイス)に置き換わったことを意味する。
さて、/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 が動くようになる。
$myhostnameは、ローカルマシン名。つまり、/etc/rc.conf の hostname に設定されている文字列。ホスト名を含むドメイン名。
$mydomainは、ローカルドメイン名。つまり、/etc/rc.conf の hostname に設定されている文字列の、先頭文字から最初のドットまでと取り除いた文字列。なので、マシンが持つべきドメイン名。
例えば、/etc/rc.conf の hostname = “mugen.vdobv.com” の場合、$myhostname は、mugen.vdobv.com であり、$mydomain は、vdobv.com となる。
ここで、/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” と設定してある場合。
| myhostname | mydomain | $myhostname | $mydomain |
|---|---|---|---|
| 未設定 | 未設定 | mugen.vdobv.com | vdobv.com |
| virtual.domain.tld | 未設定 | virtual.domain.tld | domain.tld |
| virtual.domain.tld | mydomain.tld | virtual.domain.tld | mydomain.tld |
| 未設定 | mydomain.tld | mugen.vdobv.com | mydomain.tld |
下記はあくまでもサンプルであるが、このような設定をしておくと、○○○@vdobv.com や ○○○@watasinodomain.abc 宛てのメールが流れてきた場合に、自サーバが最終地点であるとしてメールボックスに保管する。
mydestination = $mydomain, watasinodomain.abc
以下は自サーバから送信するメールの@以降をvdobv.comとしている。
myorigin = $mydomain
簡単にテストするには、自サーバでmailコマンドを使って、外部サーバのメールアドレス宛てに送ってみるとよい。
下記は、/var/mail 配下にユーザ名ごとのメールボックスを作る設定。デフォルト値と同じ。
#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コマンドは簡易メーラーであり、実際にメール送信を担当する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を利用していたと想定して、/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@外部ドメイン のメールを受信してみる。
上記のMAILコマンドによるMTA(メール配信エージェント)との連携は、localhost(つまりサーバ自身)に保存されているメールを閲覧したり、他のサーバへメールを送信したりする場合のテストである。MAILコマンドを利用することで、sendmail(ここではPostfixのsendmail互換機能が動く)がメールを配信し、自サーバのメールを蓄えてくれる。
ところが、別マシンであるクライアントコンピュータから(このサーバに接続して)メールを送受信するためには、このサーバコン上でSMTPサーバとPOPサーバを動かしておく必要がある。PostfixはSMTPサーバとしての機能を持っているため、ここではSMTPサーバの設定方法を記録しておく。
/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アドレス空間。
mynetworks = 192.168.0.0/24, 127.0.0.0/8
下記は、SMTPクライアントとして、メール送信を受け付けるホスト。
relay_domains = $mydestination
/etc/aliases を書き換えて、newaliases を実行すると、Aさんに届いたメールをBさんに送り届けることができる。
例えば、/etc/aliasesを次のように書くと、kenjiに届いたメールはrootに流れ、サーバ内のrootに届いたメールはyourname@ホスト名.ドメイン名に流れる。
root: yourname@ホスト名.ドメイン名 kenji: root
/etc/aliases を変更したら、postaliasを実行して /etc/aliases.db を更新すること。
# postalias -v hash:/etc/aliases
以下、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
ヘッダ部とボディ部の内容で判定する。
その他、スパム対策や、バーチャルドメインを利用する場合など、設定を行うたびに追記していくことにする。