鎖国フィルタ (Country Filter)

ウェブサーバ、メールサーバ、SIPサーバなどを公開していると国外からあまり歓迎できないアクセスが時にまばらに、時にしつこくやってくる。
これらのアクセスを放置するのはセキュリティ上好ましくないだけでなく、サーバやネットワークのリソースの無駄遣いにもなる。

最近のパケットフィルタは(PCは?)大きなテーブルを読み込んで高速に処理できるので不要な国のアクセスを丸ごと弾いたり日本国内+特定の国からのアクセスだけ通すというような処理も気軽に行える。
また、サービス毎に違うフィルタを使うことも簡単にできる(特にpf)。例えばSMTPとHTTPでは迷惑な国が違ったりするが、サービスによって異なる対処が簡単にできるのは有効だと思われる。

以下は日本と、迷惑メールやDOS,ボットなどの迷惑行為の特に多い国のフィルタで、日本だけを許可し他を弾く、或いは特定の国だけを許可するまたは弾くという使用を想定したものとなっている。

pf用, ipfw用, iptables用を提供、単純にCIDRが欲しいならpf用がまさにそれ。
それぞれ毎日04:00頃に自動更新。
なお、無保証です。

ちなみに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.

国(地域)別フィルタ

国名・地域pfipfwiptables
AD AD: Andorra
AE AE: United Arab Emirates
AF AF: Afghanistan
AG AG: Antigua and Barbuda
AI AI: Anguilla
AL AL: Albania
AM AM: Armenia
AO AO: Angola
AP AP: Asia Pacific region
AR AR: Argentina
AS AS: American Samoa
AT AT: Austria
AU AU: Australia
AW AW: Aruba
AX AX: Åland
AZ AZ: Azerbaijan
BA BA: Bosnia and Herzegovina
BB BB: Barbados
BD BD: Bangladesh
BE BE: Belgium
BF BF: Burkina Faso
BG BG: Bulgaria
BH BH: Bahrain
BI BI: Burundi
BJ BJ: Benin
BL BL: Saint Barthélemy
BM BM: Bermuda
BN BN: Brunei
BO BO: Bolivia
BQ BQ: Bonaire, Sint Eustatius and Saba
BR BR: Brazil
BS BS: Bahamas
BT BT: Bhutan
BW BW: Botswana
BY BY: Belarus
BZ BZ: Belize
CA CA: Canada
CD CD: Democratic Republic of the Congo
CF CF: Central African Republic
CG CG: Republic of the Congo
CH CH: Switzerland
CI CI: Côte d'Ivoire
CK CK: Cook Islands
CL CL: Chile
CM CM: Cameroon
CN CN: People's Republic of China
CO CO: Colombia
CR CR: Costa
CU CU: Cuba
CV CV: Cape Verde
CW CW: Curaçao
CY CY: Cyprus
CZ CZ: Czech Republic
DE DE: Germany
DJ DJ: Djibouti
DK DK: Denmark
DM DM: Dominica
DO DO: Dominican Republic
DZ DZ: Algeria
EC EC: Ecuador
EE EE: Estonia
EG EG: Egypt
ER ER: Eritrea
ES ES: Spain
ET RT: Ethiopia
EU EU: European Union
FI FI: Finland
FJ FJ: Fiji
FM FM: Federated States of Micronesia
FO FO: Faroe Islands
FR FR: France
GA GA: Gabon
GB GB: United Kingdom
GD GD: Grenada
GE GE: Georgia
GF GF: French Guiana
GG GG: Guernsey
GH GH: Ghana
GI GI: Gibraltar
GL GL: Greenland
GM GM: The Gambia
GN GN: Guinea
GP GP: Guadeloupe (Saint-Barthélemy and Saint-Martin)
GQ GQ: Equatorial Guinea
GR GR: Greece
GT GT: Guatemala
GU GU: Guam
GW GW: Guinea-Bissau
GY GY: Guyana
HK HK: Hong Kong
HN HN: Honduras
HR HR: Croatia
HT HT: Haiti
HU HU: Hungary
ID ID: Indonesia
IE IE: Ireland
IL IL: Israel
IM IM: Isle of Man
IN IN: India
IO IO: British Indian Ocean Territory
IQ IQ: Iraq
IR IR: Iran
IS IS: Iceland
IT IT: Italy
JE JE: Jersey
JM JM: Jamaica
JO JO: Jordan
JP JP: Japan
KE KE: Kenya
KG KG: Kyrgyzstan
KH KH: Cambodia
KI KI: Kiribati
KM KM: Comoros
KN KN: Saint Kitts and Nevis
KP KP: Democratic People's Republic of Korea
KR KR: Republic of Korea
KW KW: Kuwait
KY KY: Cayman Islands
KZ KZ: Kazakhstan
LA LA: Laos
LB LB: Lebanon
LC LC: Saint Lucia
LI LI: Liechtenstein
LK LK: Sri Lanka
LR LR: Liberia
LS LS: Lesotho
LT LT: Lithuania
LU LU: Luxembourg
LV LV: Latvia
LY LY: Libya
MA MA: Morocco
MC MC: Monaco
MD MD: Moldova
ME ME: Montenegro
MF MF: Saint Martin
MG MG: Madagascar
MH MH: Marshall Islands
MK MK: Macedonia
ML ML: Mali
MM MM: Myanmar
MN MN: Mongolia
MO MO: Macau
MP MP: Northern Mariana Islands
MQ MQ: Martinique
MR MR: Mauritania
MS MS: Montserrat
MT MT: Malta
MU MU: Mauritius
MV MV: Maldives
MW MW: Malawi
MX MX: Mexico
MY MY: Malaysia
MZ MZ: Mozambique
NA NA: Namibia
NC NC: New Caledonia
NE NE: Niger
NF NF: Norfolk Island
NG NG: Nigeria
NI NI: Nicaragua
NL NL: Netherlands
NO NO: Norway
NP NP: Nepal
NR NR: Nauru
NU NU: Niue
NZ NZ: New Zealand
OM OM: Oman
PA PA: Panama
PE PE: Peru
PF PF: French Polynesia
PG PG: Papua New Guinea
PH PH: Philippines
PK PK: Pakistan
PL PL: Poland
PM PM: Saint Pierre and Miquelon
PR PR: Puerto Rico
PS PS: Palestine
PT PT: Portugal
PW PW: Palau
PY PY: Paraguay
QA QA: Qatar
RE RE: Réunion (a French island located in the Indian Ocean, east of Madagascar)
RO RO: Romania
RS RS: Serbia
RU RU: Russia
RW RW: Rwanda
SA SA: Saudi Arabia
SB SB: Solomon Islands
SC SC: Seychelles
SD SD: Sudan
SE SE: Sweden
SG SG: Singapore
SI SI: Slovenia
SK SK: Slovakia
SL SL: Sierra Leone
SM SM: San Marino
SN SN: Senegal
SO SO: Somalia
SR SR: Suriname
SS SS: South Sudan
ST ST: São Tomé and Príncipe
SV SV: El Salvador
SX SX: Sint Maarten
SY SY: Syria
SZ SZ: Swaziland
TC TC: Turks and Caicos Islands
TD TD: Chad
TG TG: Togo
TH TH: Thailand
TJ TJ: Tajikistan
TK Tokelau
TL TL: East Timor
TM TM: Turkmenistan
TN TN: Tunisia
TO TO: Tonga
TR TR: Turkey
TT TT: Trinidad and Tobago
TV TV: Tuvalu
TW TW: Taiwan
TZ TZ: Tanzania
UA UA: Ukraine
UG UG: Uganda
US US: United States of America
UY UY: Uruguay
UZ UZ: Uzbekistan
VA VA: Vatican City
VC VC: Saint Vincent and the Grenadines
VE VE: Venezuela
VG VG: British Virgin Islands
VI VI: United States Virgin Islands
VN VN: Vietnam
VU VU: Vanuatu
WF WF: Wallis and Futuna
WS WS: Samoa
YE YE: Yemen
YT YT: Mayotte
ZA ZA: South Africa
ZM ZM: Zambia
ZW ZW: Zimbabwe
ZZ ZZ: Fictional country

おまけ1: 日本Allow,Acceptルール

国名・地域pfipfwiptables
日本 許可用 上のリストの日本と同じ

ipfw用, iptables用のそれぞれルール中の1単語がDenyからallow、DropからAcceptに変わっただけ。

おまけ2: 特亜フィルタ

国名・地域pfipfwiptables
支那・朝鮮

支那と朝鮮を1つのリストにした。支那には香港と澳門が含まれる。朝鮮は南北共に入っている。TLDでいえばCN,HK,MO,KR,KP。

おまけ3: 支那の3大通信業者フィルタ

メールサーバとかやってると中国電信, 中国移動, 中国聯通の3つを弾くだけでも結構効果があったりするので、国別の巨大なフィルタを使うほどではないという方はどうぞ。CIDRのリストなのでpfならそのままテーブルとして読めるがipfwやiptablesで使うならルールになるよう適当に整形が必要。
このリストは手動更新のみで頻繁には更新しません。また、IPアドレス把握している範囲のみです。中国電信, 中国移動, 中国聯通の全IPアドレスを網羅している保証はありません。

pf_table_cn_telecom.txt

pf用テーブルの使い方

# fetch -o /etc https://gato.intaa.net/files/exclusive_filter/pf_table_cn_kr_kp.txt
/etc/pf.conf
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
※32行目 sip(udp)は日本だけアクセス可能とする

/etc/rc.conf
pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"

起動

# /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つは嫌がらせのように細切れになっているのでリストがかなり大きくなってしまった。

関連記事: