Node.jsでサービスをリリースしていて…
- 特定IPからの大量アクセス
- 特定IPによるスクレイピング
そういうIPを制限・ブロックしたい
そんな場面がありました。
やり方はとても簡単だったので、
Node.jsでIP制限(IPブロック)手順を紹介です。
このページの目次
0.本当に制限すべきIPか調べる
これはやらなくてもいい作業ですが…
つぎの事故を防ぐために必要です。
- 検索クローラーをブロックしてしまった
- 無害なIPなのにブロックしてしまった
だから本当に有害なIPかを調べます。
簡単なのは次のツールを使うことです。
▼ Amazon Data Services NoVa | AbuselIPDB
URL : https://www.abuseipdb.com/check/
▼ IPを入力すると検索結果が表示される
上記のように危険度が一目で分かります。
この画像だと「This IP was reported 855 times」と表示されてるので、ほぼ間違いなくスクレイパーだったりスパムを行ってるIPです。
IP制限するときの判断基準として使えます。
1.express-ipfilterをインストール
ここからが本当の実装手順です。
以下のモジュールをインストールします。
▼ npmからexpress-ipfilterをインスト
1 |
npm install express-ipfilter |
https://www.npmjs.com/package/express-ipfilter
その名の通り、express環境でIP制限できます。
次のような機能を持つモジュールです。
- 特定IPを1つ1つブロック
- 指定範囲のIPをまとめてブロック
使ってみると本当に便利でした。
2.特定IPを制限/ブロックするコード例
ということで実際にコードを書いてみます。
試しに以下のウザいIPをブロックしました。
- 3.224.220.101
- 23.22.35.162
- 52.70.240.171
▼ 特定IPを1つ1つブロックするコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const express = require('express'); const ipfilter = require('express-ipfilter').IpFilter; const app = express(); /// スパム・スクレイパーをIPブロック const blockedIps = [ '::ffff:3.224.220.101', '::ffff:23.22.35.162', '::ffff:52.70.240.171' ]; app.use(ipfilter(blockedIps, {log: false})); /// 以下省略… module.exports = app; |
何をしてるかは説明するまでもなく単純です。
一応説明すると ipfilter に対してブロックしたいIP配列を渡すだけです。あとログを取りたりならオプションに {log: true} を設定してください。
範囲指定でまとめてIP制限するには
ちなみに範囲指定でIP制限もできます。
▼ 例を出すならこういう感じ
1 2 3 4 5 6 |
/// スパム・スクレイパーをIPブロック const blockedIps = [ '::ffff:21.3.*.*', '::ffff:106.???.6.1*' ]; app.use(ipfilter(blockedIps, {log: false})); |
上記のようなワイルドカードが使用可能
もし1文字以上の任意にマッチさせたいならアスタリスク(*) 、任意の文字数にマッチさせたいならクエスチョン(?)をその回数分だけ使用します。
あとは好きなように設定してください。
IP制限できているかを確認する
本当にIP制限できてるのか不安なので…
試しに自分自身をIPブロックしてみました。
▼ しっかりとIPブロックできていた
これでIP制限設定は完了です。
有害IPの締め出しに成功しました。
Node.jsの最適化の関連記事
IPブロックに関連する内容を最後に紹介します。
主にNode.jsの最適化についての関連記事です。
▼ レスポンスでgzip圧縮を有効化…転送量削減の手順
▼ メモリキャッシュ導入で高速化…一番優秀なモジュール
もしかしたら何かの参考になるかも。
以上、Node.jsでIPブロックでした。ではまた