Raspberry PiでもLinuxでも、はたまたWindowsでもインターネットに公開するサーバは本体さえ設定してしまえば公開できているというわけではありません。ここではインターネットに公開するために必ず必要な手順のポートフォワードについて解説していきます。ポートフォワードは例え話だと「ルータに穴をあける」なんて言い回しもしますね。ポート開放、ポートフォワーディングあたりも同じことを言っていると思って大丈夫です。今回は原理の説明の多くの場合で、たとえ話を使用しているため厳密性に欠けるといういことをあらかじめお断りしておきます。
目次
ポートフォワードでしたいこと
このポートフォワードというのが何をしているかはある程度理解しておくべきだと思います。というのも、今回説明するポートフォワードを設定するときなのですが、各メーカの各機種ごとに設定の方法が微妙に異なるためよく理解したえで設定しないと間違えた設定をしてしまう可能性が高いからです。これを理解するにはIPアドレスとポートについては最低限抑える必要がありますが、厳密さよりもある程度の理解が必要になりますのでそれがわかるように説明します。
以下の図を用いて説明します。
あくまで一般家庭の構成がこうなっているであろうというだけで、これは各家庭のネットワーク構築環境で違ったりするものなので一般的な家庭の典型例になっています。
まずは順番に説明します。ルータが一番見慣れない言葉だと思うのですが、これはすごく簡単にいうと、WiFiを飛ばしている機械だと思って間違いありません。インターネットに直接つながっている機械で、インターネットから受信、逆に送信する制御を行ってくれる機械です。
この図によるとルータという機械を経由してそれぞれのデバイスと通信しているのがわかるでしょうか。パソコンにせよ、スマホにせよ基本的にはこのように通信しています。あなたが見ているこのサイトもこんな風にやりとりされて表示されたものです。
いままでルータが間に入ってやり取りしていましたが、ポートフォワードというのは以下のような通信ができるようにしてあげたいということなのです。以下の図を見てください。
ルータを突き抜けて通信するような形になっているのがわかるかと思います。これがポートフォワードのやりたいことになっています。これを設定するために必要となるのがIPアドレスとポート番号というわけです。
IPアドレスとポート番号が必要な理由
なぜIPアドレスとポート番号が必要なのかはそれぞれの役割をある程度理解すれば自然と見えてきます。順を追って説明します。
IPアドレスというのとある記事の一部で紹介しましたが、IPアドレスというのはインターネットの住所で、世界に同じ数字の列1つしかないものだと紹介しました。ある意味これは厳密にいうと正解でもあり不正解でもあるのですが、IPアドレスというものには2種類存在しているというのが今回の設定においては必要になるので、これを説明していきます。IPアドレスには以下の2種類があります。
- グローバルIPアドレス
- ローカルIPアドレス
順番に説明します。まずはグローバルIPアドレスですが、これが世界に一つしかないIPアドレスになっています。これはルータからインターネットにつながってるところに割り当てられているIPアドレスになると思ってください。図だと雲のようにインターネットって書いている部分とルータがつながっている部分のことですね。
ローカルIPアドレスは、自宅内のネットワークでのみ使用されるIPアドレスでたいていの場合、「192.168.x.xxx」みたいな数字になっていることが多いです。これは家庭内の機械に1台ずつ別のものが割り当てられますが、別の家庭内なら同じIPがあるかもしれないということですね。例えば図だとスマホが「192.168.7.10」というIPアドレスを持っていますが、あくまでこの家の中だけなので、友達の家の環境をのぞいてみると同じIPアドレスを持つ別のコンピュータがあるということになります。
この上の2つを組み合わせるとこのような状況が出来上がります。以下の図のルータの左側の数字に注目です。
実はルーターより下にある機械からだとルータは「192.168.7.1」というローカルIPアドレスを持っているように見えて、インターネットから見ると「123.456.789.123」というグローバルIPアドレスが見えていることになります。あと、インターネット側からは赤い線より下が見えないのです。
つまりどのコンピュータがどのIPアドレスを持っているかわからないという状況になります。これがなかなか困ることが発生する理由なのですが、これを解消するためにポート番号を用いります。詳しく見ていきましょう。
※ちなみに以下の説明は実際の挙動とは異なりますが、やっている原理としては一緒なので厳密性に欠けているということをあらかじめおことわりしておきます。
まずこの図スマホと、パソコンを同時に操作することを考えます。スマホでは動画Aを視聴、パソコンでは動画Bを視聴するとします。このとき図での通信はどうなっているのでしょうか。
もしもグローバルIPアドレスしかわかっていなかったとします。するとインターネットから情報を送られてくるわけですが、このとき「「123.456.789.123」に情報を送りますねー」っていうのしかわからないわけです。この通信をルータがもらったとしても、どの情報をスマホに渡せばいいかがわからないわけです。パソコン宛てだった情報を間違えてスマホに渡してしまうかもしれないわけです。
ここでポート番号の出番です。IPアドレスの情報の最後にポート番号を[123.456.789.123:1000]こんな風につけてあげるとします。これを動画Aと動画Bの情報を区別するために使うとどうなるでしょう。動画A用のアドレスを「123.456.789.123:1000」動画B用のアドレスを「123.456.789.123:2000」で送ってくるとしましょう。ルータ的にはインターネットから「123.456.789.123」宛てに情報が来たことには変わりありませんが、ポート番号というのがあるおかげでどの情報をスマホへ、パソコンへ送ればいいかわかるというわけです。
つまりポート番号をつけることで、どの情報をどこへ送ればいいかの区別をつけているのです。
以上がわかればあとはどんな設定を行えばポートフォワードを行えるかがわかるわけです。では次でその説明をします。
ポートフォワードの設定において必要な条件と情報
先ほどのポートフォワードの図を踏まえて、インターネットからの情報をそのまま届けるにはどんな情報をルータに設定してあげるかを考えます。ポート番号でローカルIPアドレスの宛先を見つけて送るんでしたね。なので、ルータのやってほしい順番は以下のようになりますね。
- 通信パケットを受け取る
- ポート番号を見る
- ポート番号によって宛先ローカルIPアドレスを決める
- そのローカルIPアドレスにデータを渡す。
ということをやってほしいわけです。ちなみに、ポートフォワードの設定を行わないとwebサーバを公開できない理由なのですが、すごく簡単にいうと、ブラウザで見るときに使う通信のフォーマットが決まっています。それに合わせて通信しないといけないのに、ポートフォワードの設定をしないとそれができないからです。
一番最初に出てきた一般家庭のネットワーク環境の典型図だと、ルータがどのコンピュータとの通信を挟んでいました。ここでその通信パケットに細工をしていると思ってください。だからこそルータを介してポートフォワードの設定を行わないで通信すると決まったフォーマットでの通信ができずwebサーバとして公開できないのです。
ポートフォワードというのはそのインターネット側から来た通信をなんの変更もせずにそのままとあるIPアドレスにとどけるような動作をします。ポートフォワードの図の通りです。見方を変えると、あるポートの通信ではインターネットとwebサーバ(図だとRaspberry Pi)があたかも直接つながっているように見えるわけです。
この「インターネットとwebサーバがあたかも直接つながっているように見える」というのがwebサーバに必要な条件になっていて、だからこそポートフォワードの設定がいるわけですね。
あとは実際の設定画面を見ながらしたほうがいいと思うので、私の例を簡単にだけ紹介します。
ポートフォワード設定の例
とりあえずルータの管理画面にアクセスしましょう。これはそれぞれによって違うので、ご自身で説明書を読むなり検索するなりして調べましょう。あと設定する際は、ポートフォワード先のコンピュータのセキュリティが確立されていることを確認してください。
その管理画面の設定からポートフォワードなりポートフォワーディングの設定などの項目を探しましょう。方法は機種毎に違うので、ルーターの型番+ポートフォワーディングあたりで検索したらでてくるかもしれませんね。
私の場合はこんな感じです。
「ローカルIPアドレス」に先ほど説明した、ご自身の環境にあったローカルIPアドレスを入力。webサーバならIPアドレスを固定しているRaspberry Piのアドレスですね。次にタイプは「TCP」「UDP」がありますが、開けたいポート、タイプに合わせて選んでください。webサーバの場合は必ず「TCP」を選択する必要があります。「ポート」には環境に合わせたものを入力すればいいのですが、webサーバなら80と443の2つが設定として必要になります。あとは追加を押せば私のルータだと完了。ほかのルータでも似たような設定だけで大丈夫です。ほかに色々設定する項目があるルータもあると思いますが、デフォルトのままで問題はないと思います。
ポートフォワードができているか確認
webサーバを立てている前提で話をします。
このままwebブラウザにご自身のグローバルIPを入れて、ご自身のサイトが表示されればポートフォワードの設定はうまくいっています。気を付けてほしいのが自宅から自宅へのサーバへのアクセスは何も設定しないとうまくいかないようになっています。理由は省きますがそういうものだと思っておいてください。
なので携帯電話などで別回線をお持ちの方や、VPNサービスなどを利用して外からアクセスできるかを確認してください。
グローバルIPの調べ方は以下のコマンドで簡単に調べることができます。
curl ifconfig.io
ここで返ってきた数字をブラウザに入力してみればいいわけですね。もし表示されなかった場合はポートフォワードの設定がうまくいっていないということなので、よく見なおしてみましょう。
必要であれば、ドメインを取得して、設定を行いましょう。次の記事は以下に置いておきます。
感想
私もなぜこうする必要があるのかっていうのが最初はよくわかっていなかったのですが、勉強して理解することで素人の人にも必要な要素だけを理解してもらえると思い、記事にしました。ポートフォワードは設定としてもなぜそうする必要があるのかというのが一番わかりにくくて、この部分をわかってもらうためになるべく工夫をしています。なので厳密性には欠けるところはあるものの一番わかってもらいやすい説明にしたつもりです。わかりにくいなどあれば加筆修正いたしますので、お気軽にどうぞ。
はじめまして。検索でたどり着いた者です。
ポートフォワードについてですが、開放したポートは80、443でしょうか?私の家のネットがv6プラスのため上記ポートの開放ができず、PPPoEにするか、または他の手段はないか調査中のため質問いたしました。
突然の質問で大変恐縮ではございますが、なにとぞよろしくお願いいたします。
やまがた様
コメントありがとうございます。返信が遅くなり申し訳ありません。
解放しているポートは80と443です。私の家はPPPoEなのでそこを開けていましたが、v6プラスだと別途443ポートを開けられるサーバーが必要になります。
つまり、別サーバーへの443ポートへの通信をVPN等を介してv6プラスの443番以外のポートにフォワードする必要があります。
余談ですが、数日前に同様のことを悩んで結局Web ARENA IndigoのVPSにブログをお引越ししてしまいました。VPNでフォワードしたまではいいんですが、レスポンスを考えるとVPSを借りてそこでサーバーを立てたほうが良いという結論になりました。