sendmail の代替 MTA として、qmail, postfixというものがあります。sendmail や qmail について記述したページを作ったので、ついでに Postfix のページも作ります。(インストール方法だけというすごく大雑把な内容です)
Postfix のオフィシャルサイトへ行くと、ダウンロードサイトのリストがあるので一番身近なダウンロードサイトからソースを入手します。
Postfix オフィシャルページ オリジナルサイト
ダウンロードサイトのリスト http://www.postfix.org/ftp-sites.html
postfix-20010228-pl08.tar.gz リリースされている最新のものを入手(Snapshotでないもの)
Postfix モジュールをダウンロードして展開します。 Postfix で必要となるユーザーやグループを新規に登録します。(インストールドキュメントでは、モジュールをインストールする直前でユーザー登録を行っている)作業はスーパーユーザーで行います。 また、Redhat Linux 6.2 で作業を行いました。
postfix というユーザーを、むやみにログインできないようにシェルなしで登録します。そして、postfix 宛てのメールを root に振ります。
# useradd -s /bin/true postfix # edit /etc/aliases postfix: root # newaliases今まで利用していた sendmailを終了させ、起動されないような手続きを行います。sendmail の終了は kill コマンドを使用して sendmailプロセスを終了させます。その後、sendmail が起動されないようにします。queue にある未処理のメールを配送する。
# kill -TERM 'process number of sendmail' # mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF # mv /usr/bin/newaliases /usr/bin/newaliases.OFF # mv /usr/bin/mailq /usr/bin/mailq.OFF # chmod 755 /usr/sbin/sendmail.OFF # /usr/sbin/sendmail.OFF -qダウンロードしてきたソースの展開とコンパイル。
# gzip -dc postfix-20010228-pl08.tar.gz | tar xf - # cd postfix-20010228-pl08 # makeコンパイルが終了したら、インストールします。このときに、インタラクティブにいろいろと入力を求められます。全て [] 内のデフォルト設定でインストールして構わなければ、リターンキーを入力していきます。
# make install Warning: this script replaces existing sendmail or Postfix programs. Make backups if you want to be able to recover. ... install_root: [/] <Enter> tempdir: [/tmp/postfix-20010228-pl08] <Enter> config_directory: [/etc/postfix] <Enter> daemon_directory: [/usr/postfix/bin] <Enter> command_directory: [/usr/postfix/bin] <Enter> queue_directory: [/var/spool/postfix] <Enter> sendmail_path: [/usr/sbin/sendmail] <Enter> newaliases_path: [/usr/bin/newaliases] <Enter> mailq_path: [/usr/bin/mailq] <Enter> mail_owner: [postfix] <Enter> setgid: [no] <Enter> manpages: [/usr/local/man] <Enter> ... #
Postfix では、mail.cf というファイルを編集することで環境を設定することが出来ます。postfix コマンドに引数 check を付けて実行すると設定内容がチェックできます。syslog 等のログにエラーが出力されていないか調べる。Berkeley DB を使用していると想定しています。
# cd /etc/postfix # cp main.cf main.cf.org # edit main.cf # 最低限必要な設定 myhostname = myhost.foobar.co.jp mydomain = foobar.co.jp myorigin = $myhostname inet_interfaces = all mydestination = $myhostname, localhost.$mydomain alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases transport_maps = hash:/etc/postfix/transport mail_spool_directory = /var/mail mynetworks_style = subnet # /usr/sbin/postfix checkメールアドレスのエイリアスを記述する
/etc/aliases、配送方法のマップを記述する/etc/postfix/transportはpostmap コマンドでデータベースを作成します。# edit /etc/aliases webmaster: sysadmin support: user1, user2 # edit /etc/postfix/transport docomo.ne.jp smtp:[mail.foobar.co.jp] .docomo.ne.jp smtp:[mail.foobar.co.jp] # postmap hash /etc/aliases # postmap hash /etc/postfix/transport
起動には、postfix コマンドに引数 start を付けて実行することで MTA として起動されます。
# /usr/sbin/postfix startこのプログラムを、OS 起動時に実行するように /etc/rc.d 以下の必要な場所にスクリプトを記述しておくと良い。
Postfix には、メール配送方法を制御するパラメータがいくつか用意されています。外部ホストから受信したメッセージをどのように配送するかを制御するといった、最も一般的なメールのリレー制御は smtpd_recipient_restrictions というパラメータを使用します。これらはやはり、main.cf 設定ファイルに記述します。ソースパッケージに付属の sample-smtpd.cf ファイルを参考にすると良い。smtpd_recipient_restrictions パラメータで良く使われると思われるものを表にしておきます。また、以下の太字表示の内いずれかひとつは必ず設定されていなければなりません。
値 制限される要求permit_mynetworks ローカルネット上の IP Address を持つクライアントを許可する permit 任意のクライアントに対して任意のホストへのリレーを許可する permit_auth_destination $check_relay_domains の基準に合うメッセージを許可する permit_mx_backup DNSの MXレコードのエントリーにあるドメイン宛のメッセージ受信を許可する check_relay_domains $mydestination, $inet_interfaces, $virtual_maps, $relay_domains それぞれのパラメータ値にリストされたアドレス宛かチェックする reject ローカルを含めすべてのメッセージを拒否する reject_invalid_hostname 無効な HELOホスト名の場合拒否する reject_maps_rbl $maps_rbl_domains(Realtime Blackhole List)に登録されているクライアントからのメッセージを拒否する reject_non_fqdn_hostname FQDN(Fully Qualified Domain Name)でない HELOホスト名の場合拒否する reject_non_fqdn_recipient 受信者アドレスが FQDNでない場合拒否する reject_non_fqdn_sender 送信者アドレスが FQDNでない場合拒否する reject_unauth_destination $check_relay_domains の基準に合わないメッセージはすべて拒否する reject_unauth_popelining パイプを使用するプログラムから送信されたメールを拒否する reject_unknown_client クライアントのホスト名が不明な場合拒否する reject_unknown_hostname DNS の Aレコードや MXレコードのエントリーにない HELOホスト名の場合拒否する reject_unknown_recipient_domain 受信者のメールアドレスが DNS の Aレコードや MXレコードを持たない場合拒否する reject_unknown_sender_domain 送信者のメールアドレスが DNS の Aレコードや MXレコードを持たない場合拒否する check_client_access
check_helo_access
check_recipient_access
check_sender_accessデータベースに登録されたホストやIP Address、ドメインなどに対するアクセス設定が行えます
check_client_access hash:/etc/postfix/clientsといった形式で、データベースのタイプとデータベース名を指定します。
データベースのレコードフォーマットは
address actionとなり、address フィールドには、ホスト名、IP Address、ドメイン名、IPネットワークの範囲を指定できます。action フィールドには、指定された address に対するアクションを記述します。
REJECT - 拒否
4xx text - textをメッセージとした一時的なエラー
5xx text - textをメッセージとした永続的なエラーテキスト形式でデータベースのテーブルファイルを上記の形式で作成したら、postmap コマンドでバイナリーのデータベースファイルを作成します。
postmap hash /etc/postfix/clientsまた、以下のように指定すると、データベースに登録されたホストやドメインはすべて拒否することになります
smtpd_recipient_restrictions = check_client_access hash:/etc/postfix/clients, rejectDRAC を利用してPOP before SMTPを設定する場合、
check_client_accessとして以下のように設定します。smtpd_recipient_restrictions = check_client_access hash:/etc/mail/dracd
Postfixでは、前節のようにリレーに関する細かい設定が行えますが、これをホスト/HELO/MAIL FROM: に対しても設定することができます。
確認 パラメータ 設定例送信元ホスト smtpd_client_restrictions = check_client_access hash:/etc/postfix/bad_clientsHELOコマンド smtpd_helo_restrictions = reject_unknown_hostname, permit_mynetworks = check_helo_access hash:/etc/postfix/bad_heloMAIL FROM: コマンド smtpd_sender_restrictions = reject_unknown_sender_domain, permit_mynetworks = check_sender_access hash:/etc/postfix/bad_secerメッセージフィルタを利用してメールを拒否することもできます。Postfix の header_checks パラメータを利用すると、メッセージヘッダーをスキャンし、特定のフレーズを含むメッセージの配送をブロックすることができます。
header_checks = regexp:/etc/postfix/bad_headerと設定(正規表現テーブルを使用する場合)し、以下のレコードフォーマットでファイルを作成します。
pattern actionpattern はヘッダーフィールドでマッチングされる正規表現を記述し、action は、パターンにマッチした際のアクションを指定します。
アクションには、
REJECT - メッセージを拒否
OK - メッセージを許可
IGNORE - メッセージからヘッダー行を破棄すべてのヘッダー行に対して指定した条件を実行します。
テーブルの例は以下のようになります。大文字小文字の区別は行いません。/^subject: more money$/ REJECT /^from: your friend$/ REJECT