ウェブサーバ、メールサーバ、SIPサーバなどを公開していると国外からあまり歓迎できないアクセスが時にまばらに、時にしつこくやってくる。
これらのアクセスを放置するのはセキュリティ上好ましくないだけでなく、サーバやネットワークのリソースの無駄遣いにもなる。
最近のパケットフィルタは(PCは?)大きなテーブルを読み込んで高速に処理できるので不要な国のアクセスを丸ごと弾いたり日本国内+特定の国からのアクセスだけ通すというような処理も気軽に行える。
また、サービス毎に違うフィルタを使うことも簡単にできる(特にpf)。例えばSMTPとHTTPでは迷惑な国が違ったりするが、サービスによって異なる対処が簡単にできるのは有効だと思われる。
以下は日本と、迷惑メールやDOS,ボットなどの迷惑行為の特に多い国のフィルタで、日本だけを許可し他を弾く、或いは特定の国だけを許可するまたは弾くという使用を想定したものとなっている。
pf用, ipfw用, iptables用を提供、単純にCIDRが欲しいならpf用がまさにそれ。
それぞれ毎日 毎週火曜日04:00頃に自動更新。
なお、提供するデータは無保証です。
2017年10月14日: 更新頻度を変更しました。(毎日→毎週)
Regional Internet Registriesが配布しているファイルを加工しているだけなので何かの権利を主張しません。好きに転載するなり改変するなりご利用下さい。
アプリケーション等に組み込む利用についてもご自由にどうぞ。ただし、このサイトにファイルを取りに来る仕組みを入れたアプリケーションを無制限に配布するのはご遠慮いただきたいと思います。ファイル取得で大量にアクセスされると困るという意味です。
ちなみにiptablesについては良く知らないのでうざい国からのアクセスを全て遮断さんのを参考にコメント以外は同じのが出るようにした(つもり)。
2016年6月3日にipsetを併用する方式に変更したので違うものになった。
Following files are IP address blocks allocated for each country.
Those files are updated every day.
"pf" is firewall for OpenBSD / FreeBSD.
"ipfw" is firewall for FreeBSD.
"iptables" is firewall for Linux.
If you want CIDR, download "pf".
"ipset" is required in scripts for "iptables" on this page.
国(地域)別フィルタ
おまけ1: 日本Allow,Acceptルール
国名・地域 | pf | ipfw | iptables |
---|---|---|---|
日本 許可用 | 上のリストの日本と同じ |
ipfw用, iptables用のそれぞれルール中の1単語がDenyからallow、DropからAcceptに変わっただけ。
おまけ2: 特亜フィルタ
国名・地域 | pf | ipfw | iptables |
---|---|---|---|
支那・朝鮮 |
支那と朝鮮を1つのリストにした。支那には香港と澳門が含まれる。朝鮮は南北共に入っている。TLDでいえばCN,HK,MO,KR,KP。
おまけ3: 支那の3大通信業者フィルタ
メールサーバとかやってると中国電信, 中国移動, 中国聯通の3つを弾くだけでも結構効果があったりするので、国別の巨大なフィルタを使うほどではないという方はどうぞ。CIDRのリストなのでpfならそのままテーブルとして読めるがipfwやiptablesで使うならルールになるよう適当に整形が必要。
このリストは手動更新のみで頻繁には更新しません。また、IPアドレス把握している範囲のみです。中国電信, 中国移動, 中国聯通の全IPアドレスを網羅している保証はありません。
おまけ4: EUフィルタ
国名・地域 | pf | ipfw | iptables |
---|---|---|---|
EU 28加盟国 |
変なアクセスが多いというのとは違う意味で超ウザい※欧州連合(EU)はネットワークサービス提供者にとっては特に用がなければ、いっそ弾いてしまった方が楽。(※一般データ保護規則 GDPRのこと)
TLDでいえばAT,BE,BG,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IT,LT,LU,LV,MT,NL,PL,PT,RO,SE,SI,SK。
pf用テーブルの使い方
# fetch -o /etc https://gato.intaa.net/files/exclusive_filter/pf_table_cn_kr_kp.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | ext_if = "fxp0"
table <tokuafilter> persist file "/etc/pf_table_cn_kr_kp.txt"
table <jpfilter> persist file "/etc/pf_table_jp.txt"
table <botfilter> persist file "/etc/pf_table_evilbot.txt"
tcp_services = "{ smtp, www, https }" #サーバを外部に公開してるなら
udp_services = "{ ntp, snmp }" #サーバを外部に公開しているなら
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
Icmp_types = "icmp-type { echoreq, unreach }"
TcpState ="flags S/SA keep state"
UdpState ="keep state"
set block-policy drop
set loginterface $ext_if
set skip on lo0
scrub in all
#pfでNATをやるならなら以下1行 (その場合は事前にint_net = "{ 192.168.0.0/24 }"のように指定)
nat on $ext_if from $int_net to any -> ($ext_if)
block all
block in quick on $ext_if from $priv_nets to any
block out quick on $ext_if from any to $priv_nets
block in quick on $ext_if from { <tokuafilter>, <botfilter> } to ($ext_if)
block out quick on $ext_if from ($ext_if) to { <tokuafilter>, <botfilter> }
#Inbound TCP/UDP
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services $TcpState
pass in on $ext_if inet proto udp from any to ($ext_if) port $udp_services $UdpState
pass in on $ext_if inet proto udp from <jpfilter> to ($ext_if) port sip $UdpState
#Outbound TCP/UDP
pass out on $ext_if inet proto tcp $TcpState
pass out on $ext_if inet proto udp $UdpState
#ICMP Inbound/Outbound
pass on $ext_if inet proto icmp all $icmp_types keep state
|
起動
# /etc/rc.d/pf start
フィルタテーブルの更新(差し替え)
# fetch -o /etc https://gato.intaa.net/files/exclusive_filter/pf_table_cn_kr_kp.txt # pfctl -F Tables テーブル情報だけを消す (TablesのTは大文字) # pfctl -Tl -f /etc/pf.conf テーブル情報だけ読み込み※pfctl -F Tablesで全てのテーブル情報が消えるのでfail2banなどを使っている場合はfail2banも再起動する
フィルタ(テーブル)の確認
# pfctl -t tokuafilter -T show
2016年6月3日追記:
iptablesについては巨大なルールを読もうとすると途中で停まる可能性があるのとパフォーマンスがかなり悪くなるらしいので、ipsetでIPアドレスを読み込み最後にiptablesへ嵌める方法に変更しました。pfのテーブルのような感じ?
ipsetが使えないと話にならないのでご注意願います。
これまでiptablesのルールファイルが巨大になりすぎるのを防ぐために受信方向(INPUT)のみのファイルタルールにしていたものをipset利用に伴い双方向(INPUT/OUTPUT)フィルタにしています。
2016年6月18日追記:
連続するCIDRをマージ適化することでリストの行数を削減するようにした。国によってはリストの行数が70%程度減少、平均で30%程度減少する。
例: 192.168.0.0/24,192.168.1.0/24 → 192.168.0.0/23
2016年6月20日追記
スパムなどの迷惑上位国だけリストを提供していたが、「IPアドレス割り当てのある全ての国と地域」のTLDに拡充した。全ての国と地域のTLDではないのでお間違いなく。
架空の国(ZZ)なんてのもあるけどふざけてるのではなくそういう割当があるらしいので含めている。
2016年6月27日追記
国外から見に来てる人がそれなりに居るようなのでタイトルに「 (Country Filter)」を追加した。
2016年7月1日追記
支那の3大通信業者フィルタをまるっと更新。これまで録り溜めたIPアドレスからそのIPアドレスを含むCIDRを調べている。中国移動はこれまでとおり綺麗に大きなネットワークを使ってくれているようなので簡単だったが、あとの2つは嫌がらせのように細切れになっているのでリストがかなり大きくなってしまった。
2018年11月10日追記
このページで提供しているpf用(要するにCIDRだけのリスト)を「悪いインターネット」IPV4アドレス国別割当てリストでも提供。全く同じファイルです。
また、IPv6版を新たに提供開始。これもCIDRだけのリストで、「悪いインターネット」のIPv6アドレス国別割当てリストだけで提供。「がとらぼ」では提供しない予定。
関連記事:
少なくとも9/3取得分からIPアドレスのリストが空になっているようです
ありがとうございます。CIDR最適化用のaggregateが壊れていました。原因は不明ですが、おそらくFreeBSDのportsの更新時にビルドが正しく行われなかったものと思われます。
本日問題箇所を修正してファイルを出力しています。