自宅ゲームサーバーで中国や韓国からのアクセスをブロックする

これを読まれる上級者の方に、この記事で紹介したいことを端的に箇条書き風に分割すると

  • Windows OS上にて
  • OSのファイアウォールを
  • ウェブで拾った国別のIPリストで
  • ウェブで拾ったスクリプトを使ってフィルタする

だけです。

故に内容とゲームはあまり関係ないです。 サーバー構築を専門的にやってる人にとっては大したことない話ですが、個人でゲームのサーバーを建てたい人・建てている人を対象にしたいので、このようなタイトルになりました。 また、専門外の方にもなるべく理解していただけるよう、できる限り丁寧に書くよう心がけました。 まずはどのような方法があって、なぜ上記の方法を採ったのか説明したいと思います。

外国からのアクセスをブロックする方法のあれこれ

まず、ここから説明していこうと思います。ご家庭でサーバーを建てる場合、大体以下の方法になると思います。

  •  ルーターのファイアウォールにルールを定義してフィルタする
  •  OS(ここではWindows)のファイアウォールにルールを定義してフィルタする
  •  サーバーで提供したいサービスのアプリケーション(ここではゲームサーバー)でフィルタする

ルールとフィルタという単語が出ましたので説明します。 まず、世の中にあるファイアウォールというのは色んな種類があります。そのうち家庭で目にするものは基本的に

  • 「これは通さないで」と指定したものを通さないようにする
  • 「これは通して」と指定したものを通す

といったような動作をします。そして

  • 「〇〇が××だった時、アクセスを許可する(通す)」
  • 「△△が□□でない時、アクセスを遮断する(通さない)」

という条件の1つ1つをそれぞれルールといいます。 1つないし複数のルールを定義し、内部から外部へ・もしくは外部から内部へのアクセスを制限することをフィルタリングと呼びます。

ゲームサーバーでフィルタしなかった理由

さて、私は3つのやり方の中で今回は2番目の「OS(ここではWindows)のファイアウォールにルールを定義してフィルタする」を選んだわけですが、大した理由があったわけではありません。

状況によって変わることもありますが、3番目の「サーバーで提供したいサービスのアプリケーション(ここではゲームサーバー)でフィルタする」というやり方が可能ならばそれに越したことはないと思います。 例えば、今このブログはWordpressというものが動いていますが、これは国を選んでブロックするプラグインを導入することでフィルタすることができます。 しかし当然ながら、その機能がなければフィルタすることができません。

ゲームのサーバーの話に戻します。 つまりゲームのサーバーに国別フィルタ機能がなかったので、他の方法を採ったということです。 なのでこの記事を読んでいる「ゲームサーバーを建てたい」方はまず、ゲームサーバー自身の機能で国別フィルタができないかどうか調べてみてください。

ルーターではなくOSでフィルタした理由

ルーターによるフィルタとOSによるフィルタはそれぞれ長所と短所があります。 家庭用を前提とすると、だいたい以下のようになります。

ルーターによるフィルタOSによるフィルタ
長所
  • 複数のPC・サーバーに適用できる
  • ルーターのリソースでフィルタできる
  • スクリプトで簡単に適用できる
短所
  • スクリプトなどで一気に適用できない場合、とても面倒
  • 複数台のサーバーがある場合、それぞれで適用しなければならない
  • サーバーマシンのリソースでフィルタしてしまう

リソースというのは、CPUやメモリのことです。 PCやサーバーなどのコンピューターは、何かするためにメモリやCPUを必要とします。フィルタすることも例外ではありません。 どれほどのCPUを使用するかはサーバーによって違いますが、私の場合は気にならない程度だと判断しました。 また、サーバーも1台のみであったため、OSの場合における短所が問題になりませんでした。 その一方で、ルーターによるフィルタはとても大変そうだったため、OSによるフィルタを選択しました。

準備

ここまで外国をフィルタするいくつかの手段と、その中でOSによるフィルタを選んだ理由を説明しました。 次は実際にWindows上で簡単にフィルタをかける方法を説明します。

  • フィルタスクリプトの入手
  • PowerShellの実行ポリシーを変更
  • 国別IPリストのファイルの入手

 

フィルタスクリプト

IPリストのファイルを渡すと、それを元に自動的にフィルタをWindows ファイアウォールに追加してくれるPowerShellスクリプトです。 こちらのダウンロードリンクから保存してください。 本家ソースはこちらですが、日本語OSだと動作しないため、多少改変したものをGistに公開しました。 PowerShellスクリプトというのは、新しいバッチファイルのスタイルだと思ってください。 バッチファイルと違い、PowerShellスクリプトは実行するためにセキュリティの設定を変更する必要があります。

Powershellの実行ポリシーを変更

Windows 10の比較的新しいバージョンならば簡単です。 設定 → 更新とセキュリティ → 開発者向け から   一番下の[PowerShell]の項目について、チェックが入っている状態で[適用]をします。

標準でPowerShellの項目がない場合は開発者モードにします。  

古いWindows 10ないしそれ以前のOSであるため、この方法が採れない場合はこちらを参考に設定してみてください。

国別IPリストのファイルの入手

IPdenyというサイトのCountry IP blocksからブロックしたい国ごとにzoneファイルをダウンロードします。 今回は中国と韓国をフィルタするので、こちらの部分を探します。

韓国

KOREA, REPUBLIC OF (KR) [download zone file] Size: 16.95 KB (1129 IP blocks)[aggregated zone file] (903 IP blocks)

中国

CHINA (CN) [download zone file] Size: 123.13 KB (8133 IP blocks)[aggregated zone file] (4966 IP blocks)

左と右のどちらを使ってもいいですが、今回の説明では右のaggregatedを使います。aggregatedについてはページの冒頭にこのような説明があります。

NEW! We offer aggregated country IP zone files downloads below. It means fewer rules and higher performance for firewalls, routers and custom solutions! DB ready table formats are coming soon!

まとめられる部分をまとめたので、ファイアウォールがフィルタする時のパフォーマンスが良くなるとのことです。

実行

  1. 説明を簡単にするため、スクリプトとダウンロードしたzoneファイルをC:ドライブ直下に移動します。
  2. PowerShellを管理者権限で起動します。最近のWindows 10であれば、[Win+X]→[A] のショートカットで起動できます。
  3. 下記コマンドでC:ドライブ直下へ移動し、スクリプトを実行します。

 

Powershell
PS C:\WINDOWS\system32> cd C:\
PS C:\> .\Import-Firewall-Blocklist.ps1 -InputFile .\kr-aggregated.zone

コマンドは韓国のファイルでの例です。うまくいけば、このようにOKっぽい表示が出ます。

このフィルタを削除する時には、先のコマンドのオプションを少し変えて実行します。

Powershell
PS C:\> .\Import-Firewall-Blocklist.ps1 -DeleteOnly .\kr-aggregated.zone

実行するとこのように表示されます。

察しの良い方はお気づきかもしれませんが、ファイアウォールのルールが引数のファイル名を基準に作られています。 なのでルールを追加した後にzoneファイルの名前を変えてしまうと、削除の際にルールがうまく削除されません。 zoneファイルは変えずに保管しておくことをおすすめします。

確認

ちゃんとルールが追加されたか、もしくは消えたか心配な場合はWindowsファイアウォールを見に行きましょう。

詳細設定から、定義されたルールを見ることができます。上記画像から「kr-aggregated-#1」などが追加されているのがわかります。

おわりに

次は中韓フィルタを使って建てたRustというゲームのサーバー構築について記事にしようかと思います。

正式版Rustのゲームサーバーを構築・運用する方法

最後にひとつ、よくある質問への回答を用意させていただきました。

日本だけ通すようにはできないの?

可能ですが確実ではないのでおすすめしません。

この記事では基本的に「これは通さない」というやり方で、韓国と中国のフィルタをしました。 日本だけ通す場合は、まず日本のzoneファイルを用意して「これは通す」設定をします。 そしてそれより優先度が低いルールに「全て通さない」設定をします。 ではこれがなぜ確実でないのかというと、国別のzoneファイルがそもそも確実にその国全体のIPを網羅しているとは限らないためです。 そうであることを前提にフィルタした場合、この記事のやり方は「中国だけどアクセスできた」があり得ます。 今回のゲームサーバーでは中韓のアクセスを100%阻止したいわけではないため、これは許容できます。 逆に日本だけ通す場合は「日本だけどアクセスできない」が起こり得てしまいます。 前者と後者、様々な事情によってどちらを優先するかは変わりますが、業務ではなく個人でゆるくゲームのサーバーをたてる程度なら、前者のほうが良かろうという私の判断です。

コメントを残す