手軽にIPアドレスを規制できる「.htaccess」についてまとめました

本日WordPressのダッシュボードを見てみると2000件を超える大量のコメントが来ていました。もちろんファンレターではなく、スパムコメントです。
そんな時の強い味方「.htaccess」。この便利機能を使って、IPアドレスを規制します。
以下、大量のスパムを送りつけてきたIPやメールアドレス
名前:ebotubamu
メールアドレス:usdf3sdacia@gmail.com
IP:91.207.5.206
丁寧なことに、1分で1つずつコメントを投稿し続けています。
WordPressにはもともと強力なスパム対策プラグインが用意されています。しかし、こういった同一IPによるスパムを、いちいち確認したり、削除ボタンを押す手間も惜しいですよね。そこで「.htaccess」を使ってアクセス自体を規制しましょう。
設置方法
すでにWordPressを運用していれば、ルートディレクトリ(一番上のディレクトリ)に「.htaccess」というファイルがあるはずです。そのファイルをダウンロードして編集します。
「.htaccess」はメモ帳では編集できないので秀丸など対応したテキストエディタを使用しましょう。
既にいろいろと書かれているかもしれませんが、91.207.5.206のIPアドレスを規制したい場合は最後の行に
order allow,deny
allow from all
deny from 91.207.
と追加してください。
保存したら元のルートディレクトリにアップロードすればアクセス規制は完了です。(ルートディレクトリに置くとサブディレクトリ全てに適応されます)
詳しくは専門のサイトに任せるとして、簡単に説明します。
そもそも「.htaccess」はApacheというWebサーバで使える設定ファイルです。複雑な記述もできますが、簡単なアクセス規制だけなら、いくつかのルールを覚えるだけで運用できます。
「allowが許可」、「denyが拒否」を表します。「order」はallowとdenyの順序を指定します。この3点だけ覚えてください。
まず上の例で解説をします。
1行目order allow,denyは「許可してから拒否」という順序でアクセスを制御する指定。
2行目allow from allは「全てのアクセスを許可」で、いったんすべてのアクセスを許可する。
3行目deny from 91.207.は「91.207.で始まるIPを規制」という意味になります。91.207.移行のIPはどのような数字でも規制。
この方法では「91.207.で始まるIPを規制」を全て規制します。もしも通常の利用者が同じIPアドレスでアクセスしてきた場合も規制されます。そのため規制するアドレスの選定には注意してください。
補足
せっかくなので、他の使い方もまとめておきます。
上から「.co.jp」で終わる逆引きアドレスを拒否。ドメイン名vectant.ne.jpを拒否。IPを指定して拒否。特定の国からのアクセスだけ拒否。
(国で拒否できるのは、国コードを取得できる場合のみ。この例では中国)
# 許可してから拒否
order allow,deny
allow from all
deny from .co.jp
deny from vectant.ne.jp
deny from 91.207.5.206
deny from .cn
特定の国に割り当てられたIPを元にアクセスを拒否または許可
上記の「.cn」で拒否する方法だと国コードを取得でいないと正常に拒否できませんでしたが、IPの割り当てリストを使えば完全に拒否できます。
問題はIPの割り当てが日々変化することと、リストが膨大になる点です。例えば中国のIPの割り当ては成形しても2768ブロック(行)にもなります。(2013年11月現在)
それでもスパムに対しては非常に効果の高い方法なので、リストをcronで自動で取得したり、一定期間ごとに更新して運用してください。
リストはこちらのサイトから取得できます。希望する国を選択したら、「整形済みテキスト」をクリックしてリストを取得すると加工しやすくお勧めです。
# 許可してから拒否
order allow,deny
allow from all
# 中国に割り当てられたIPからのアクセスを全て拒否
deny from 1.0.1.0/24
deny from 1.0.2.0/23
deny from 1.0.8.0/21
…(以下IPが続く)
日本に割り当てられたIPのみアクセスを許可する場合はこちら
# 拒否してから許可
Order deny,allow
deny from all
# 日本に割り当てられたIPのみアクセスを許可
deny from 1.0.16.0/20
deny from 1.0.64.0/18
deny from 1.1.64.0/18
…(以下IPが続く)
特定のディレクトリだけ規制
「Directory “/der”」で囲むことで特定のディレクトリ以下を規制することができます。
<Directory "/WordPress/wp-content/uploads">
Order allow,deny
Allow from all
deny from hoge
</Directory>
ファイル名にマッチした場合アクセスを拒否
ファイル名で規制するにはFilesMatchを使います。「^¥.ht」とは正規表現で「.ht」で始めるファイル名のものを指定しています。
「.htaccess」ファイルに外部からアクセスさせないための設定です。
2行名が「Allow from all」でなく「Deny from all(全てのアクセスを拒否)」になっている点に注意。
<FilesMatch "^¥.ht">
Order allow,deny
Deny from all
</FilesMatch>
逆に特定のIPアドレスだけ許可をする
この例ではローカルからのアクセスだけ許可しています。
Order deny,allow
deny from all
allow from 192.168.0.1
特定のユーザーエージェントを拒否する
スパム用のツールは大抵特殊なユーザーエージェントをしており、スパマーにはツールをカスタマイズして使う能力が無いため効果があります。
カッコの前だけエスケープ(\)する必要があります。
# 拒否するユーザーエージェントの定義
SetEnvIf User-Agent "MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0" ref_deny
SetEnvIf User-Agent "Mozilla/4.0 \(compatible; MSIE 6.0; Windows NT 5.1\)" ref_deny
# 許可してから拒否
order allow,deny
allow from all
# 定義したユーザーエージェントの指定
deny from env=ref_deny
カントリーコード
国別にアクセス規制する際にどうぞ
| ad |
Andorra(アンドラ) |
| ae |
United Arab Emirates(アラブ首長国連邦) |
| ag |
Antigua And Barbuda(アンチグア・バーブーダ) |
| ai |
Anguilla(アンギラ) |
| al |
Albania(アルバニア) |
| am |
Armenia(アルメニア) |
| an |
Netherlands Antilles() |
| ao |
Angola(アンゴラ) |
| aq |
Antarctica(南極大陸) |
| ar |
Argentina(アルゼンチン) |
| at |
Austria(オーストリア) |
| au |
Australia(オーストラリア) |
| aw |
Aruba(アルバ) |
| az |
Azerbaijan(アゼルバイジャン) |
| ba |
Bosnia And Herzegowina(ボスニア・ヘルツェゴビナ) |
| bb |
Barbados() |
| be |
Belgium(ベルギー) |
| bf |
Burkina Faso(ブルキナファソ) |
| bg |
Bulgaria(ブルガリア) |
| bh |
Bahrain(バーレーン) |
| bi |
Burundi(ブルンジ) |
| bj |
Benin(ベナン) |
| bm |
Bermuda(バミューダ) |
| bn |
Brunei Darussalam(ブルネイ・ダルサラーム国) |
| bo |
Bolivia(ボリビア) |
| br |
Brazil(ブラジル) |
| bs |
Bahamas(バハマ) |
| bw |
Botswana(ボツワナ) |
| by |
Belarus(ベラルーシ) |
| bz |
Belize(ベリーズ) |
| ca |
Canada(カナダ) |
| cf |
Central African Republic(中央アフリカ共和国) |
| cg |
Congo(コンゴ) |
| ch |
Switzerland(スイス) |
| ci |
Cote D’Ivoire(コートジボアール) |
| ck |
Cook Islands(クック諸島) |
| cl |
Chile(チリ) |
| cm |
Cameroon(カメルーン) |
| cn |
China(中国) |
| co |
Colombia(コロンビア) |
| cr |
Costa Rica(コスタリカ) |
| cu |
Cuba(キューバ) |
| cv |
Cape Verde(カーボベルデ) |
| cy |
Cyprus(キプロス) |
| cz |
Czech Republic(チェコ共和国) |
| de |
Germany(ドイツ) |
| dj |
Djibouti(ジブチ) |
| dk |
Denmark(デンマーク) |
| dm |
Dominica(ドミニカ) |
| do |
Dominican Republic(ドミニカ共和国) |
| dz |
Algeria(アルジェリア) |
| ec |
Ecuador(エクアドル) |
| ee |
Estonia(エストニア) |
| eg |
Egypt(エジプト) |
| er |
Eritrea(エリトリア) |
| es |
Spain(スペイン) |
| et |
Ethiopia(エチオピア) |
| fi |
Finland(フィンランド) |
| fj |
Fiji(フィジー) |
| fm |
Micronesia(ミクロネシア) |
| fo |
Faroe Islands(フェロー諸島) |
| fr |
France(フランス) |
| gb |
Great Britain(UK)(グレートブリテン) |
| gd |
Grenada(グレナダ) |
| ge |
Georgia(グルジア) |
| gf |
French Guiana() |
| gg |
Guernsey(ガンジー) |
| gh |
Ghana(ガーナ) |
| gi |
Gibraltar(ジブラルタル) |
| gl |
Greenland(グリーンランド) |
| gn |
Guinea(ギニア) |
| gp |
Guadeloupe(グアドループ) |
| gr |
Greece(ギリシア) |
| gt |
Guatemala(グアテマラ) |
| gu |
Guam(グアム) |
| gy |
Guyana(ガイアナ) |
| hk |
Hong Kong(香港) |
| hn |
Honduras(ホンジュラス) |
| hr |
Croatia(クロアチア) |
| hu |
Hungary(ハンガリー) |
| id |
Indonesia(インドネシア) |
| ie |
Ireland(アイルランド) |
| il |
Israel(イスラエル) |
| im |
Isle of Man() |
| in |
India(インド) |
| ir |
Iran(イランド) |
| is |
Iceland(アイスランド) |
| it |
Italy(イタリア) |
| je |
Jersey(ジャージー) |
| jm |
Jamaica(ジャマイカ) |
| jo |
Jordan(ヨルダン) |
| jp |
Japan(日本) |
| ke |
Kenya(ケニヤ) |
| kh |
Cambodia(カンボジア) |
| ki |
Kiribati(キリバス) |
| kn |
Saint Kitts And Nevis(セントクリストファ-ネイビス) |
| kr |
Korea, Republic Of(韓国) |
| kw |
Kuwait(クウェート) |
| ky |
Cayman Islands(ケーマン諸島) |
| kz |
Kazakhstan(カザフスタン) |
| la |
Lao People’s Democratic Republic() |
| lb |
Lebanon(レバノン) |
| lc |
Saint Lucia(セントルシア) |
| li |
Liechtenstein(リヒテンシュタイン) |
| lk |
Sri Lanka(スリランカ) |
| ls |
Lesotho(レソト) |
| lt |
Lithuania(リトアニア) |
| lu |
Luxembourg(ルクセンブルグ) |
| lv |
Latvia(ラトビア) |
| ma |
Morocco(モロッコ) |
| mc |
Monaco(モナコ) |
| md |
Moldova(モルドバ) |
| mg |
Madagascar(マダガスカル) |
| mh |
Marshall Islands(マーシャル諸島) |
| mk |
Macedonia(マケドニア) |
| ml |
Mali(マリ) |
| mn |
Mongolia(モンゴリア) |
| mo |
Macau(マカオ) |
| mp |
Northern Mariana Islands(北マリアナ諸島) |
| mr |
Mauritania(モーリタニア) |
| mt |
Malta(マルタ) |
| mu |
Mauritius(モーリシャス) |
| mv |
Maldives(モルジブ) |
| mw |
Malawi(マラウイ) |
| mx |
Mexico(メキシコ) |
| my |
Malaysia(マレーシア) |
| mz |
Mozambique(モザンビーク) |
| na |
Namibia(ナミビア) |
| nc |
New Caledonia(ニューカレドニア) |
| ne |
Niger(ニジェール) |
| nf |
Norfolk Island(ノーフォーク島) |
| ng |
Nigeria(ナイジェリア) |
| ni |
Nicaragua(ニカラグア) |
| nl |
Netherlands(オランダ) |
| no |
Norway(ノルウェー) |
| np |
Nepal(ネパール) |
| nz |
New Zealand(ニュージーランド) |
| om |
Oman(オマーン) |
| pa |
Panama(パナマ) |
| pe |
Peru(ペルー) |
| pf |
French Polynesia() |
| pg |
Papua New Guinea(パプアニューギニア) |
| ph |
Philippines(フィリピン) |
| pk |
Pakistan(パキスタン) |
| pl |
Poland(ポーランド) |
| pr |
Puerto Rico(プエルトリコ) |
| pt |
Portugal(ポルトガル) |
| py |
Paraguay(パラグアイ) |
| qa |
Qatar(カタール) |
| ro |
Romania(ルーマニア) |
| ru |
Russian Federation(ロシア連邦) |
| rw |
Rwanda(ルワンダ) |
| sa |
Saudi Arabia(サウジアラビア) |
| sb |
Solomon Islands(ソロモン諸島) |
| se |
Sweden(スウェーデン) |
| sg |
Singapore(シンガポール) |
| si |
Slovenia(スロベニア) |
| sk |
Slovakia(スロバキア) |
| sm |
San Marino(サンマリノ) |
| sn |
Senegal(セネガル) |
| sr |
Suriname(スリナム) |
| su |
Soviet Union(旧ソビエト連邦) |
| sv |
El Salvador(エルサルバドル) |
| sy |
Syrian Arab Republic() |
| sz |
Swaziland(スワジランド) |
| tg |
Togo(トーゴ) |
| th |
Thailand(タイ) |
| tn |
Tunisia(チュニジア) |
| to |
Tonga(トンガ) |
| tr |
Turkey(トルコ) |
| tt |
Trinidad And Tobago(トリニダード・トバゴ) |
| tv |
Tuvalu(ツバル) |
| tw |
Taiwan(台湾) |
| tz |
Tanzania(タンザニア) |
| ua |
Ukraine(ウクライナ) |
| ug |
Uganda(ウガンダ) |
| uk |
United Kingdom(イギリス) |
| us |
United States(アメリカ) |
| uy |
Uruguay(ウルグアイ) |
| uz |
Uzbekistan(ウズベキスタン) |
| va |
Vatican City State(バチカン市国) |
| vc |
Saint Vincent And The Grenadines() |
| ve |
Venezuela(ベネズエラ) |
| vi |
Virgin Islands (U.S.)() |
| vn |
Viet Nam(ベトナム) |
| vu |
Vanuatu(バヌアツ) |
| ws |
Samoa(サモア) |
| ye |
Yemen(イエメン) |
| yu |
Yugoslavia(ユーゴスラビア) |
| za |
South Africa(南アフリカ共和国) |
| zm |
Zambia(ザンビア) |
| zr |
Zaire(ザイール) |
| zw |
Zimbabwe(ジンバブエ) |