Minecraftサーバーを動かす知識

ポート開放とは何か?

投稿:  更新:  By: HimaJyun

Minecraftに限らず、あらゆるサーバーを公開する際には「ポート開放」と呼ばれる作業が必要になります。

ポート開放の設定を行う際に訳も分からず設定画面を触っている人は少なくないと思われますが、ここではそういう方のためにポート開放とはどういう事なのかを解説します。

なお、ここでは「やり方」の解説はしません。(機器によって設定画面などが大幅に異なるため)

「ポート開放とは何か?」という事が理解できれば、「やり方」なんてものは調べなくてもわかるようになるでしょう。

スポンサーリンク

「ポート開放」でやっていること

注意点ですが、ここでの説明は初心者向けの概念の説明となるため省略されていたり現実とは異なる部分があります。詳しく知りたい人はそういう本でも買って勉強してください。

それと、ここでは一般的な家庭用ネットワークを想定して話を進めますが、いわゆるレンタルサーバーやクラウドなどの類ではここで説明する例とはネットワーク構成が異なる場合もあります。(場合もあるというか、ほぼ確実に異なるでしょう)

グローバルIP、プライベートIP

最初に、一般的な家庭用のネットワークではルーターというものが居ます。こいつが送受信されるパケット(データ)を取り仕切っています。
/beginner/port-open/001.png

ルーターはIPv4アドレスを持っています、これはグローバルIPアドレスです。
/beginner/port-open/002.png
(もちろんこの203.0.113.1は例です。実際の値は各ネットワークで異なります)

と同時に、192.168.……で始まるプライベートIPアドレスも持っています。(プライベートIPアドレスには10.……で始まるものと、172.……で始まるものもあるのですが、家庭用ネットワークでは基本的に192.168.……で始まる物が使われています)
/beginner/port-open/003.png
(プライベートIPアドレスはローカルIPアドレスと呼ばれることもありますが、リンクローカルアドレスという似た名前の物があり紛らわしいので避けた方がいい呼び方でしょう)

つまりルーターはIPアドレスを2つ同時に持つんですね。
/beginner/port-open/004.png

このプライベートIPアドレスはルーターに繋がれた(=LAN内の)機器にも与えられます。代わりにLAN内の機器にグローバルIPアドレスは与えられません。
/beginner/port-open/005.png
プライベートIPアドレスはDHCPで自動的に設定されることもあれば、手動で設定する事もあります。ポート開放を行う場合は基本的に手動で設定します。理由は後述。

プライベートIPアドレスは「プライベート」の名の通り、インターネット上では使えません。
/beginner/port-open/006.png
(LAN内の機器がインターネットにアクセスするときはルーターがイイカンジにしてくれています。説明すると長くなるので今回は外からアクセスする場合の話に絞ります)

インターネットに接続するにはグローバルIPアドレスが必要です。要するに直接インターネットとやり取りできるのはルーターだけ、という訳ですね。
/beginner/port-open/007.png

もちろんプライベートIPアドレス同士、要するにLAN内の機器同士は直接通信できます。
/beginner/port-open/008.png

長いですね、疲れましたか?あなたを崖から突き落とします。ここまでの話は前提条件です、説明は始まってすらいません。本題はこれから。

ポート開放の正体

さて、あなたはMinecraftサーバーを設置しました!
/beginner/port-open/009.png

これはサーバーです。サーバー上で起こっていることを処理するために、ユーザーの人たちにはサーバーに直接アクセスしてもらう必要があります。

もちろんユーザーの人たちはインターネットから来ます。先ほど説明した通り、インターネットと直接繋がるのはルーターだけでしたね。

つまり、プライベートIPアドレスは直接インターネットとやり取りできない……サーバーに接続できません!!
/beginner/port-open/010.png

どうすれば良いでしょうか?インターネットと直接やり取りできるルーターを経由すればできそうな気がしますね。

ユーザーにお願いしてルーターの持っているグローバルIPアドレスで接続してもらうようにしました。
/beginner/port-open/011.png

ルーターまでパケットが届きましたね?さぁこれをMinecraftサーバーへ……

あっ?ちょっと!!なんてことをするの!!
/beginner/port-open/012.png

ルーターは言います「は?知らんし」「このパケット、宛名のところにはウチのアドレスしか書かれてないし誰宛か分からんわ」

そうです、ルーターにはサーバーだけではなく色々な機器が繋がっているのです。

外部からパケットを受け取っても、それをどの機器に届ければいいのか分からないのです。
/beginner/port-open/013.png

そこでルーターに教えます。「ポート25565で届いたパケットはMinecraftサーバー(192.168.1.3)へ」
/beginner/port-open/014.png

さぁ、もう一度。

ルーターまでパケットが届きましたね?ルーターはこのパケットを誰に届ければ良いか知っています。
/beginner/port-open/015.png

ルーターがMinecraftサーバーに届けてくれました。届きました!!
/beginner/port-open/016.png

Minecraftサーバーは適切な処理を行い、結果を返信します。返信はルーターがイイカンジに元の送り主に送り返してくれるので普通は気にしなくて構いません。なので説明は省略。
/beginner/port-open/017.png

接続が確立されました!やったね!!繋がったよ!!!
/beginner/port-open/018.png

これがポート開放です。要するにポート開放とはルーターにどのポートで届いたパケットをどこに送ればいいかを設定しているのです。

サーバー側にグローバルIPアドレスがある

先ほどの例は「ルーターがグローバルIPアドレスを持っている」という前提での説明でした。
/beginner/port-open/002.png

では、サーバー側にグローバルIPアドレスがある場合はどうなるでしょうか?
/beginner/port-open/019.png

この答えはネットワークによって異なります。

サーバーがグローバルIPアドレスを持っている場合、本来であればすべてのポートが外部から繋がります
/beginner/port-open/020.png

流石にこれでは危険なので、ルーターによってはデフォルトでファイアウォールが有効になっており設定しなければ外部からの通信はできないようになっていることもあります。
/beginner/port-open/021.png

もちろん、本来の形通りに、ルーターにはファイアウォールなど存在せずすべてのポートが外部から繋がる状態になっていることもあります。

とくにレンタルサーバーなどではデフォルトで全オープンの可能性は十分にあります。レンタルサーバーを使うつもりの人は要チェック!

ちなみに、今までの話はIPv4でしたが、IPv6になると各機器が個別にIPv6アドレスを持つようになるため、ここで説明した"ルーターではなくサーバーがグローバルIPアドレスを持つ"の形が基本となります。

IPv4とIPv6でファイアウォールの設定が別になっていることも少なくないので、お使いのネットワークがIPv6に対応している場合は従来までのポート開放に加えて、サーバーがグローバルIPv6アドレスを持っていることも意識しましょう。

IPv4だけ設定して満足していたらIPv6の方に大穴が開いていた、なんて事例は少なくありませんよ。
/beginner/port-open/022.png

ハマりポイント

ポート開放ではハマりがちなポイントがいくつかあります。

「書いてる通りにやってるはずなのにできないよ」という方は確認してみましょう。

プライベートIPアドレスが固定されていない

忘れていると痛い目に合うのがこれ、プライベートIPアドレスが固定されていない状態です。

まず、ルーターに繋がれた(LAN内の)機器にはプライベートIPアドレスが割り当てられることは先ほど説明した通りですね。

この時プライベートIPアドレスを割り当てる方法として、普段であればDHCPという自動で割り当てる機能が利用されるのですがポート開放を行う場合は手動で設定する必要があります。

ではなぜ手動で設定しなければならないか?

思い出してください、ポート開放とは「ルーターにどのポートで届いたパケットをどこに送ればいいかを設定している」のでしたね。
/beginner/port-open/014.png

この「どこに送ればいいか」ですが、通常はプライベートIPアドレスを指定します。要するに「25565で届いたパケットは192.168.1.3に送ってください」と設定しているわけです。

DHCPで割り当てられたIPアドレスは時間が経つと変化することがあります。最初は192.168.1.3だったのに、時間が経つと192.168.1.4になっているかも知れないのです。
/beginner/port-open/023.png

サーバーが192.168.1.3から192.168.1.4に変化したとしても、ルーターの設定は「192.168.1.3に送る」のままです。DHCPに合わせて「192.168.1.4に送る」に変えてくれたりはしないのです。

(高級なルーターであればその辺りに対応する機能があるかもしれませんが、普通の家庭用ネットワークで利用されるルーターにそんな機能は存在しないと思った方が良いです)

結果、ルーターが192.168.1.3に送ろうとするも、192.168.1.3は存在しないので繋がらない。という事になるわけです。
/beginner/port-open/024.png

そういった問題を起こさないために、ポート開放を行う際にはDHCPではなく手動で設定する必要があります。

設定したばかりの時はちゃんと繋がる(DHCPでプライベートIPアドレスが変わってから問題が発生する)ので、初心者の方だと突然問題が発生したように見えて混乱するかもしれませんね。

二重ルーター

ポート開放ができない時に多いのは二重ルーターと呼ばれる状態です。

これはルーターからさらにルーターが繋がっている状態で、図解すると次のような状態です。
/beginner/port-open/025.png

これを確認するにはtracerouteコマンドを使用します。

どのOSでもできることは同じなのですが、OSによって微妙に引数やコマンド名が異なるので注意してください。

# Linux
traceroute -4 example.com
# Windows
tracert -4 example.com
# macOS
traceroute example.com

普通の状態(一重ルーター)では、プライベートIPアドレスが1つだけ表示されます。

example.com [198.51.100.1] へのルートをトレースしています
経由するホップ数は最大 30 です:

  1    <1 ms    <1 ms    <1 ms  ルーターのホスト名 [192.168.1.1]
  2     2 ms     1 ms     1 ms  プロバイダーのホスト名など [203.0.113.100]
  3     8 ms     7 ms     7 ms  198.51.100.1

トレースを完了しました。

二重ルーターになっていると、このようにプライベートIPアドレスが2つ表示されます。

example.com [198.51.100.1] へのルートをトレースしています
経由するホップ数は最大 30 です:

  1    <1 ms    <1 ms    <1 ms  内側のルーターのホスト名 [192.168.11.1]
  2     2 ms     1 ms     1 ms  外側のルーターのホスト名 [192.168.1.1]
  3     8 ms     7 ms     7 ms  プロバイダーのホスト名など [203.0.113.100]
  4    11 ms    10 ms    10 ms  198.51.100.1

トレースを完了しました。

二重ルーターの状態で、そのことを意識せずにポート開放すると失敗します。
/beginner/port-open/026.png

なぜなら、上の画像で言うサーバー(192.168.11.2)は内側のルーター(192.168.11.1)が管理しているものであり、インターネットに繋がっている側のルーター(192.168.1.1)にサーバー(192.168.11.2)は見えていないのです。

インターネットに繋がっている側のルーター(192.168.1.1)から見えているのは内側のルーター(192.168.11.1)だけなので、サーバー(192.168.11.2)にパケットを送ろうとしても、当然ながらに「そんな奴は知らない」となるわけですね。

さらに注意点なのですが、内側のルーターは192.168.11.1と192.168.1.2という2つのIPを持っている状態になっています。インターネットに繋がっている側のルーター(192.168.1.1)から見えているのは192.168.11.1ではなく192.168.1.2です。ああっ!めんどくさい!!

要するに、インターネットに繋がっている側のルーターが203.0.113.1などのグローバルIPアドレスを持っているのと同様に、内側のルーターが192.168.1.2をグローバルIPアドレス代わりに持っているわけです。

この状態できちんとポート開放するにはどうするべきか?簡単ですね、インターネット側のルーターには内側のルーター(192.168.1.2)を、内側のルーターからはサーバー(192.168.11.2)を指定すればいいのです。
/beginner/port-open/027.png

でもでも、よく考えてみてください?なぜ二重ルーターになっているのですか?それはあなたの意図した状態ですか?

恐らくそうではないでしょう。あなたが意図しているのは、普通の状態(一重ルーター)のはずです。

そもそもなぜ二重ルーターになるのか?簡単です、途中にルーターがあるからです。

「中継器」などと呼ばれている機器がサーバーとルーターの間に居ませんか?そいつを省略して、直接ルーターにサーバーを接続してみましょう。

どうしても中継器が必要な状況であるならば、二重ルーターを意識してポート開放を行ってもよいのですが、中継器側の設定を修正することで中継しつつ二重ルーターを解消することが可能です。

具体的に言うなら、ルーターの設定画面に「ルーターモード」と「ブリッジモード」などのような2つのモードがあって、恐らく「ルーターモード」になっているでしょうから、これを「ブリッジモード」に切り替えるのです。大抵はこれで解決します。

(細かい設定は機器によって異なるのでここでは解説しません、お使いのルーターや中継器のマニュアルを参考に設定を確認してください)

自分だけがアクセスできない

たとえば、あなたのサーバーのアドレスが203.0.113.1だとしましょう。

ポート開放もできています。ポート開放の確認サイトでもOKと表示されました、今目の前で友達がログインしたのを見ています。ポート開放は確実にできています。

さぁ、自分も遊ぼう!接続画面に203.0.113.1と指定します。接続……できません。あれれ?

これ、初心者がハマりがちなミスですね。

「外側からはプライベートIPアドレスを指定してアクセスできない」、当然ですね。
/beginner/port-open/028.png

実はこれ、逆もしかりで「内側からはグローバルIPアドレスを指定してアクセスできない」んです。(可能な例もあります、後述します)
/beginner/port-open/029.png

IPv4などではグローバルIPアドレスをルーターが持っています。こういった状況でLAN内のマシンが自分のネットワークのグローバルIPアドレスを指定すると恐らくこういう状況になります。
/beginner/port-open/030.png

何をどこに送ればいいかルーターは知っているのだから、その辺イイカンジにやってくれればいいのにね。 (もちろんイイカンジにやってくれるルーターもありますが、世の中に存在する多くのルーターはそこまで気を利かせてくれない安物ばかりです)

"イイカンジ機能"を持たないルーターでは「お、自分が宛先やんけ!」と自分の中で処理を終わらせてしまい、サーバーに到達できません。

で、この状況の時にどうやって自分がサーバーにアクセスするか?簡単ですね、サーバーのプライベートIPアドレスを指定すればいいのです。
/beginner/port-open/031.png

サーバーがグローバルIPアドレスを持っている場合(プライベートIPアドレスがない場合)は、普通にグローバルIPアドレスを指定して接続できます。(グローバルIPアドレスとプライベートIPアドレスの両方を持っている場合はどちらでも接続できます)

IPv6などであれば各機器がグローバルIPアドレスを持つので、グローバルIPアドレスを指定してそのまま接続できます。

ちなみにですがドメインを使っている場合でも話は同じです。DNSが応答するのはグローバルIPアドレスなので同じ問題が起こります。これの対策については少し話が変わるので後述。

Windowsの場合は「プライベートネットワーク」にする

Windowsの場合はネットワークの種類を「プライベートネットワーク」にする必要があります。

「設定」から「ネットワークとインターネット」を開き、「状態」のところに記載されているのが現在のネットワークの種類です。
/beginner/port-open/032.png

「パブリックネットワーク」になっている場合は「接続プロパティの変更」から設定を変更します。
/beginner/port-open/033.png

パブリックネットワークになっていると外部からの接続が厳しくなるのでポート開放もやりづらくなります。

プライベートネットワークで問題ない場合はプライベートネットワークに変更しましょう。

ポート開放は危険か?

「ポート開放は危険」、よく聞く話ですが本当に危険なのでしょうか?

ポート開放がどういう事か?というのは先に説明した通りです。では、なぜポート開放は危険なのでしょうか?

自分のサーバーにアクセスさせるから?それなら世の中にたくさんあるWebサーバーはどうなるの?壊されちゃうの?そんな事はないでしょう。

Minecraftだから危ないの?私はそんな話を聞いたことはありません。 (もし仮にそうであってもそれは「ポート開放は危険」ではなく「Minecraftは危険」というべきでしょう)

何らかの脆弱性の話をしているのであれば、それはソフトウェアに問題があるのであって「ポート開放」に問題があるのではありません。 (「ポート開放をしなければ脆弱性があっても問題になりづらい」という理屈はわかりますが、それは「食事をしなければトイレに行かなくていい」と同レベルです)

では逆に、ポート開放が危険になるのはどういうときでしょう?

たとえば、サーバーを遠隔から操作するための仕組みとしてSSHというものがあります。TCPのポート22を利用します。

Minecraft(25565)をポート開放する際に訳もわからずSSH(22)も開放してしまえば、最悪はあなたのサーバーを乗っ取られてしまうでしょう。これは確かに危険ですね! (もちろんSSHが危険だという意味ではありません、きちんと設定すれば安全な状態を保ったまま公開できます)

確かに危険だ!ポート開放は危険だ!!え?

それ、ポート開放が危険なんじゃなくて、訳もわからず危険な設定をしたから危険になっただけなんじゃないの……?

そういうことです、訳もわからず不必要なポートを開放したり、セキュリティ更新を怠ったりすれば、それは当然ながらに危険です。 (SSHに限りません、DNS(UDP 53)なんかを不用意に開けてしまうとオープンリゾルバーという世界中に迷惑をかける状態になりかねません)

ですが、それは「ポート開放は危険」という事になるのでしょうか?おそらくそうではないと考えるでしょう。

「ポート開放は危険」というのは非常に省略された説明であり適切ではありません。

正しくは「自分のやっている事を理解せずにポート開放をすると危険」「公開しているサービスはきちんと管理しないと危険」です。

理解せずに操作をすると危険なのはポート開放に限りません、何か操作する前には自分のやろうとしている事がどういう事なのかしっかり理解してから行うようにしましょう。

ポートスキャンをしよう

不必要なポートが開いていないかの確認はやっておいた方がいいでしょう。

nmapというポートスキャンツールがあります。ポートスキャンとはどのポートが開いているか探り出す事です。

これを使って、自分のサーバーをポートスキャンしてみましょう(絶対に他人のサーバーをスキャンしたりしないこと、それはただの攻撃です)

ポートスキャンを行う際はサーバーとは別のコンピューターから確認しましょう。(サーバーから自分自身=localhostをスキャンする事も可能ですが、この場合は外部からアクセスできないものまで表示されるので今回の用途には適しません)

加えて、自宅サーバーなどであればサーバーとは別のネットワーク(テザリングなど)から確認できるとより正確です。

nmapはnmap.orgからダウンロードできますが、aptやyumのようなパッケージ管理システムが使えるのであればそれを使用してインストールするのが簡単です。

sudo apt install nmap
sudo yum install nmap

次のように使用します。ネットワークの状況次第で少し時間がかかります。

sudo -p- <サーバーのアドレス>
# 例
#sudo -p- 192.168.1.1

これは良い例。Minecraftだけが開放されています、問題ありません。

Starting Nmap 7.60 ( https://nmap.org ) at 2019-05-10 00:00 JST
Nmap scan report for example.com (203.0.113.1)
Host is up (0.035s latency).
rDNS record for 203.0.113.1: example.com
Not shown: 65534 closed ports
PORT      STATE  SERVICE
25565/tcp open  minecraft

Nmap done: 1 IP address (1 host up) scanned in 30.82 seconds

これは悪い例。Minecraftだけでなく、ftp(21)、ssh(22)、smtp(25)、http(80)、https(443)、mysql(3306)とありとあらゆる物が公開されています。

Starting Nmap 7.60 ( https://nmap.org ) at 2019-05-10 00:00 JST
Nmap scan report for example.com (203.0.113.1)
Host is up (0.035s latency).
rDNS record for 203.0.113.1: example.com
Not shown: 65528 closed ports
PORT      STATE  SERVICE
21/tcp    open  ftp
22/tcp    open  ssh
25/tcp    open  smtp
80/tcp    open  http
443/tcp   open  https
3306/tcp  open  mysql
25565/tcp open  minecraft

Nmap done: 1 IP address (1 host up) scanned in 30.82 seconds

おそらくこれは意図した状態ではないでしょう。(もちろんこれらのサービスを公開したいと思って開放しているのなら正しいですけれども……mysqlがあるのを見る限り、それを意図しているわけではなさそうですよね?)

不必要なポートが開いている場合はちゃんと設定を確認してポートを閉じる、サービスを停止するなどの対処を行いましょう。

不必要なポートを開放することは、戦場に露出の多い服で出かけるのと同じことです。下げられるリスクは下げておくに越したことはありません。

「俺は大丈夫だから」「こんな設定をする人なんて居るの?」とか考えている人こそ要注意、油断が隙を生むのです。

実際問題ですがポート全開サーバーは案外多いです。ftp、ssh、smtp、http……要するにすべてのポートが開いているMinecraftサーバーを実際に見かけたことがあります。(ftpやhttpがデフォルト設定のままだったので、そのサーバーの管理者が意図してポート開放をしているわけではなさそうでした)

とくにレンタルサーバーではデフォルトですべてのポートが開いていたりするので、ファイアウォールの設定には気を付けましょう。

なぜHamachiを使うべきでないか?

ポート開放ができない時の最終手段としてHamachiなどを紹介しているサイトがありますが、これは正しい事なのでしょうか?

あなたがHamachiとはどういう物かを理解していないのであれば、あなたはHamachiを利用すべきではありません。

HamachiはVPNを構築するソフトウェアです。

VPNは「Virtual Private Network」の事で、インターネットを利用して仮想的なLANを作成する技術です。

要するに、こういう状態にしてしまうわけです。
/beginner/port-open/034.png

セキュリティを維持するために存在したルーターが居なくなってしまうのです。これはすべてのポートを開放しているのと同じ事です。

「ポート開放ができない」などと言っているレベルの人が使うにはあまりにも危険です。

とくに公開サーバーを構築したい人は絶対にHamachiを使うべきではありません。安全性云々以前の話ですが、Hamachiは集客できません。

Hamachiはサーバーリストに掲載できません。それだけでかなりのデメリットですが、それにとどまりません。

アドレスを入力するだけで簡単に接続できるサーバーが世の中にたくさんあるなかで、わざわざインストールや設定が必要なサーバーに人が集まると思いますか?

そもそも「サーバーを公開する」という目的のために「VPNを構築する」という手段を利用するのがすでに間違いです。目的と手段が噛み合っていません、VPNはそのような用途のために使うものではありません。

信頼できる仲間と遊ぶためだけに使うのであれば少しはマシ(ポート開放できるならその方がいい)ですが、公開サーバーでHamachiを使うべきではありません。

ちなみに「不必要な相手が接続できなくなるので安全!」なる主張もありますが、黙ってホワイトリストでも使っておけとしか思いません。

hostsってなに?

ポート開放やIPの話からは少し逸れるのですが、ドメインを使うようになるとhostsは必須の知識となるでしょうから説明しておきます。

本当の本当に初心者な人向けにドメインとはどういう物かという話をしますが、ドメインというのは以下の通り。example.comなどのアドレスがグローバルIPアドレスに紐づけられます。
/beginner/port-open/035.png

DNSで応答するのはグローバルIPアドレスです。LAN内の場合はプライベートIPアドレスを指定しないとアクセスできない事は先に説明したとおりですね。
/beginner/port-open/036.png

Minecraftの場合はプライベートIPアドレスを直接入力して接続したので問題ないのですが、ドメインでのアクセスが必須となる技術があります。(例: WebサーバーのバーチャルホストやTLSの証明書など)

そこで「自分のPC限定であるドメインを別のIPアドレスに紐づけたい」という要望が発生するのですが、それを叶えるのがhostsです。

Linuxであれば/etc/hosts、macOSであれば/private/etc/hosts、WindowsであればC:\Windows\System32\drivers\etc\hostsにあります。

これをテキストエディターで開いて編集します。どのOSでも管理者権限が必要です。

内容は次のようになっています

# 構文
#IPアドレス ドメイン名
192.168.1.3 example.com

# ドメインが複数の場合
192.168.1.3 example.com www.example.com

このように空白で区切ってIPアドレスとドメイン名を記入するだけの簡単なファイルです。

上の例で説明すると、example.comで接続されるのは203.0.113.1だが、自分のPCではexample.comで192.168.1.3に接続する……という事が可能です。便利ですね!

内向きDNS

「え?DNSからプライベートIPアドレスって返せないの?」という疑問を抱いた方、鋭い。

返せます。もちろん。

ところで、その場合は外部からアクセスしてくるユーザーはどのようにグローバルIPアドレスを知れば良いのでしょうか?プライベートIPアドレスでは外部から接続できない事はここまで読み進めた方にはお分かりですよね?

「え?LAN内外で別のDNSサーバー使えばいいんじゃないの?」という疑問を抱いた方、鋭すぎる。正解です。

サーバーやPCが多くなってくると、個別にhostsを設定するのは大変になってくるでしょう。

そこで、外部のユーザーと内部のユーザーで別のDNSサーバーを用意して、同じドメインでも外部用のDNSではグローバルIPアドレスで、内部用のDNSではプライベートIPアドレスで接続する……という事が可能です。

これらの手法は一般的に「内向きDNS」などと呼ばれています。

さすがにこのページとは関係ない話題になるのでここでは解説しませんが、詳しく知りたい人は調べてみるといいでしょう。(管理人のブログにUnboundというサーバーを利用した内向きDNS構築の記事があります)

ヒント

いくつか知っておくといいヒントを紹介。

TCPとUDP

実際にはICMPとかもあるのですが、とりあえずTCPとUDPに絞って説明。

MinecraftではTCP 25565を使います。BE版ではUDP 19132を使います。

今からTCPの説明をします?準備はできましたか?

TCPというのは正確性の高いプロトコルです。

TCPが正確性の高いプロトコルである事は分かりましたか?

TCPではパケットがちゃんと届いたかどうかを確認し、順番が間違っていたら入れ替えたり、届かなかったら再送要求をします。

TCPではパケットがちゃんと届いたかどうかを確認し、順番が間違っていたら入れ替えたり、届かなかったら再送要求をする事は分かりましたか?

ふざけてる?いいえ、TCPの真似です。こんな感じで、届いたかどうかを都度確認しながら通信します。効率悪そうですね。

当然ながら1回パケットをやり取りするたびに往復で確認するため、pingがスループットに影響します。

UDPではそんな面倒なことはしません。一方的にパケットの内容を送り付けます。リアルタイム性が高くオンラインゲームでよく使われています。

一方でパケットの損失や破損にはソフトウェア側で対応する必要があるため、プログラムを作るのはTCPよりも難しくなります。そのため、多くのソフトウェアでTCPが使われています。

後から開発されたBE版がUDPを使っている辺り、ゲームに向いているのはUDPだという事が分かりますね。(Java版は歴史的な理由でTCPを使ってきたので、これからも恐らくTCPを使い続けるでしょう。どのみち1秒に20チックしか処理されないのでTCPでも問題はないと思いますが)

127.0.0.1、::1、localhostとは何か?

127.0.0.1::1ループバックアドレスというもので、「自分自身」に接続するIPアドレスです。

localhostはループバックアドレスを返す特殊なドメインです。127.0.0.1か::1のどちらかが実際の接続に使われます。

(余談ですが、IPv4しか対応していないソフトウェアにlocalhostで接続したらIPv6が使われて繋がらない……というのはよくある話です)

ちなみに127.0.0.1の実際の範囲は127.0.0.0/8なので、127.1.2.7でもループバックアドレスです。

0.0.0.0、::とは何か?

0.0.0.0::は無効、不明などを意味するIPアドレスで、実際には文脈によって動作が変わります。

サーバーでとくによく見かけるのは「バインドアドレス」というものに指定するときです。

ざっと説明すると、バインドアドレスに0.0.0.0を指定するとすべてのNICで接続を受け付ける(=すべてのクライアントが接続できるようにする)という意味になります。

ちなみに、バインドアドレスを127.0.0.1やlocalhostにすると自分自身からしか接続できなくなります。

バインドアドレスの詳しい説明はこのページには関係ないので、またの機会に。

とにかく0.0.0.0を見かけたときは文脈によって意味が変わるという事を意識するといいでしょう。

0.0.0.0にアクセスすると自分自身に繋がるような「配慮」がされているソフトウェアもありますが、実際には0.0.0.0は繋がらないと思った方がいいでしょう。

自分のネットワークのグローバルIPアドレスを確認する

プライベートIPアドレスが割り当てられている環境で自分のグローバルIPアドレスを確認する。というのは実は案外難しい話題です。

なぜかというと、プライベートIPアドレスを割り当てられた機器にとってグローバルIPアドレスというのは知らないものであり、誰かから教えてもらわないと知りえない情報だからです。

ルーターの管理画面にログインして「WAN側IPアドレス」などと記載されている項目を確認するのが確実ではあるのですが、面倒です。

そこで、アクセスしてきた=自分のIPアドレスを応答するWebサービスなどを利用するという手法があります。

ブラウザで利用できるものとしてはcman.jpのアクセス情報【使用中のIPアドレス確認】があります。

他にもhttps://domains.google.com/checkipのような、サーバーからcurlでアクセスして確認するタイプのサービスもあります。

次のように使用します。

curl -s https://domains.google.com/checkip
# https://domains.google.com/checkip はIPv6に対応しているので、IPv4を確認したい場合はIPv4を明示する必要がある。
curl -s -4 https://domains.google.com/checkip

類似のサービスとしてhttp://ifconfig.io/http://inet-ip.info/http://globalip.me/http://httpbin.org/ipなどもあります。