ゲームのサーバー構築にあたって、中国や韓国からのアクセスをブロックする方法

はじめに

これからこの記事を読もうとしている上級者の方のために、ここで実際に行うことを端的に箇条書きします。

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

たったそれだけです。

そのため本編の内容とゲームは、実際にはあまり関係ないです。

サーバー構築を専門的にやってる人にとっては大したことない話ですが、個人でゲームのサーバーを建てたい人・建てている人を対象にしたいので、このようなタイトルになりました。

また、専門外の方にもなるべく理解していただけるよう、できる限り丁寧に書くよう心がけました。

まずはどのような方法があって、なぜ上記の方法を採ったのか説明したいと思います。


外国からのアクセスを遮断する方法のあれこれ

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

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

ルールとフィルタという単語が出ましたので説明します。

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

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

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

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

という条件の1つ1つをそれぞれルールといいます。

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

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

さて、私は3つのやり方の中で今回は2を選んだわけですが、大した理由があったわけではありません。

状況によって変わることもありますが、3のやり方が可能ならばそれに越したことはないと思います。

例えば、今このブログはWordpressというものが動いていますが、これは国を選んでブロックするプラグインを導入することでフィルタすることができます。

しかし当然ながら、その機能がなければフィルタすることができません。

ゲームのサーバーの話に戻します。

つまりゲームのサーバーに国別フィルタ機能がなかったので、他の方法を採ったということです。

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

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

ルーターによるフィルタとOSによるフィルタはそれぞれ長所と短所があります。

家庭用を前提とすると、だいたい以下のようになります。

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

リソースというのは、CPUやメモリのことです。

PCやサーバーなどのコンピューターは、何かするためにメモリやCPUを必要とします。フィルタすることも例外ではありません。

どれほどのCPUを使用するかはサーバーによって違いますが、私の場合は気にならない程度だと判断しました。

また、サーバーも1台のみであったため、OSの場合における短所が問題になりませんでした。

その一方で、ルーターによるフィルタはとても大変そうだったため、OSによるフィルタを選択しました。

MEMO
サーバーが1台で、サーバーアプリケーションにアクセスフィルタ機能がない場合、OSによるフィルタが有効。

ここから本題に入ります

ここまで外国をフィルタするいくつかの手段と、その中でOSによるフィルタを選んだ理由を説明しました。

次は実際にWindows上で簡単にフィルタをかける方法を説明します。

まずは準備

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

フィルタスクリプト

IPリストのファイルを渡すと、それを元に自動的にフィルタをWindows ファイアウォールに追加してくれるPowerShellスクリプトです。

下記のページにある[Download ZIP]からダウンロードしてください。

参考 18konoe/Import-Firewall-Blocklist-JP.ps1GitHub Gist

本家ソースは下記になります。日本語OSだと動作しないため、多少改変したものが上記のものになります。

参考 KurtDeGreeff/PlayPowershellGitHub

PowerShellスクリプトというのは、新しいバッチファイルのスタイルだと思ってください。

注意
バッチファイルと違い、PowerShellスクリプトは実行するためにセキュリティの設定を変更する必要があります。

Powershellの実行ポリシーを変更

Windows 10の比較的新しいバージョンならば簡単です。

設定 → 更新とセキュリティ → 開発者向け から

一番下の[PowerShell]の項目について、チェックが入っている状態で[適用]をします

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

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

参考 PowerShell でスクリプトが実行できないsnagimo

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

IPdenyというサイトのCountry IP blocksからブロックしたい国ごとにzoneファイルをダウンロードします。

参考 Country IP blocksIPdeny

今回は中国と韓国をフィルタするので、こちらの部分を探します。

韓国

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:ドライブ直下へ移動し、スクリプトを実行します。

3から説明していきます。2で開いたPowerShellに、下記のようにコマンドを入力して実行していきましょう。

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というゲームのサーバー構築について記事にしようかと思います。

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

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

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

この記事は基本的に「これは通さない」というやり方で、韓国と中国のフィルタをしています。

日本だけ通す場合は、まず日本のzoneファイルを用意して「これは通す」設定をします。

そしてそれより優先度が低いルールに「全て通さない」設定をします。

ではこれがなぜ確実でないのかというと、国別のzoneファイルがそもそも確実にその国全体のIPを網羅しているとは限らないためです。

そうであることを前提にフィルタした場合、この記事のやり方は「中国だけどアクセスできた」があり得ます。

今回のゲームサーバーでは中韓のアクセスを100%阻止したいわけではないため、これは許容できます。

逆に日本だけ通す場合は「日本だけどアクセスできない」が起こり得てしまいます。

前者と後者、様々な事情によってどちらを優先するかは変わりますが、業務ではなく個人でゆるくゲームのサーバーをたてる程度なら、前者のほうが良かろうという私の判断です。

コメントを残す

search envelope heart star user close search-plus home clock update edit share-square chevron-left chevron-right leaf exclamation-triangle calendar comment thumb-tack link navicon aside angle-double-up angle-double-down angle-up angle-down star-half status image gallery music video category tag chat quote googleplus facebook instagram twitter rss