krfilter - deny accesses from .kr

English?

What's this?

概要

韓国(.kr)・中国(.cn)・台湾(.tw)・香港(.hk)等,アジア地域からのアクセスを フィルタリングするための iptables を用いたシェルスクリプトです。もちろん Linux 専用です。

APNICIP アドレス割り当てリスト に掲載されている上記の国と地域のネットワークからの TCP 接続を遮断します。 ただし,自分から上記の国と地域のネットワークへ接続することはできます。

FreeBSD をお使いでしたら,水無川研究所さんの ipfwとBINDによるNaverRobot対策フィルタ が参考になると思います(というか知ってる人ですが……)。

意義

日本の IP 領域にアクセスしてくるワームは,おおかた上記の国と地域からのものです。特に韓国からがひどいといえます。 また,韓国には,悪名高い NaverRobot ように DoS まがいのアクセスを仕掛けてくる自称サーチエンジンも存在します。

韓国や中国から送られてくるメールも普通は SPAM 以外にあり得ませんし。冷静に考えてみれば上記の国と地域から まともなアクセスが来ることなんて(滅多に)ないのです。

有害なアクセスしかしてこない国と地域をパケットレベルで排除してしまおうというのが本稿の趣旨です。

おことわり

上記の国と地域のネットワークからの TCP 接続が全て遮断されますので,メールが受信できないなどの予期しないトラブルが 発生する可能性はあります。

ご利用は計画的に。

本フィルタを利用して受けたいかなる不利益に対しても,私は一切の責任を負いません。

動作説明

iptables によるフィルタリング

iptables をよく知っている方だけではないと思いますので,簡単に説明しておきます。

Linux 2.4 系列からパケットフィルタリングなどを行うために netfilter という機構が導入されました。柔軟な設定が可能で, メジャー OS の中ではおそらく最強を誇る機能です。iptables は netfilter に設定を行うためのラッパーです。

この iptables を用いて,「TCP の接続を確立しようとするパケット」に限定して送信元をチェックし,送信元が 韓国 IP などであれば捨ててしまいます。もちろん,自分から接続するときはチェックに引っかかりません。

模式図

最初に TCP 新規接続のパケットを別チェインに飛ばしているため,接続確立済の TCP パケットなどに無駄なチェックが 行われず,負荷もかかりません(RELATED と ESTABLISHED を最初に ACCEPT してしまうというのもありですが)。

使い方

各国用フィルタのダウンロード

フィルタリングの適用

フィルタ用に iptables のチェインを作成します。作業は全て root で行ってください。

# iptables -N KRFILTER
# iptables -N KRFILTERED

上でダウンロードしたシェルスクリプトを適用し,KRFILTER チェインにルールを追加します。

# sh ALL.sh.txt

国別フィルタに引っかからなかったパケットを受理する設定を KRFILTER チェインに追加します。

# iptables -A KRFILTER -j ACCEPT

国別フィルタに引っかかったパケットを破棄する設定を KRFILTERED チェインに追加します。

# iptables -A KRFILTERED -j DROP

フィルタのログを取りたければ,代わりに以下のように設定します。ログは dmesg コマンド等で参照できます。

# iptables -A KRFILTERED -j LOG --log-prefix "Rej-TCP "
# iptables -A KRFILTERED -j DROP

最後に,TCP 接続開始パケット(NEW)を INPUT チェインから KRFILTER に飛ばす設定を追加して完成です。

# iptables -A INPUT -p tcp -m state --state NEW -j KRFILTER

手入力するのは面倒なので,システムの起動スクリプトに書いておくのが良いでしょう。

フィルタリングの解除

国別フィルタのルールを削除するには,まず INPUT チェインのルール一覧を見て

# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
KRFILTER   tcp  --  anywhere             akane.hakusan.tsg.ne.jpstate NEW 

INPUT チェインから KRFILTER チェインに飛ばしているルールを削除します。上の例だと1番目のルールなので,

# iptables -D INPUT 1

のようにして削除します。

KRFILTER チェインと KRFILTERED チェインを,それぞれクリアしてから削除すれば終了です。

# iptables -F KRFILTER
# iptables -X KRFILTER
# iptables -F KRFILTERED
# iptables -X KRFILTERED

Known bugs

APNIC 管轄外の IP

各国に割り当てられている全ての IP アドレスが APNIC のリストに掲載されているわけではありません。

例えば,日本だと 東京大学 が 所有している 133.11.0.0/16 や 157.82.0.0/16 は JPNIC の whois DB には載っていても APNIC の国別割り当てリスト には掲載されていません。

大手プロバイダに割り当てられている /8 のアドレスなども,APNIC 管轄外で割り当てられたアドレスが日本国内で使われている 例があります。

このようなことは日本以外の国でも起きているはずなので,APNIC のリストに掲載されているアドレスをブロックするだけでは 不十分だと思われます。が,何もしないよりはずっとましでしょう:)

www.hakusan.tsg.ne.jp での運用状況

昨日(8 月15 日)は,本フィルタで 478 件の接続を遮断しました。


おまけ

0.0.0.0/0 形式のリスト



← 上階層へ


misora@hpot.r-x.jp Copyright © 1999-2004 by T.Tsujikawa / All rights reserved.