毎日のようにサーバーのログを眺めると、特定の国のIPアドレスから大量のSSHログイン試行やポートスキャンが飛んでくる光景をよく目にします。「この国からのアクセスはまるごとブロックできないか」と考えたことがある方は少なくないはずです。
GeoIPブロッキングは、アクセス元IPアドレスの所在国を判定してトラフィックを制御する技術です。設定次第でサーバーへの不審なアクセスを大幅に減らせる一方で、過信すると思わぬ落とし穴にはまります。
この記事では、GeoIPブロッキングの仕組みから実装手順、そして「これだけやっても防げないこと」まで、現場で使えるレベルで解説します。nftables・Nginx・Cloudflareでの設定例も具体的に示しますので、ぜひ参考にしてください。
GeoIPブロッキングとは?
GeoIPブロッキングとは、アクセス元IPアドレスを地理情報データベースと照合し、特定の国・地域からのトラフィックをブロック(または許可)する手法です。
インターネット上のIPアドレスは、ISP(インターネットサービスプロバイダ)や企業に割り当てられる際に国や地域情報が紐付けられます。MaxMind社の「GeoLite2」やIP2Locationなどのデータベースは、このIPアドレスと地理情報のマッピングを提供しており、ファイアウォールやWebサーバーがリアルタイムに参照できるようになっています。
GeoIPブロッキングが注目される理由
JPCERT/CCのポートスキャン観測(TSUBAME)データを見ると、国内サーバーへの不審なスキャンや攻撃のうち、かなりの割合が特定地域のIPから来ています。自社のビジネスが国内完結型であれば、海外からのSSHアクセスに正当な理由はほとんどありません。こうした状況で、GeoIPブロッキングは「攻撃の母数そのものを減らす」という意味で有効な多層防御の一手になります。
攻撃者の視点から見るGeoIPの仕組み
GeoIPブロッキングを正しく評価するために、まず仕組みを理解しましょう。
IPアドレスの地理情報はどう決まるか
IPアドレスの割り当ては、地域インターネットレジストリ(ARIN・RIPE・APNIC等)が管理しています。各ISPや企業はブロック単位でIPを取得し、これが地理情報データベースに登録されます。ただし精度には限界があり、VPN・TorなどIPを隠す技術を使えば簡単に迂回できます。
攻撃者がGeoIPブロッキングを回避する方法
・VPNの利用: 国内拠点のVPNサーバーを中継すれば、攻撃者は見かけ上「国内IP」でアクセスできます
・Torネットワーク: 多段中継でアクセス元を隠蔽します。出口ノードのIPは世界中に分散しています
・クラウドサービスの悪用: AWS・GCP・Azureのリージョン次第では国内IPが使えます
・プロキシサーバー: 国内設置のプロキシを踏み台にするケースもあります
つまり、GeoIPブロッキングは「手間をかけたくない日和見的な攻撃者」には有効ですが、標的を絞った攻撃者にとっては簡単に回避できる障壁です。この前提を持った上で導入判断を行うことが重要です。
GeoIPブロッキングの具体的な設定方法
1. IPデータベースの取得(MaxMind GeoLite2)
最も普及しているフリーの地理情報データベースはMaxMind社の「GeoLite2」です。利用には無料アカウント登録(メールアドレスのみ)が必要です。
取得できるデータベース形式:
・MMDB形式: バイナリ形式。高速参照が可能。nftables・Nginxモジュールで使用
・CSV形式: iptablesスクリプトや独自処理に使用可能
定期更新が必要です(週次で差分が公開されます)。古いデータベースを使い続けると、IPの割り当て変更に追随できなくなります。
2. nftablesで国別ブロックを実装する
Linuxの最新ファイアウォールであるnftablesでは、IPセットを使って効率的に国別ブロックを実現できます。
手順の概要:
まずipdeny.comやipdeny/country-ip-blocksから各国のIPレンジリストを取得し、nftablesのsetとして読み込む方法が一般的です。
# 中国のIPレンジリストを取得(例) curl -o /tmp/cn_cidr.txt https://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone # nftablesのsetに読み込むスクリプト例(/etc/nftables.conf に追記) # 以下は概念例。本番環境ではファイル分割管理を推奨 table inet filter { set block_cn { type ipv4_addr flags interval # 取得したCIDRリストをここに展開 } chain input { type filter hook input priority 0; policy drop; # GeoIPブロック(SSHポートへのアクセスのみ対象) tcp dport 22 ip saddr @block_cn drop # その他のルール ct state established,related accept iifname lo accept } }
ポイント: すべてのポートを一括ブロックするのではなく、SSH(22番)や管理ポートに絞るのが実践的です。WebサーバーのHTTPS(443番)を丸ごとブロックすると、海外からの正当なユーザーや検索エンジンクローラーまで弾いてしまいます。
3. Nginxで国別アクセス制御を実装する
Nginxでは「ngx_http_geoip2_module」を使うと、MaxMind GeoLite2 MMDBを直接参照できます。
# /etc/nginx/nginx.conf (httpブロック内) geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb { $geoip2_country_code country iso_code; } # ブロックする国コードのマップ定義 map $geoip2_country_code $blocked_country { default 0; CN 1; RU 1; KP 1; } # /etc/nginx/sites-available/your-site.conf (serverブロック内) server { # ... if ($blocked_country) { return 403; } }
Nginxモジュールのインストール方法はディストリビューションによって異なります。Ubuntu/Debianでは`libnginx-mod-http-geoip2`パッケージが利用できます。
4. Cloudflareのファイアウォールルールを活用する
クラウドのCDN・WAFサービスを使っている場合、Cloudflareのファイアウォールルールで国別制御が最も手軽に実装できます。Freeプランでも基本的な国別ブロックが可能です。
Cloudflare管理画面でのルール設定:
・対象: セキュリティ → WAF → カスタムルール
・条件: 「国」(ip.geoip.country)が特定値に一致する場合
・アクション: ブロック または 「チャレンジ」(CAPTCHA認証を要求)
Cloudflareの場合、IPデータベースの更新はCloudflare側が自動で行うため、管理コストが最も低くなります。また「ブロック」の代わりに「チャレンジ」を使えば、正当なユーザーを誤ってブロックするリスクを下げられます。
中小企業でも今日からできること
設定が複雑に見えますが、優先度の高いものから段階的に取り組むのが現実的です。
STEP 1: SSHポートへのアクセス制限(最優先)
管理コンソールやVPSの設定画面から「送信元IPアドレスの制限」ができる場合は、まずそちらを使ってください。自社オフィスや在宅勤務で使う固定IPのみ許可するのが最強の対策です。国別ブロックより「自分のIPだけ許可」の方が確実です。
STEP 2: クラウド型WAFを活用する
Cloudflare(無料プラン)やさくらのウェブアクセラレータなど、国内で利用しやすいCDN/WAFサービスを前段に置くと、GeoIPブロッキングを含む多彩な制御が手軽に実装できます。自社サーバー側での設定不要なため、情シス1人体制の現場でも管理しやすい選択肢です。
STEP 3: ログ監視で効果を確認する
GeoIPブロッキング導入後は、ファイアウォールログやNginxのアクセスログで「どの国からどれだけブロックされているか」を定期確認しましょう。効果測定と誤ブロックの検出が同時にできます。
GeoIPブロッキングの限界と注意点
【注意1】VPNで簡単に迂回される
繰り返しになりますが、GeoIPブロッキングはVPNで迂回できます。標的型攻撃(APT攻撃)のような、特定組織を狙う攻撃者は必ずVPNなど迂回手段を用いるため、GeoIPブロッキングを過信してはいけません。あくまで「日和見的な攻撃の母数を減らす」効果として捉えてください。
【注意2】正当なユーザーをブロックする可能性
グローバルにビジネスを展開している場合、海外出張中の社員や海外の取引先がアクセスできなくなるリスクがあります。どのサービス・ポートにGeoIPを適用するかを慎重に設計する必要があります。
【注意3】IPデータベースの精度
GeoLite2の精度は国レベルで約99%とされていますが、VPN・クラウドIPはデータベースに正しく反映されていないことがあります。実際にはブロックしたつもりでも抜けてくるIPが存在します。
【注意4】DDoS攻撃には効果が限定的
大規模なDDoS攻撃の場合、攻撃者は世界中に分散したボットネットを使うため、GeoIPブロッキングだけでは防御できません。DDoS対策には上位のDDoS対策サービス(Cloudflare Magic Transit等)が必要です。
よくある誤解と注意点
「中国をブロックすれば安全」は誤解
国別ブロックの議論でよく耳にするのが「中国全体をブロックすれば不正アクセスが激減する」という考え方です。確かに特定国のIPからのノイズ的な攻撃は減りますが、洗練された攻撃者は国籍に関係なく、日本国内のクラウドIPや感染済みPCを使って侵入を試みます。地域を絞ること自体に意味はありますが、「特定の国さえブロックすれば大丈夫」という過信は禁物です。
SEOへの影響
Googleなどの検索エンジンクローラーは様々な国・IPから巡回します。HTTP/HTTPSポートに広範な国別ブロックを適用すると、クローラーがアクセスできずSEO評価に影響が出ることがあります。管理ポート(SSH等)への制限に留め、Webコンテンツへのアクセスは慎重に設計してください。
ログが増えるだけの場合も
GeoIPブロッキングを適用せず、まず1週間ほどログを取るだけで「どこからの攻撃が多いか」「どのポートが狙われているか」が可視化されます。設定前にこの分析を行うと、ブロック対象の優先順位を論理的に決められます。
本記事のまとめ
| 手法 | 有効なケース | 限界・注意点 |
|---|---|---|
| nftables 国別ブロック | SSHなど管理ポートへの日和見攻撃削減 | 設定・DB更新の管理コストがかかる |
| Nginx GeoIP2モジュール | Webアプリへのアクセス制御 | Webサービスへの適用は誤ブロックに注意 |
| Cloudflare WAFルール | 管理コストを抑えたい場合 | 無料プランは制限あり |
| 固定IP制限(許可リスト型) | 社内管理者のみSSHを使う環境 | 固定IPが取れない環境では使いにくい |
GeoIPブロッキングは、多層防御のあくまで一層として位置付けるべき技術です。「この国からの攻撃が多いからブロックする」という判断は合理的ですが、VPNによる迂回や正当ユーザーへの影響を十分に考慮した上で設計してください。
firewalldとの組み合わせや、ネットワーク機器のハードニングと組み合わせることで、より実効性の高い多層防御が構築できます。
Linuxのファイアウォール設定をより深く学びたい方は、姉妹サイトLinuxMaster.JPでも関連技術を詳しく解説しています。
PR
ファイアウォール設定からアクセス制御まで、Linux環境のセキュリティを体系的に学べる一冊。nftables・iptablesの実践設定やSSH強化など、GeoIPブロッキングの実装に必要な基礎知識が網羅されています。
