2009年7月28日火曜日

特定の国からのパケットを破棄

自前でCentOS+Postfixにてメールサーバを立てていて月平均で2万通を処理しています。
S25R+Greylistingである程度はスパム対策をしているつもりですが、
それをすり抜けてくるスパムが後を絶たない!
特に韓国、中国がひどく最悪です。また最近ではポーランド、ロシアも多くなっています。
そこでkrfilterというサイトを見つけて韓国、中国からのパケット自体を破棄していました。
(CIDR表記されたフィルターファイルをkrfiler様からダウンロードしてiptablesで読み込み定義する)
しかし最近そのフィルターがダウンロードできずフィルタリングできない状態です。
ということで、自分でAPNIC等からIPアドレス割当リストを取得してフィルターを作ることにしました。
 
とりあえず韓国と中国からのパケット(IPv4)を破棄するよう構築します。
その前に・・・
このフィルター設定で受けた不利益に対しては一切の責任を負えません。
必ず自己責任で行うようにしてください。

また、運用にはそれなりに負荷が掛かりますので非力なマシンでは注意してください。 


1.アジア圏を管轄しているAPNICからIPアドレス割当リストの取得する。
2.リストからCIDR表記に変換してiptablesが読み込める形式でファイルを作成する。
3.iptablesを定義して2で作成したファイルを読み込む。

では実際に行ってみましょう。(尚、作業はrootで行います)
●準備
ファイル保存場所を作成する。
# mkdir /etc/myfilter
# cd /etc/myfilter

●IPアドレス割当リストの取得
# wget -O list_apnic ftp://ftp.apnic.net/pub/apnic/stats/apnic/delegated-apnic-latest
※wgetオプション-Oは別名でファイル保存します。
 ですのでダウンロードするとlist_apnicというファイル名になります。

このリストは以下のような感じで羅列されています。
1列目:管轄先
2列目:国コード
3列目:IPv4またはIPv6の判断
4列目:IPv4なら開始IPアドレス
5列目:割当個数
apnicCNipv4203.128.32.0819220050311allocated
apnicIDipv4203.128.64.0819220000613allocated
apnicCNipv4203.128.96.0819220050314allocated
apnicKRipv4203.128.160.0819220050314allocated

●CIDR表記に変換
「うざい国からのアクセスを全て遮断」で公開されている変換スクリプトを使わせていただきます。
※公開に感謝いたします。
# wget http://www.42ch.net/~shutoff/prog/countryfilter.pl

CentOSで使うために一部修正が必要なので変更します。
91行目iptablesのpathを変更します。(事前に# which iptablesでpathを確認)
================================================
print "$CommentChar variables. change these values before run.\n";
if ($FilterType == 1) { # iptables
   #print "IPTABLES=/usr/sbin/iptables\n"; ← コメント
   print "IPTABLES=/sbin/iptables\n"; ← 追記
   print "FILTERNAME=CKFILTER\n";
   print "TARGET=CKFILTERED\n";
} elsif ($FilterType == 2) { # ipfw
================================================

countryfilter.plにオプションを渡して変換します。
# perl countryfilter.pl iptables KR,CN < ist_apnic > filter_apnic.sh
※<>は実際は半角で・・・

変換されたファイルは以下のような感じで羅列されています。
$IPTABLES -A $FILTERNAME -s 222.250.0.0/16 -j $TARGET
$IPTABLES -A $FILTERNAME -s 222.251.0.0/17 -j $TARGET
$IPTABLES -A $FILTERNAME -s 222.251.128.0/17 -j $TARGET

●iptables定義
iptablesを初期化する
# /etc/init.d/iptables restart

チェインを作成する
# iptables -N CKFILTER
# iptables -N CKFILTERED

チェインにルールを追記する(変換したファイル)
# sh filter_apnic.sh

フィルターに引っかからなかったパケットを許可するルールをCKFILTERチェインに追加する
# iptables -A CKFILTER -j ACCEPT

フィルターに引っかかったパケットを破棄するルールをCKFILTEREDチェインに追加する
さらに破棄されたパケットのログを取るようにする
# iptables -A CKFILTERED -j LOG --log-prefix "Reject-TCP "
# iptables -A CKFILTERED -j DROP

TCP接続開始パケットをINPUTからCKFILTERに飛ばすようにする
# iptables -A INPUT -p tcp -m state --state NEW -j CKFILTER

確認
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
CKFILTER tcp -- anywhere anywhere state NEW

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain CKFILTER (1 references)
target prot opt source destination
CKFILTERED all -- 58.14.0.0/15 anywhere
CKFILTERED all -- 58.16.0.0/16 anywhere
CKFILTERED all -- 58.17.0.0/17 anywhere
CKFILTERED all -- 58.17.128.0/17 anywhere
  ・
  ・
  ・
こんな感じでリストが出てくればOKです。

ログの確認
# cat /var/log/messages
Jul 28 15:08:41 mail01 kernel: Reject-TCP IN=eth1 OUT= MAC=Macアドレス SRC=送信元IP DST=受けIP LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=5926 DF PROTO=TCP
SPT=42975 DPT=25 WINDOW=5840 RES=0x00 SYN URGP=0

こんな感じでログが書き込まれます。

私は一連の流れをスクリプト化して1日1回実行するようcronに登録しています。
※2009/10 1週間に1回に変更した。


アジア圏以外は以下からリストを取得することができます。
AfriNIC管轄:アフリカ地域
ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
ARIN 管轄:アメリカ北部圏
ftp://ftp.arin.net/pub/stats/arin/delegated-arin-latest
LACNIC管轄:ラテンアメリカ及び西インド諸島地域
ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
RIPE NIC管轄:ヨーロッパ地域
ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest


参考にしたサイト
「うざい国からのアクセスを全て遮断」
krfilter - deny accesses from .kr


※2013/05/13 ご要望頂いたので自動化スクリプトを以下に公開しました。

2009年7月27日月曜日

Linux初心者

これからLinuxを始めようと思う方・・・
 
「Linuxサーバー構築標準教科書」(無償)というのが公開されており
OSのインストールからDNS,Web,Mailと基本的な構築方法を学ぶことができます。
 
GUIによるインストール説明ですが基礎を学ぶには十分な内容でしょう。
とにかく何度もインストールをして体で(!?)覚えることをお勧めします。
 
ダウンロードはこちらからどうぞ!
 

2009年7月8日水曜日

PostgreSQL 8.4

今まで日付時刻に64bit整数型を使うためconfigureに--enable-integer-datetimes が必要でしたが、8.4よりデフォルトで64bit整数型になるそうです。
使わない場合は、--disable-integer-datetimes オプションを指定してconfigureを実行する必要があります。

こちらに8.4に関する技術情報が詳しく掲載されています。
 

2009年7月2日木曜日

Redmine PDF 文字化け

CSV,PDFの文字化け対策として/lang/ja.ymlを以下のように以前編集しましたが
# vi [RedmineインストールDir]/lang/ja.yml (ファイル自体UNICODEで書かれています)54行目付近

general_pdf_encoding: UTF-8
general_csv_encoding: UTF-8

   ↓

general_pdf_encoding: CP392
general_csv_encoding: CP392
ある文字が含まれていると文字化けを起こすようです。そのある文字とは「~」です。

これが含まれているとその行のみですが化けてしまうようですね、
文字数が関連しているのか?チケットの題名に全角22文字ぐらいを超えるとその部分が文字化けを起こすように思えます。ソースレベルでの検証はしていませんが・・・

 
環境:CentOS PostgreSQL Apache経由
 
 

Postfix メールキュー

FortiGateの設定を間違ってしまって一時的にメール配送(送信)ができなくなってしまった!
復旧後、溜まったメールキューを送信しなければ・・・汗
コマンドなんだっけ???
大したコマンドじゃないけど、つい忘れちゃうんだよね。
ということで、残しておこう。

●未配送のメールキューがどれくらいあるか調べる。
# postqueue -p (mailqでも可能)

●キューをフラッシュ: キューにある全てのメールの配送を試みる。
# postqueue -f

●特定のキューをフラッシュ: hoge@example.com宛のメールのみの配送を試みる。
# postqueue -s hoge@example.com

●不要なキューを削除(指定のQueue ID)
# postsuper -d Queue ID

●メールの内容を見る(指定のQueue ID)
# postcat -q Queue ID

無事配送完了!

Mail queue is empty(メールキューは空です)

SQL Server DEFAULT 制約名を取得

ユーザーが定義したテーブルの各フィールドに定義されている制約名を取得する。
 
●SQL Server 2005以降
 
SELECT
 tb.id AS tb_id, --(テーブルID)
 tb.name AS tb_name, --(テーブル名)
 col.object_id AS col_id,  --(フィールドID)
 col.name AS col_name,   --(フィールド名)
 col.default_object_id AS const_id, --(制約ID)
 const.name AS const_name --(制約名)
FROM sys.columns AS col
 LEFT JOIN sysobjects AS tb ON col.object_id = tb.id
 LEFT JOIN sys.default_constraints AS const ON col.default_object_id = const.object_id
WHERE (col.object_id IN(SELECT id FROM sysobjects WHERE (xtype = 'U'))) --ユーザーテーブルのみに限定
ORDER BY tb.id
 
 
●SQL Server 2000(SQL Server 2005も可能)
 
SELECT
 tb.id as tb_id,
 tb.name as tb_name,
 col.name as col_name,
 col.cdefault as const_id,
 const.name as const_name
FROM syscolumns as col
 LEFT JOIN sysobjects as tb on col.id = tb.id
 INNER JOIN sysobjects as const on col.cdefault = const.id
WHERE tb.xtype IN('U', 'D') AND
OTDER BY tb.id
 

Google検索