自前で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 ご要望頂いたので自動化スクリプトを以下に公開しました。
日々業務で接しているLinux,PostgreSQL,SQLServer,FortiGateなどに関することの覚え書きや個人的に気になったことなどを綴っています。
もし、ここの情報があなたのお役に立てるならば幸いです。
2009年7月28日火曜日
2009年7月27日月曜日
2009年7月8日水曜日
PostgreSQL 8.4
今まで日付時刻に64bit整数型を使うためconfigureに--enable-integer-datetimes が必要でしたが、8.4よりデフォルトで64bit整数型になるそうです。
使わない場合は、--disable-integer-datetimes オプションを指定してconfigureを実行する必要があります。
こちらに8.4に関する技術情報が詳しく掲載されています。
使わない場合は、--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経由
# 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(メールキューは空です)
復旧後、溜まったメールキューを送信しなければ・・・汗
コマンドなんだっけ???
大したコマンドじゃないけど、つい忘れちゃうんだよね。
ということで、残しておこう。
●未配送のメールキューがどれくらいあるか調べる。
# 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
●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
登録:
投稿 (Atom)