つい最近知ったのですが、UNIXではCR(\r)は行頭に戻るという意味だったのね( ´ー`)
#!/usr/bin/perl
$| = 1;
for (my $C = 1,my $D = 30; $C < = $D; $D--) {
print "Please wait for " . sprintf("%02d",$D) . " seconds more";
sleep 1;
print "\r";
}exit;
↑をコンソール上で実行すると改行しないでカウントダウンしてくれます。
つい最近知ったのですが、UNIXではCR(\r)は行頭に戻るという意味だったのね( ´ー`)
#!/usr/bin/perl
$| = 1;
for (my $C = 1,my $D = 30; $C < = $D; $D--) {
print "Please wait for " . sprintf("%02d",$D) . " seconds more";
sleep 1;
print "\r";
}exit;
↑をコンソール上で実行すると改行しないでカウントダウンしてくれます。
先週の土曜日あたりから親知らずがコンニチハしてきて若干痛いです(´;ω;`)
さて先日のsmtpguardですが、元々はqmail用だったみたいですね・・・
ubuntuのリポジトリにはpostfix-smtpguardっていうのがありますが。
で、肝心の会社のフィルタリングサーバーの件ですが、結局check_policy_serviceを通して自分で書いたスクリプトでフィルタリングすることにしました。
先日書いたように、本来はGateWay的なポジションにあるサービスなのでスパムをゴリゴリ弾くわけにもいかないので以下のような運用ポリシーにしました。
1.逆引き不可&逆引きしたホスト名が動的IPっぽいとこからきたものであった場合にcheck_policy_serviceでスクリプトに渡す。
2.スクリプトはエンベロープのFROMとTOのFQDNを組み合わせたキーにして値にリクエスト時間を記録する(同一キーの記録数はコンフィグで指定)。
3.スクリプトは2のキーからのリクエストが一定時間内(この時間もコンフィグで指定)にコンフィグで指定した回数を超えた場合は450で要求を拒否する。
4.スクリプトはリクエストがある毎にコンフィグで指定した時間を越えた2のキーは削除していく。
5.チェック対象のFROM、TOのFQDNはコンフィグで定義しておいてこれに該当しないものはスルーする。
といった感じ。
上記のスクリプトはperlで作成してデータの記録にはDB_File(BTREE)を使用。
正確には4→3→2の順番で2は3の条件を満たしていない場合のみ実行されます。
このスクリプトはすでに作成済みで後はpostfixに組み込んでテストするだけです。
ちなみにコンフィグは以下のようなフォーマットに
[FROM FQDN][TAB|SPACE][TO FQDN][TAB|SPACE][LIMIT TIME][TAB|SPACE][LIMIT COUNT]
example.com example.jp 5 10
上記の場合example.comからexample.jpへの送信は5分間に10通まで要求を受け付けるという設定。
前回はお客さんのメールサーバーからリレーされてくるだけだと思っていたのですが、このサービスのサーバー管理者から詳細を聞いてみたところお客さんのメールサーバー(お客さんのエンドユーザーが外部へ送信する場合)だけでなく外部(お客さんのエンドユーザー宛)からも送信されてくるみたいで、さらに外部からのスパムが今回の悩みのタネだったというオチ。
そこで、上記スクリプトで外部からのFROM(スパマーがよく使うフリーのメアド)とTO(お客さんとこ)のFQDNをキーにして短時間に大量にスパムが送られてきてもコンフィグで指定した一定時間の間に一定数に達した時点で450で弾いて配送数を制御してしまおうと思ったのです。
こうしておけば正常なメールが弾かれてしまっても再送されてきたときに許容数を超えていなければちゃんと要求を通すことができるというのが今回の目玉。
最初はコンフィグでのチューニングがとても大変かもしれませんが、それはこのサービスのサーバー管理者が担当するのでキニシナイ!
以前作成したサーバー監視スクリプトにバグが見つかったので修正しました。
Socketで接続後にレスポンスから取得した文字列が静的コンテンツと動的コンテンツの場合で違うことが判明したのです。
これは常識?( ゚Д゚ )
■静的コンテンツの場合
・HTTPヘッダー終了後にコンテンツのソース
■動的コンテンツ(CGIやPHP)の場合
・HTTPヘッダー終了後にコンテンツのサイズ?らしき数字(英数字の時もある)
・次行にコンテンツのソース
・最後に0
というようなレスポンスだったので、これに対応させるよう修正を加えました。
なぜ今更こんなものを!?
それはAccessCheckerを作り直そうと思っているからです。
現在のAccessCheckerのwhois検索機能というのはサーバーにwhoisコマンドがインストールされていないと使えないのです。
そこで作り直すにあたり、まずwhois検索機能をsocketやってみよう!ということです( ´ー`)
ソースはこちらから⇒whois.pl
使い方は至って簡単
解凍してwhois.plとwhois.txtを同じ場所に設置して
perl whois.pl example.jp
と実行するだけです。
IMAP対応ならRoundCubeとかSquirrelMailとかあるからいいんだけど、IMAPイラネは自分にとってはなんというかもぅ・・・┐(´д`)┌
今はXOOPSのWebmail2を使ってるんですが他にはPOP3対応となるといいのがぜんぜんないのよね〜・・・;-(
そこでPerl+Ajax+MySQLでゴリゴリ動いてPOP3対応でPOP before SMTP対応でSMTP AUTH(SASL)対応なWEBメーラーを自分で作ってしまおうかと妄想してる訳で御座います。
プロバイダから貸してもらえるWEBスペースはperlが使えてtelnet、sshでのログインも可能でcronまで使えるのです。
そこで以前から自宅サーバーを監視するのにhttp接続を行うperlスクリプトを書いて(wgetもインストールして)ずっと監視してきていたのですが、結構適当に作ったスクリプトだったのでちゃんと作り直そうと思ったのです。
今回はwgetや余計なライブラリ、モジュール等をできるだけ使わないように書き直しました。
今まではmod_rewriteを使ったPOST制限を行っていたのですが、mod_rewriteはCIDRによる記述が出来ないため、ホストによる制限部分がどうしても正確性に欠けてしまうため、国内からのPOSTでも拒否されてしまうことがたまにありました。
そこで.htaccessでmod_rewriteを使わずに以下の条件を満たす方法を模索しました。
・制限するスクリプトを限定する
・制限するのはPOSTのみ
・国内ホストからのみ許可する
・REQUEST_URIが指定した文字列にマッチする場合は国内外問わず許可する
・国内ホストの一覧は自動更新する
だいたい週1くらいの間隔でFTPサーバーへAdministratorとか存在しないアカウントでログインを試みようとする輩がおります。
しかも何時間も継続して・・・
まぁ〜ほとんどが中国方面からなんですがね(゚Д゚#)
先日このサイトのアクセス解析のリファラーで見つけたMonkey TracksさんにCIDRを算出するスクリプトを作ってみた。についてコメントが書いてありました。
恐縮です。(/ω\)
Postfixのスパムメール対策(排除率は99.975%だった)を導入してからかれこれ2ヶ月程経ちましたが、現在も順調にスパムメールをバッサバッサと切り捨ててくれてます:−)
そこで次のステップということでcidr_tableを自動更新させようと思います。