教養として低レイヤーの勉強したいなぁと思っていたもののなかなか手を出す機会がなかったので、思い切ってラズパイを購入してみました。(別途IoTをやってみたかったのとlinuxマシーンを安価に手に入れたかったという理由もあり)
今回購入したラズパイはこちら。
ここにGUIなしのRaspbian Stretch LiteをOSとして選びました。甘ったれないようにGUIはなしです。
これらを使ってIPの理解を深めることを目標としました。
ちなみに、前提知識は名著マスタリングTCP/IPで勉強しました。
プライベートIPとグローバルIP
この二つがあることはもともと知っていましたが、実際にどう使われているのかをしっかり追ったのは今回が初めてでした。IPについての理解すらあやふやだったので、ちょうどいい復習の機会になりました。(IPv4についてのみ言及)
IPアドレスの構成
IPはネットワーク部とホスト部によって構成されています。
192.168.10.101/24
のように表し、/以降は先頭から何ビットがネットワーク部であるかを示しています。8ビットごとにコロンで区切られているので今回は、192.168.10がネットワーク部ということになります。ネットワークアドレスというと通常は、
192.168.10.0/24
という風に表し、ホスト部は0にします。これで、「192.168.10をネットワーク部とするネットワークアドレス」という意味になります。ちなみにこれはプライベートIPです。
続いてホスト部ですが、これはそのネットワーク内においての個別の識別子のようなものです。
192.168.10.101/24
だと、「192.168.10というネットワークにいるNo.101のデバイス」的な意味です。
プライベートIP
プライベートIPは各ネットワーク内で用いられるIPアドレスで、使えるネットワーク部の範囲が限られています。
- 10.0.0.0~10.255.255.255
- 172.16.0.0~172.31.255.255
- 192.168.0.0~192.168.255.255
この4つの範囲内のみ使えます。日本だと、192.168.xxx.0/24というプライベートアドレスが用いられることが多いとか。(厳密にはクラスcのIPで小規模ネットワーク向け)
これらをネットワーク部として、ローカルネットワークでは端末にIPが振り分けられます。またプライベートIPはDHCPという仕組みを使って自動で割り当てられます。これをやってるのがルータです。
同一ネットワーク内ではプライベートIPはデバイスの判定のためにユニークでないといけませんが、異なるIP間ではユニークでなくても問題ありません。というか重複させてIPアドレスを節約するためにこのような方針をとっています。これで各端末に一つのIPから各ネットワークにひとつのIPまで数を減らすことができます。
ちなみに、192.168.xxx.0/yy のxxxとyyは勝手に決めて問題ないようです。必要に応じてルーターの設定を変更すると、ネットワークのうち空いているIPをデバイスに割り当ててくれるそうです。
勝手に決めていいで。ルーターが決めるのはDHCPで勝手に決まるだけなので。なんなら/22 とか24bitにこだわる必要もないです。
— Shohei Kamon | Stir.network (@cameong) July 22, 2019
グローバルIP
グローバルIPはプライベートIP以外の範囲のIPアドレスを用いて表現されます。グローバルIPは基本的にはプロバイダーから動的に割り当てられ、ひとつのネットワークに対してひとつのIPアドレスです。
固定のIPを取得することもできこの場合は別途契約が必要になるようです。サーバーを公開するなど外部からアクセスがない場合は基本的になにも気にする必要はありません。
ルータ
Wi-Fiの設定などでルータは日常的に使いますが、インターネットに繋げてくれるヤツぐらいの認識の人も多いと思います。(僕は実際にそうでしたw)
もう少し具体的にルータの役割を説明すると、プライベートIPとグローバルIPの変換やプライベートIPの割り当てを行ってくれます。
NAT(Network Address Translation)
これは、プライベートIPとグローバルIPを変換するところです。各デバイスはプライベートIPしかもっていないためそのままではインターネットに接続することができません。そのため、NATでグローバルIPに接続しやる必要があります。
また、ひとつのパブリックIPに対して複数のプライベートIPが存在するので、そのままではリクエストを送れてもレスポンスをどのデバイスに返したらいいのか判断することができなくなってしまいます。
そのため、ポート番号も併用することでどのデバイスかを判断することができるようになります。(ポート番号はルータが記憶するので、サーバはどの端末がアクセスしてきたのかを判断することはできません。UAである程度はわかりますが)
このようなN:1のNATを得にPATといったりすることもあるようです。
DHCP(Dynamic Host Configuration Protocol)
DHCPはプライベートIPの割り当てを行うアプリケーションのことです。何も設定しないと勝手にルータがDHCPを使ってプライベートIPを割り当ててくれます。これによりプライベートIPを意識することなくインターネットに接続することができるようになります。
動的の割り当てのため接続するとプライベートIPが変わってしまうことがありますが、セキュリティの観点からもその方が安全のようです。
必要に応じてプライベートIPを固定することも可能です。ラズパイの場合は設定ファイルに書くだけで簡単に固定できます。
ちなみにラズパイを使ってルーターを自作するのはけっこう簡単みたいです。この辺の実装を理解するためにも一度自分で作ってみたいものです。
ラズパイを外部に公開するには?
デフォルトのルーターの設定では、ラズパイを外部に公開されていません。もしそうでないなら全てのパソコンは悪い奴がいっぱいいるインターネットの世界に無防備で晒されていて、いつ誰に不正アクセスされるかわからない状況ということになります。そのため、インターネットに接続できても相手から接続することは基本的にできません。
これをあえて破ってサーバーとして外部に公開するためには、ルータで開放すべきポートと転送先のプライベートIPをルータに登録しやる必要があります。これは、ルータにごとに設定方法が違うみたいです。
ただ、これをやってもマンションとかの共用のLANだとうまくいかない場合があるようです。その場合は管理元に申請するしかないようです。僕はうまくいかなかったので諦めました。