Postfix

Sendmailと並んで標準的なSMTPソフトウエアであるPostfixについて

2016年8月30日

ban4ipインストールしてみました

オープンソースアンカンファレンス金沢2016でT.Kabuさんからのご紹介のあった
fail2banをやめてBan4ipにしませんか?
を早速試してみました。

ApacheやSSH、postfix、dovecot等のログを解析して失敗を検知した接続元のIPアドレスをiptablesに書き込みしてフィルタリングするデーモンになります。
IPv6にも対応しているところが優れています。

CentOS7の環境でしたが、問題なく導入でき1日間で17回BANできています。
インターネット環境にサーバを公開するということは常に攻撃にさらされていると感じました。

自動BANツールを導入していない方はぜひ導入してみるとよいと思います。

なお、サーバを再起動する際には、banした設定が消えてしまうので /sbin/service iptables save を忘れずに!

2011年5月29日

Postfix + POP before SMTP

SMTPの認証にPOP before SMTPを利用する機会は減ってきていると思うが、過去の互換性から利用を継続しなければならない場合も多い。

Cent OSにて導入をするためには、
pop-before-smtp-1.41-2.el5
compat-db-4.2.52-5.1
のRPMパッケージを導入したうえで、

pop-before-smtp-conf.pl, Postfix の main.cf を設定することとなる。

設定方法は、Fedora CoreでPostfixとDovecotでPOP before SMTPが参考になる。

2009年7月10日

HELOホスト名を変更する方法

Helo command rejected: Host not found;とmessageログに記録されている場合には、送信先SMTPサーバーにおいてHELOホストがDNSに登録されていないためにおこる。

通常は、HELOホスト名はhostnameに記述されたホスト名が使われるがこのホスト名をHELOコマンドで使用したくない場合には、Postfix のセキュリティ対策に記載があるようにmain.cf に「smtp_helo_name」のパラメータを付加してpostfixサービスを再起動することで変更ができる。

2009年5月14日

SpamAssassinのメモリ使用量が異常

今日突如SpamAssassinのメモリ使用量が1GBを超えてスワップをしてしまい、サーバーがダウンしてしまった。

最近はメールの受信件数がかなり多くなっていたことが気になっていたが、さすがにここまでになるとは思わなかった。

いろんなサイトを参照させていただき、有用となる情報をまとめて対応してみた。
メーリングリストより・・・

/etc/mail/spamassassin/local.cf にて
bayes_expiry_max_db_size 1000000
bayes_auto_expire 0
を追加してspamassasinを再起動する。

SpamAssassin によるスパムメール対策より・・・

/etc/procmailrc にて
:0fw
*!^X-Spam.*
|spamassassin

となっている場合には

:0fw
*!^X-Spam.*
| /usr/bin/spamc

として起動するプログラムをspamcに変更する。

2008年2月19日

postfixでバーチャルドメイン運用

/etc/postfix/main.cf のmydomainにabc.comが定義されており、hogehoge@def.com でもhogehoge@abc.com と同じように abcユーザーのメールボックスに入ってよい場合
⇒/etc/postfix/main.cf のmydestination に def.com を追加する

ユーザーアカウントならびにドメインごとに異なる メールボックスに配送する必要がある場合。ももしくは、/etc/postfix/main.cf のmydomainにドメインが定義されて場合
⇒/etc/postfix/main.cf に
virtual_alias_maps = hash:/etc/postfix/virutal
と定義した上で、
/etc/postfix/virtual に
ドメイン名 anything
メールアドレス 配送先アカウント
という記述を行う。

なお、
@ドメイン名 配送先アカウント
と記述すると該当ドメインにおいてメールアドレスが定義されていないものは指定されたアカウントへ配送できる。

2007年12月31日

メールが送信できない

僕のサーバーは、mydnsを利用してダイナミックDNSによって公開しているが、プロバイダがOP25B対策をしているため、外部にメールを送信するためにはSubmission Portを利用しなければならない。

mydnsではIPアドレスを定期的に更新している送信元からSubmission Portによるメールリレーサービスがあるので、これを利用させてもらっている。

今日メールを送ろうとしたところ、なぜかメールが送れなかったため、/var/log/maillogを確認して原因を調査したところ

Dec 24 04:28:53 (ホスト名) postfix/qmgr[2240]: 17F8AFC03: to=<(送信元)>, relay=none, delay=16802, delays=16802/0.21/0/0, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to auth.gate-on.net[210.197.72.170]: Connection timed out)

というログが出ていることが確認できた。auth.gate-on.netはpingが通ることから、どうやらメールリレーサーバーから接続を拒否されているようだ。

もっと前のログを確認したところ

Dec 23 04:02:39 (ホスト名) postfix/smtp[29536]: 03866F775: to=<(送信元)>, relay=auth.gate-on.net[210.197.72.170]:587, delay=25031, delays=24999/28/0.09/5, dsn=4.0.0, status=deferred (host auth.gate-on.net[210.197.72.170] said: 450 Error: too much mail from 122.20.52.249 (in reply to MAIL FROM command))

というエラーログが確認できた。どうやらメールを送りすぎているらしい。

たしかにmaillogを確認したところログサイズがかなり大きい状態であったため、もしかして不正中継しているのかと思い、RBL.JPによる不正中継テストを実施したところ特に不正中継はできない状態を確認した。

となるとなぜそんな大量のメールを送る必要があるのか・・・・詳しく調べてみたところ管理ドメインではあるが受信を予期していないサブドメインあてのメール(xxx@yyy.development-network.net)が大量に送られており、それが原因でエラーメッセージを大量に送信元に返しているためということがわかった。

確かにダイナミックDNSを利用していると、 development-network.net のMXレコードも yyy.development-network.net のMXレコードも存在するように見えてしまう。実際には、yyy.development-network.netドメインはメール受信できるような設定になっていないので、こんなことが起こってしまうのだ。

これを回避するためには、自サーバーにDNSを立てて、/etc/resolv.confに nameserver 127.0.0.1 を設定する。その上で、development-network.netドメインのみMXレコードを設定し、メールサーバーあてに来たメールの宛先がMXレコードに存在しなければメールを拒否するようにすればよい。また、合わせて送信元のメールアドレスが正しくない(MXレコードが引けない)場合も合わせて拒否するようにした。

そこで、postfixに以下の設定をした。

smtpd_sender_restrictions=
smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination

smtpd_sender_restrictions=reject_unknown_sender_domain
smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,reject_unknown_recipient_domain

ここで設定パラメータの意味をおさらいしてみたい。








reject_unknown_sender_domainMAIL FROM アドレスに DNS A または MX レコードがなく、Postfix がその送信者アドレスの最終配送先ではない場合に、要求を拒否します。
reject_unknown_recipient_domainRCPT TO アドレスに DNS A または MX レコードがなく、Postfix がその受信者アドレスの最終配送先ではない場合に、要求を拒否します。

この設定をすることによって

Dec 31 22:16:05 (サーバー名) postfix/smtpd[24930]: NOQUEUE: reject: RCPT from adsl-ull-139-91.47-151.net24.it[151.47.91.139]: 450 4.1.2 <(送信先)>: Recipient address rejected: Domain not found; from=<(送信元)> to=<(送信先)> proto=ESMTP helo=

というログが記録されるようになり、正しく拒否することによって不用意にリレーさせないようになっていることを確認できた。

この設定の後、Bフレッツを再接続してWAN側のIPアドレスを変更し、mydnsに新しいIPアドレスを通知することで正しく通信できるようになった。

最後になりましたが、mydnsさんへはこの件で大変ご迷惑をおかけしました。この場を借りてお詫びいたします。

2007年12月30日

Postfixにスパムメールフィルターを入れる

Webサイトを公開していると公開ドメインの特定のアカウントに対してスパムメールが送られてくることも珍しくなく、僕の場合には、1日当たり200通くらいスパムメールが来る。そこで、spamassasinというソフトウエアを組み込むことで簡単にスパムメールフィルターを実装することができたので紹介する。

ちなみにインストールにあたってLinuxで自宅サーバーさんのサイトが役に立った。動作する概要を知るにはとても役に立つのでご一読いただきたい。また以下のインストール手順も多くは参考に記載しているものであることをお断りしておく。

Fedora Core 6上にPostfixが稼働している環境にspamassasinを以下の手順でインストールした。

1.yum install spamassasin コマンドを実行するとspamassasin以外にperlモジュールをたくさん入れる必要があることが分かるので、yを押す。

2.rpm -qi procmail を実行し、procmailコマンドがあることを確認する。ただし、設定ファイルである/etc/procmailrc がないため、 vi /etc/procmailrc として以下を記述する。

# パスを設定 PATH=/bin:/usr/bin:/usr/local/bin

# メールボックスの設定
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/

# Procmailのログファイル出力先を指定
LOGFILE=$MAILDIR/procmaillog

# ロックファイルのパスを指定
LOCKFILE=$HOME/.lockmail

# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動します
:0fw
*!^X-Spam.*
|spamassassin

# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納します(ただし、POPサーバーで受信しているケースがある場合には、この設定をするとスパム扱いされたメールが確認メールソフトからできないので注意)
:0
* ^X-Spam-Status: Yes
$MAILDIR/.Spam/

※.Spamディレクトリは/home/XXX/Maildir以下に作成しなければならないようだが、みている限りでは、上記設定をすることでメールの受信が始まると勝手に作ってくれるようだ。

4.Postfixでメールを受信をした際にprocmailで処理させるために以下の記述を/etc/postfix/main.cf に記述する

mailbox_command = /usr/bin/procmail

5.spamassasinサービスを自動起動させるために以下のコマンドを実行する。

/sbin/chkconfig --level 35 spamassassin on

6.spamassasinサービスの起動&postfixの再起動を行う

/etc/init.d/spamassasin start
/etc/init.d/postfix restart

7.postfixで配送を管理しているドメインあてにメールを送ってヘッダーに以下の情報があることを確認する。

X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on (サーバー名)

X-Spam-Level:

X-Spam-Status: No, score=0.5 required=5.0 tests=NO_REAL_NAME,NO_RELAYS
autolearn=no version=3.1.9

もしスパムメールを受け取った場合には、.Spamというフォルダに移動され、以下のようなヘッダーが付け加えられる。

X-Spam-Flag: YES

X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on
(サーバー名)

X-Spam-Level: ******************

X-Spam-Status: Yes, score=18.2 required=5.0 tests=ALL_TRUSTED,
FORGED_MUA_OUTLOOK,INVALID_MSGID,REPLICA_WATCH,URIBL_JP_SURBL,URIBL_OB_SURBL,
URIBL_SBL,URIBL_SC_SURBL,URIBL_WS_SURBL autolearn=no version=3.1.9

X-Spam-Report:
* -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP
* 2.3 REPLICA_WATCH BODY: Message talks about a replica watch
* 1.1 URIBL_SBL Contains an URL listed in the SBL blocklist
* [URIs: prnewperiod.net]
* 3.4 URIBL_JP_SURBL Contains an URL listed in the JP SURBL blocklist
* [URIs: prnewperiod.net]
* 1.5 URIBL_WS_SURBL Contains an URL listed in the WS SURBL blocklist
* [URIs: prnewperiod.net]
* 2.6 URIBL_OB_SURBL Contains an URL listed in the OB SURBL blocklist
* [URIs: prnewperiod.net]
* 3.6 URIBL_SC_SURBL Contains an URL listed in the SC SURBL blocklist
* [URIs: prnewperiod.net]
* 1.7 INVALID_MSGID Message-Id is not valid, according to RFC 2822
* 3.4 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook

8.定期的に学習させるためにcronへ登録する。vi /etc/cron.d/spamassasin を実行し、以下のを記述する。


0 1 * * * /usr/bin/sa-learn --spam /home/*/Maildir/.Spam/cur > /dev/null
0 1 * * * /usr/bin/sa-learn --ham /home/*/Maildir/cur > /dev/null

以上で設定完了だ。

なお、.Spamに移動したファイルは通常は読み取りできないので、もしsquirrelmailを使っているようであれば、フォルダメニューで.spamを登録すれば読み取りできるようになる。

2007年1月14日

PostfixでSubmissionポートをあける

最近のOP25Bの影響によって、プロバイダによってはレンタルサーバーあるサーバーなどのSMTPサーバーに接続できないケースが出てきました。OP25Bの回避策である567番ポート(Submissionポート)をLISTENさせることでこの問題は回避でき、Postfixでは非常に簡単に出来ます。

/etc/postfix/master.cfにある以下のコメントを外すだけでOKです。
submission inet n - n - - smtpd

2006年12月24日

Postfixの配送エラー

Postfixをマルチドメインで運用している場合には、配送エラーに悩まされることが多い。
エラーメッセージとともに対応方法をリスト化しておきたい。

554 5.7.1 <(あて先アドレス)>: Relay access denied; from=<(送信元アドレス)> to=<(あて先アドレス)> proto=ESMTP helo=<(接続元サーバー)>

あて先アドレスが自ドメインでなければ、不正中継しようとしているわけなので拒否して問題ないが、これが自ドメインなのにもかかわらず不正中継扱いされるケースだとメールが届かない。これは
main.cfのmydestinationが正しく設定されているかどうかチェックする。

たとえばこのような形にすると改善されるかもしれない。
domain = (自ドメイン)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

2006年12月13日

vodafoneへメールが送信できない

postfix/smtp[26573]: connect to mx.t.vodafone.ne.jp[210.169.176.59]: Connection timed out (port 25)
SMTP中継しようとするとOCN網からだと拒否されてしまう。

他のドメインでは発生しない症状なので、おそらくOCN側で携帯ドメインの転送をしないように設定していることが予想される。

mydnsのOPB25対策のサービスを利用することこの問題は回避できるが、本来であればOCNのSMTPサーバーをリレーしたいところ。そこで利用するのがSASL(SMTP-AUTH)になる。

SASLについては今後書いていきたいと思う。

2006年11月29日

Fedora Core6 + Postfix + Mailmanではまる

Fedora Core6からIPv6のサポートが正式に始まった。これによってIPv6の環境下でもインストールを行うことが出来るようになった。がしかし、ソフトウエアがまだ完全に対応していないために思わぬところではまってしまった。

PostfixはIPv6に対応しているもののデフォルトはIPv4対応になっている。
inet_protocols = all
main.cfに設定して再起動しなければ、IPv6用に待ち受けしないので、
telnet 127.0.01 25
とやると問題ないのに
telnet localhost 25 もしくは
telnet ::1 25 とやると

Trying ::1...
telnet: connect to address ::1: Connection refused
telnet: Unable to connect to remote host: Connection refused

のメッセージが出てしまう。Mailmanはデフォルトでlocalhostに配送しようとするので、この問題で配送されない状態が続くということになる。

続きを読む "Fedora Core6 + Postfix + Mailmanではまる" »

2006年11月28日

Postfix + DovecotでPOP before SMTP

もう認証方式としてはあまり使われなくなっているらしいPOP before SMTP方式ですが、SMTP認証方式は多少なりとも初心者ユーザーへのハードルが高いことは事実。PostfixとDovecotを使ってPOP before SMTPを実装する方法がTAKEDA Hiroyukiさんのページで紹介されていました。僕の環境の場合、BerkeleyDBのCPANインストール時に

db.h: No such file or directory

で躓きましたが、db4-develパッケージをインストールすることで解決しました。

postfixの設定

postfixでMaildir形式での運用をするときには、/etc/postfix/main.cfを以下のように変更する。
#home_mailbox = Maildir/
#mail_spool_directory = /var/spool/mail

home_mailbox = Maildir/
mail_spool_directory = /var/spool/mail

また、Fedora CoreやRedhatではローカルのみメールを配送するように設定されているために、
telnet localhost 25とすると

Trying ::1...
telnet: connect to address ::1: Connection refused
telnet: Unable to connect to remote host: Connection refused

というエラーに悩まされるかもしれない。
そこで、以下のように設定を変更する。
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost

inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
それから、Fedora Core6の環境で悩まされた問題だが、inet.dの再起動に失敗して
postfix[XXXX]: fatal: parameter inet_interfaces: no local interface found for XXX.XXX.XXX.XX
というエラーが/var/log/maillogに記載されることがあるかもしれない。そのときは、
/etc/hosts
ファイルを見直すとよい。