MTA Eximに基づく新しい古いスパム対策手法

企業メールをスパムから保護するための方法論について説明します。これにより、個々のアドレスフィルタリングツールを活用し、これらの方法の欠点を回避できます。

これらの手法は、DMZにある企業のメールサーバーを閉じるSMTPプロキシで使用できることに注意してください。



多くの場合、管理者は、アプローチの欠点により、いくつかの効果的なフィルタリング手法を避けます。 たとえば、DNSBLフィルターは、たとえば、個々のプロバイダーのアドレスブロック全体の一部として、誤ってフィルターに落ちたノードに誤検出を与えることがよくあります。 AとPTRレコードが一致しない場合、またはDNSサービスに単に問題がある場合、PTRレコードの単純な定義に基づいて頻繁に使用されるフィルタリング方法も失敗する傾向があります。



この記事では、個々のフィルタリング方法をより小さなものに分割し、1つの拒否ルールの結果だけでなく、送信ノードに関する集約データに従ってフィルタリングを行う方法を示したいと思います。



この手法は長い間存在しており、さまざまな専門家によるさまざまなアイデアの実装に出会いました。5年前にexim-users@exim.orgメーリングリストでこのバリエーションについて簡単に説明しました(記事はメーリングリストアーカイブにあります )実装の容易さとドキュメントの入手可能性が、郵便管理者によって使用されることはほとんどありません。



hornsnhoofs.comドメインを含むHorns'n'Hoofs社のメールを例に使用して、発明されていないが完全に機能する「戦い」のフィルタリング手法を検討してみましょう。



この実装の主な考え方は、SQLデータベースに保存されているサーバー自身のブラックリストを除き、どのチェックも「重要」ではないということです。 言い換えると、DNSBLの使用を拒否したり、直接および逆DNSレコードが他のホストスパムテストと一致するかどうかを確認したりすることはありませんが、その後、別のチェック(たとえば、DSNBL SpamHausで点灯)。



テストが失敗するたびに、特定の数のポイントがレターの「スパム」に追加されるだけで、構成のいくつかの「コントロールポイント」のこれらのポイントの合計量に基づいて、受け入れまたは拒否の決定が行われます。 このアプローチにより、多くのツールを使用してメール送信者を評価し、同時にフィルターの誤検知(いわゆる誤検知)のレベルを下げることができます。

この記事は、読者がEximを受信サーバーとしてインストールおよび構成できることを前提としています。 また、読者が湿疹の少なくとも簡単な検索を作成できることを願っています。

もちろん、有能な管理者はSMTPプロトコルを知る必要があり、その動作の原理はRFC 821、2821、5321で詳しく説明されています。ロシア語への翻訳はネットワーク上で簡単に見つけることができます。 多くのスパム対策方法の理論的な説明は、RFC 2505に記載されています。



それでは、メールサーバーの設定の説明を始めましょう:

合計スコアは変数$acl_c_spamscore



保存されます。 これは構成プログラムの主要な変数であり、他のすべてのMTAの動作はその値に依存します。



まず、初期値-0を設定します。たとえば、aclでは、 HELO MAIL FROM引数をチェックします。

 acl_check_sender:    warn set acl_c_spamscore = 0    [...]    accept
      
      







UPD:論理エラーに気付いたユーザーslimlvに感謝します。



接続時にすぐに初期化が行われないのはなぜですか? 非常に簡単-RSETコマンドを送信すると、カウンターがゼロにリセットされ、SMTPセッションが再開されます。 これが行われない場合、ポイント数は同じままになり、RSETチームの前に行われた同じチェックに対して新しいポイントが追加されます。

これは、MTAをデバッグするときに不便です。戦闘システムでは、カウンターがゼロにリセットされる場所は関係ありません-ノードが接続された直後(acl_smtp_connect内)、または例のようにMAIL FROMを送信した後



別の重要な変数は$acl_c_bouncemessage



、これはすべてのチェックの結果に関するメッセージを加算します。 MTAの高品質のデバッグに必要です。 サーバーのログで、どのチェックが完了しておらず、ポイントがいくつ獲得されたかをすぐに確認できます。また、ワイヤの反対側で電子メールを読む管理者は、SMTPセッションが壊れた理由を理解し、エラーを修正できます(そう、それは95%でした。 、カブのみを傷つけます)。 ただし、適切に構成されたフィルタリングシステム(昨年は1つしかありません)での誤検出は非常に少ないため、この変数はデバッグ時の都合上のみ使用します。



チェックの大部分はacl_check_sender



セクション(「MAIL FROM:<email@address.any>」の送信後に発生するSMTPセッションのフェーズ)に含まれています:



最初から始めましょう:



 acl_check_sender:    [...]     warn set acl_c_spamscore = 0    drop hosts = +blacklisted_hosts         message = Connection closed. IP [$sender_host_address] is listed in Blacklist.    [...]    accept
      
      







サーバーのログに記録があり、そこからメッセージが送信された電子メールとIPアドレスになった後、サーバーのローカル「ブラックリスト」(MySQLデータベース内)にある場合は不要なドロップノードを無効にできます。追加のSMTPコマンド、DNSおよびDNSBLクエリを使用したトラフィック。



ブラックリスト自体は、 IP varchar(15)



Timestamp int(11)



の2つのフィールドで構成されるデータベース内のテーブルです。IPアドレスとデータベースにunix_time形式で追加された時刻が格納されます(この形式では、過去の数を減算すると便利です秒):



ブラックリストクエリの例は非常に簡単です: SELECT IP FROM antispam.blacklist WHERE IP='1.1.1.1' limit 1"







メールサーバーからのデータベースの操作も基本的に実装されています。 これを行うには、メイン構成セクションにディレクティブを追加します。



 hostlist blacklisted_hosts = ${lookup mysql {SELECT IP FROM antispam.blacklist \                                            WHERE IP='$sender_host_address' limit 1} \                             }
      
      







そのため、1つのIPアドレス(または要求が何も返されなかった場合はゼロアドレス)からリストを作成し、さらにアクセスリストで+blacklisted_hosts



としてポーリングします。



もちろん、データベースの接続のためのパラメーターを含む設定のhide mysql_servers = 127.0.0.1/antispam/mta/mtapass



あるhide mysql_servers = 127.0.0.1/antispam/mta/mtapass



ディレクティブhide mysql_servers = 127.0.0.1/antispam/mta/mtapass



を忘れてはいけません。



ブラックリストテーブルには、以下に示すMTA自体でIPアドレスが自動的に入力されます。



次に、スパム対策の「弾頭」を見てください。



   warn !condition = ${lookup{$sender_address_domain}wildlsearch{/CONFIG_PREFIX/\ additional/trusted_zones}{1}{0}}       set acl_c_spamscore = ${eval:$acl_c_spamscore+20}       set acl_c_bouncemessage = $acl_c_bouncemessage Suspicious e-mail address;
      
      







ここで、trusted_zonesは、exim構成のフォルダー内の追加ディレクトリーにあるプレーンテキストファイルです。 次のようなものが含まれています。



 ^.*\\.ru\$ ^.*\\.ua\$ ^.*\\.by\$ ^.*\\.com\$ ^.*\\.org\$ ^.*\\.net\$ ^.*\\.edu\$
      
      





正規表現は、電子メールアドレス(DNSとはまだ関係ありません)から通常通信を受けるドメインゾーンを表します。 上記の例には必要な最小値が含まれており、必要に応じて編集できます。



警告指令は、手紙が受け入れられたり拒否されたりする必要がないことをEximaに伝​​えます。 条件を満たし、セッションをさらに処理するだけです。



このことから、送信者のアドレスにある受信メールに対してドメインゾーンのない文字を送信するノード(メッセージ本文の "From:"見出しと混同しないでください)は20ポイントを受け取り、先に進みます。



 #-----------------------------DNS Records verify------------------------------------    warn !verify = reverse_host_lookup         set acl_c_spamscore = ${eval:$acl_c_spamscore+30}         set acl_c_bouncemessage = $acl_c_bouncemessage Reverse host lookup failed;
      
      





+30ポイント-直接(A)DNSレコードと逆(PTR)DNSレコードが一致しない場合。



     warn condition = ${if eq {$acl_c_reverse_zone}{}}         set acl_c_spamscore = ${eval:$acl_c_spamscore+50}         set acl_c_bouncemessage = $acl_c_bouncemessage No DNS PTR record found;
      
      







別の50-リバース(PTR)録音の欠如。

後で示すように、ノードを「グレーリスト」(グレーリスト)に入れるには8つのポイントで十分です。



 #-----------------------------------------------------------------------------------
      
      







$acl_c_reverse_zone



変数がここに表示され、このチェックの結果(ノードのDNS PTR値)が含まれていることが$acl_c_reverse_zone



ます。



          set acl_c_reverse_zone = ${escape:${lookup dnsdb{ptr=$sender_host_address}}}
      
      





ノードの接続時(より正確なacl_smtp_connect



内)、またはacl_check_helo



HELO引数のチェック時に、その値を設定できます。

$acl_c_spamscore



初期化されます。 違いはわずかです。 一般的にどこでも構築を使用できます:



     warn condition = ${if eq {${escape:${lookup dnsdb{ptr=$sender_host_address}}}}\ {}}
      
      







ただし、このようなルックアップごとに、DNSクエリが生成されることに注意してください。 大量のメール(スパム)があると、これにより不要な負荷が発生します。 小さなフローでは、違いを感じることはほとんどありません。



 #-----------------------------Dynamic IP pools processing---------------------------    warn condition = ${lookup {$acl_c_reverse_zone}wildlsearch{CONFIG_PREFIX/\ additional/dynamic_pools}{1}{0}\                      }         set acl_c_spamscore = ${eval:$acl_c_spamscore+70}         set acl_c_bouncemessage = $acl_c_bouncemessage Suspected PTR DNS record \ points to dynamic IP pool;
      
      







DNSホストが動的アドレスプールをポイントしている場合、送信ホストは+70ポイントを受け取ります。 そのようなプールは、ウイルスの繁殖地であり、その結果、ボットネットにとって良い土壌です。



 #-----------------------------------------------------------------------------------
      
      







dynamic_poolsファイルは、trusted_zonesファイルと構造が似ており、モデム、adslマネージャー、および動的に割り当てられたipを持つ他のノードのDNSレコードをチェックするための正規表現が含まれています。



 ^.*([0-9]+).([0-9]+).([0-9]+).([0-9]+).* ^.*host.([0-9]+).* ^.*dynamic.* ^.*dial.* ^.*ppp.* ^.*pptp.* ^.*broadband.* ^.*dhcp.*
      
      





これに独自のルールを追加できますが、これは必要最小限のものです。



 #---------------------------Geographical DNS zone processing------------------------    warn !condition = ${lookup {$sender_host_name}wildlsearch{/CONFIG_PREFIX/\ additional/trusted_zones}{1}{0}}         set acl_c_spamscore = ${eval:$acl_c_spamscore+20}         set acl_c_bouncemessage = $acl_c_bouncemessage Untrusted domain zone;
      
      







電子メールのチェックに以前に使用されたのと同じtrusted_zonesが、実際のDNSレコードによるフィルタリングに使用されるようになりました。



ドメインゾーンのリストにない中国、メキシコ、韓国などからのメールの場合、+ 20ポイント。



 #------------------------------------------------------------------------------------------ #-------------------Huge DSL & DialUp ISP's DNS zone processing---------------------    warn condition = ${lookup {$sender_host_name}wildlsearch{CONFIG_PREFIX/\ additional/spamvertised_isp}{1}{0}}         set acl_c_spamscore = ${eval:$acl_c_spamscore+40}         set acl_c_bouncemessage = $acl_c_bouncemessage Spamvertised ISP DNS zone;
      
      







ボットネットによって生成される発信トラフィックのフィルタリングを気にしない個々の大規模プロバイダーを+40ポイント。



 #-----------------------------------------------------------------------------------
      
      







spamvertised_ispファイルには、モデラーがポート25(ログで計算)への発信接続を許可する多くの大規模プロバイダーがリストされています。



 ^.*comcast\\.net ^.*pppoe\\.mtu-net\\.ru ^.*qwerty\\.ru ^.*ono\\.com ^.*virtua\\.com\\.br
      
      







独自のメモを追加できます。 それも必要です



 #----------------------------Handler for impossible HELO's-------------------------    warn condition = ${if or {\                                 {match{$sender_helo_name}{localhost}}\                                 {match{$sender_helo_name}{mail.hornsnhoofs.com}}\                                 {match{$sender_helo_name}{^127\\.0\\.0\\.([0-9]+)}}\                             }{1}{0}\                      }         set acl_c_spamscore = ${eval:$acl_c_spamscore+60}         set acl_c_bouncemessage = $acl_c_bouncemessage HELO $sender_helo_name is forged;
      
      







+60は、HELOの引数としてメールサーバー(受信)を示すスパマーを指します。



 #---------------------------------------------------------------------------------- #------------------------------Handler for wrong HELO's----------------------------    warn !condition = ${if or {\                                 {match{$sender_helo_name}{^.+\\.((?i)[az]+)\$}}\                                 [...]                              }{1}{0}\                       }         set acl_c_spamscore = ${eval:$acl_c_spamscore+20}         set acl_c_bouncemessage = $acl_c_bouncemessage HELO name is not \ Fully Qualified Domain Name;
      
      







HELOがFQDNでない場合、+ 20スパムポイント。



 #---------------------------------------------------------------------------------- #--------------------------Handler for forged HELO arguments-----------------------    warn !condition = ${if or {\                                 {eq{$sender_helo_name}{$sender_host_name}}\                              }\                       }         set acl_c_spamscore = ${eval:$acl_c_spamscore+20}         set acl_c_bouncemessage = $acl_c_bouncemessage HELO not equals Hostname;
      
      







HELO引数が送信ホストのマスターDNSレコード(A)と一致しない場合、さらに20。



 #---------------------------------------------------------------------------------- #------------------------Handler for suspicious HELO arguments---------------------    warn !condition = ${lookup {$sender_helo_name}wildlsearch{/CONFIG_PREFIX/\ additional/trusted_zones}{1}{0}}         set acl_c_spamscore = ${eval:$acl_c_spamscore+20}         set acl_c_bouncemessage = $acl_c_bouncemessage Suspicious HELO argument;
      
      







古き良きtrusted_zonesがHELO引数のテストに使用されるようになりました。

中国人、韓国人、その他のメキシコ人日本人が+20ポイント。

 #----------------------------------------------------------------------------------
      
      







最後に、DNSBLポーリングの正しい実装:



そのようなシステムでのみ輝くノードをオフにすることはできません。 彼が偶然そこに着いた可能性が高い。



DNSBLの使用を完全に放棄しないでください-これは強力なフィルタリングツールです。



ノードをスパマーと宣言できるのは、このようなシステムを2つ以上同時に実行する場合のみです。



 #-------------------------------DNSBL processing section---------------------------    warn dnslists = sbl.spamhaus.org         set acl_c_spamscore = ${eval:$acl_c_spamscore+60}         set acl_c_bouncemessage = $acl_c_bouncemessage Listed in DNSBL $dnslist_domain;    warn dnslists = bl.spamcop.net         set acl_c_spamscore = ${eval:$acl_c_spamscore+60}         set acl_c_bouncemessage = $acl_c_bouncemessage Listed in DNSBL $dnslist_domain;    warn dnslists = dnsbl.sorbs.net         set acl_c_spamscore = ${eval:$acl_c_spamscore+60}         set acl_c_bouncemessage = $acl_c_bouncemessage Listed in DNSBL $dnslist_domain;    warn dnslists = dul.ru         set acl_c_spamscore = ${eval:$acl_c_spamscore+60}         set acl_c_bouncemessage = $acl_c_bouncemessage Listed in DNSBL $dnslist_domain;
      
      







「DNSブラックリスト」に入ると、+ 60ポイント。 同時に2つのリストに入ると、ノードは120ポイントを受け取ります。これは、そこからのメールの受信を停止するには十分ですが、ローカルブラックリストに自動的に追加するには不十分です。 送信メールサーバーの管理者が少なくとも1つのDNSBLからすばやくサブスクライブを解除できた場合、メール転送の影響は最小限になります。



DNSBLポーリングは、他のチェックと組み合わせて-スパマーを非常によく排除し、これらのポイントは、IPアドレスを1週間ローカルブラックリストに入れるためにしばしば重要になります。



 #-----------------------------------------------------------------------------------    warn !verify = sender/callout=3m,defer_ok         set acl_c_spamscore = ${eval:$acl_c_spamscore+60}         set acl_c_bouncemessage = $acl_c_bouncemessage Cannot complete sender verify;
      
      







ここでコールアウトが行われます(送信者ボックスの存在を確認します)。 サーバーには検証のために最大3分間が与えられています(それ以外の場合、接続がハングするため、検証が完了するのを待たずに「良い」送信者が脱落するリスクがあります)、リモートノードのアクセス不能は検査の成功と見なされます。 つまり ノードは、不在の(ほとんどの場合は偽の)電子メールアドレスからメールを送信すると、60ポイントを受け取ります。



そのため、www @ webserver.example.orgのようなアドレスからの正当なメール送信を行うべきではありません。 コールアウトは一般的なフィルタリング方法であり、多くの最新のMTA実装でサポートされています。



     accept condition = ${if >{$acl_c_spamscore}{145}}
      
      





ここでは、ちょっとしたトリック-145ポイント以上のノード-がローカルブラックリストの真の候補です。 それらをチェックする必要はもうありません。次のACLに転送し、そこで厳しく禁止します。



     accept delay = ${eval:$acl_c_spamscore/2}s
      
      







145ポイントを獲得していない人は、拷問セッションの遅延を経験します。受信MTAは、不正な接続を模倣し、スパムポイントの数の半分に相当する数秒間フリーズします。 60ポイントのノードが30秒間「中断」されたとします。



通常、スパマーは応答を待つ時間があまりなく、15〜20秒で落ちます。



そこで、最後のACLに到達し、SMTPセッションのパラメーターの正確性を確認しました(RCPT TO:の後に機能します)。 その中には、合計ポイントの「重み付け」と、手紙のさらなる運命の決定があります。



 acl_check_rcpt: [...] #------Spamtraps check-------    warn condition = ${lookup {$local_part@$domain}lsearch{/CONFIG_PREFIX/\ additional/spamtraps}{1}{0}}         set acl_c_spamscore = ${eval:$acl_c_spamscore+50}         set acl_c_bouncemessage = $acl_c_bouncemessage Spamtrap hit;
      
      







スパムトラップに陥った場合は+50ポイント。



 #----------------------------
      
      







トラップアドレスのリストは、次の行に電子メールで送信されるspamtrapsファイルにあります。



 spamtrap@hornsnhoofs.com honeypot@hornsnhoofs.com
      
      







などなど。



独自のスパムトラップを使用することは、電子メールのボットでインターネットを掘る大規模なメーラーから身を隠す良い方法です。 次に、これらのアドレスは、メーリングリストの一部として転送、販売、および配布されます。 つまり、それらはスパマーによって拡散されます。



そのようなアドレスの最初の配布には困難が生じるため、それらはスパマーに送信されます。 たとえば、会社のメインWebサイトでwpoisonなどのメカニズムを使用できます。 主なことは、検索エンジンによるインデックス作成の禁止を忘れないことです(robots.txtまたはMETA CONTENT = "NOINDEX、NOFOLLOW"を使用)。



多くの場合、古いドメインには既にアドレスが破棄されているか、まったく存在していませんが、それでも1つのスパムが送信されます。 これらは、スパムトラップとして使用するのに理想的な候補です。 主なことは、そのようなボックスは長期間使用しないでください。さらに良いことに、使用しないでください。



逆説的に、それは事実です-今日使用しているトラップアドレスの多くは、スパムデータベースを除き、どこにも存在していません。 そこにどのように登場したかは不明ですが、スパムが定期的に届きます。 メーラーのログを長期間調べて、そこに似たようなものがあることを確認してください。



 #---------------------------Blacklist Processing Section------------------------    drop !senders = :         !condition = ${if <{$acl_c_spamscore}{150}}         message = Connection closed. Spamscore threshold (150 points) reached. \                   Spamscore is $acl_c_spamscore! \                   Warning: IP [$sender_host_address] added to Blacklist. \                   Details: $acl_c_bouncemessage         condition = ${lookup mysql \                         {\                             insert into antispam.blacklist (IP,Timestamp)\                             values ('${sender_host_address}',${tod_epoch});\                         }\                      }
      
      







150ポイント以上を獲得できた人は、チャンピオンと宣言されます! それらのIPアドレスはローカルブラックリストに登録され、それらについての名声は1週間止まりません。

その中にあるノードは、「MAIL FROM:」コマンドを送信した直後にドロップします。



 #-------------------------------------------------------------------------------
      
      







すでに述べたように、ブラックリストのレコードの有効期間は1週間(604800秒)です。 ベースは1時間ごとにクラウンで清掃されます。



 #!/bin/bash echo "delete from blacklist where Timestamp < `echo "\`date +%s\`-604800" | bc`;" | /usr/local/bin/mysql -u mta -pmtapass antispam echo "optimize table blacklist" | /usr/local/bin/mysql -u mta -pmtapass antispam
      
      





     deny condition = ${if >{$acl_c_spamscore}{100}}         condition = ${if ={$acl_c_validrcpt}{1}}         message = Message rejected. Spamscore threshold (100 points) reached. \                   Spamscore is $acl_c_spamscore! Details: acl_c_bouncemessage
      
      







ここではすべてが簡単です。 100点以上を獲得-「550メッセージ拒否」を受け取りました。 同時に、得点と失敗したチェックのレポートの数がログに記録されます。 同じ情報は、ワイヤの反対側のメールの皮と一緒に行きます。 突然誰かがデバッグに役立ちます。



セッションを中断せずに(aclで受信に文字を持ち込まず、ルーターとトランスポートによる処理を開始せずに)たわごとを送信することが重要です。そうしないと、イベントがうまく機能しない場合があります。



返信の形式でスパムを送信することについて簡単に説明します。存在しないメールアドレスnosuchaddress@hornsnhoofs.comに「MAIL FROM:」の「vasyapupkin@gmail.com」を示すスパムレターを書くと、そのメールはメールサーバーで受け入れられ、メールを受信した後、ルーターは宛先アドレスが存在しないと判断すると、サーバーはスパムメールを新しいエンベロープでラップし、そのたわごとの行を追加して「送信者」に返送します-Vasya Pupkin、Gmail.comで疑わない。



次に、生地会社はサーバーを「ブラックリスト」にすばやく追加し、そのIPからのメールの受信をブロックします。 今、あなたは技術サポートに説明的な手紙を書いて、厄介なスパマーが笑います。



ただし、これは現象の非常に簡単な説明であり、それを防ぐ他の方法がありますが、セッションを停止せずに嫌いな人を転送する戦術が最も正しいです。



より便利なデバッグのために、この情報をレターのサービスヘッダーに追加することもできます。 ただし、これは非常にオプションです。

     accept condition = ${if <{$acl_c_spamscore}{70}}           condition = ${if ={$acl_c_validrcpt}{1}}
      
      





スパムポイントが70未満のホストは正当であると見なされ、受信者のアドレス( $acl_c_validrcpt



)が存在する場合、ホストからの手紙を受け入れます。



この変数が値を取得する方法については説明しません。 メールユーザーに関するデータの保存方法によって異なります。 LDAP検索でActive Directoryの受信者のメールアドレスを確認した後、私からそれが真実(または1つだけ)になると言います。これは、Eximでサポートされている限り、ユーザーがいるすべてのデータベースに対して実行できます。



最も興味深いのは、ノードが70ポイントから100ポイントの得点になることです。正当なホストやスパマーに起因するものではありません。したがって、それらをgrelistで29分間ラップします(間隔は、MTA送信者によるメールキューの2回目の実行を想定して選択されます)。



 #--------------------------Greylist Processing Section--------------------------    defer condition = ${if ={$acl_c_validrcpt}{1}}          condition = ${lookup mysql \                          {\                              select Source from antispam.greylist where \                              Source='$sender_host_address' \                              and Timestamp > ${eval:$tod_epoch-1740} limit 1\                          }{1}{0}\                       }          message = Message deferred. Try again later. You was been already greylisted.    accept condition = ${lookup {$acl_c_reverse_zone}wildlsearch{CONFIG_PREFIX/\ additional/dynamic_pools}{1}{0}}           condition = ${if ={$acl_c_validrcpt}{1}}           condition = ${lookup mysql \                          {\                              select Source from antispam.greylist where \                              Source='$sender_host_address' \                              and grey_hash = '${md5:${lc:$sender_address\ $local_part@$domain}}' \                              and Timestamp < ${eval:$tod_epoch-1740} limit 1 \                          }{1}{0}\                        }           condition = ${lookup mysql \                          {\                              delete from antispam.greylist where \                              Source='$sender_host_address' \                              and grey_hash = '${md5:${lc:$sender_address\ $local_part@$domain}}' \                          }\                        }    accept !condition = ${lookup {$acl_c_reverse_zone}wildlsearch{CONFIG_PREFIX/\ additional/dynamic_pools}{1}{0}}           condition = ${if ={$acl_c_validrcpt}{1}}           condition = ${lookup mysql \                          {\                              select Source from antispam.greylist where \                              Source='$sender_host_address' \                              and grey_hash = '${md5:${lc:$sender_address\ $local_part@$domain}}' \                              and Timestamp < ${eval:$tod_epoch-1740} limit 1 \                          }{1}{0}\                        }           condition = ${lookup mysql \                          {\                              insert into antispam.whitelist (IP, Timestamp) \                              values ('$sender_host_address',$tod_epoch) \                          }{1}{1}\                        }           condition = ${lookup mysql \                          {\                              delete from antispam.greylist where \                              Source='$sender_host_address' \                              and grey_hash = '${md5:${lc:$sender_address\ $local_part@$domain}}' \                          }\                        }    defer condition = ${if ={$acl_c_validrcpt}{1}}          condition = ${if >={$acl_c_spamscore}{70}}          condition = ${lookup mysql \                          {\                              insert into antispam.greylist (Source,grey_hash,Timestamp) \                              values ('$sender_host_address',\ '${md5:${lc:$sender_address$local_part@$domain}}',\                              ${tod_epoch}); \                          }\                        }          message = Message deferred. Spamscore is $acl_c_spamscore! Try again later. \                    Greylisting in progress. Details: $acl_c_bouncemessage #-----------------------------------------------------------------------------
      
      





defer , c 4xx, , .



: SMTP- 451 , « », .



«», : ip- .



, , greylist, : Source varchar(15)



, grey_hash varchar(32)



, Timestamp int(11)



。 Sourceフィールドには送信者のIPアドレスが含まれ、gray_hashは送信者と受信者のアドレスからのmd5ハッシュ、Timestampはレコードがunix_time形式で追加された時刻です。それに加えて、グレー化にはホワイトリストテーブルが必要です。これにより、グレー化に合格したノードのアドレスを追加できます。ホワイトリストテーブルの形式は、上記のブラックリストテーブルの形式を完全に繰り返します。

テーブルはクラウンによってもクリアされます。グレーリストのレコードは1日、ホワイトリストの月は保存されます。



     deny message = Message rejected. No such user here. Relaying denied. $acl_c_support         set acl_c_spamscore = ${eval:$acl_c_spamscore+5}         set acl_c_bouncemessage = $acl_c_bouncemessage RCPT Fail;         delay = ${eval:$acl_c_spamscore/2}s
      
      





最高の犬の飼育者の推奨によると、最後のフィルタリング規則は禁止されています。彼の仕事は、「閉じた」ファイアウォールの最後のルールにいくらか似ておりdeny ip from any to any



、SMTPセッションのみに影響します。



さらに、「RCPT TO:」の間違ったアドレスごとに(SMTPプロトコルでは1文字に複数の受信者を指定できます)、ノードは無条件のブロッキングしきい値に達するまで、5つの追加スパムポイントを受け取ります。



ああ、はい-各「RCPT TO:」の後にセッションを遅らせる拷問もあります。



メールサーバーの構成で少なくともこれらの構成を使用すると、誤検知の数を増やすことなくスパムの約90〜95%を削減できます。



( -) ( , , gmail.com mail.ru, , , ) .



, .



, SPF DKIM, , « » ( -), , . , .



All Articles