もふもふ改めKatayamaです。どちらで名乗るのか非常に悩む今日この頃です。
今日は、昨日夜中にわちゃわちゃやってたコレについて、蛇足に蛇足をくっつけた上で技術的解説を行いたいと思います。
もふもふ / fav整理作業中 on Twitter: "ぶっちゃけ「あ、通るんだ・・・」って気持ちで叩きましたよね。"
もふもふ / fav整理作業中 on Twitter: "言うの遅くなりましたけど画像のnetshコマンド叩いて帰ってこなくても私は責任持ちませんからね!!!"
Android/FireHDがLAN内にこんなんばら撒いてるっぽいな…。
— ふぇのまー(禅) (@Phenomer) December 28, 2017
一体何をどうしたらこんな事になるんだ?
ARP, Request who-has 72.21.202.14 tell 10.39.39.4, length 28
ARP, Request who-has 31.13.82.34 tell 10.39.39.3, length 28
気になったので試してみた。理屈上はサブネットマスクを0.0.0.0にして、かつデフォルトゲートウェイが存在しないと、世界中を同一サブネットと見なす設定になる(普通は設定されない)ので、こんなこと(3枚目)になる。
— もふもふ / fav整理作業中 (@kitkatayama) December 28, 2017
https://t.co/bJzK1AKFcR pic.twitter.com/z00phBmmLe
TL; DR
- グローバルIPアドレスのARPを聞きに行くのは、同一ネットワークだと勘違いしているから
- 同一ネットワークだと勘違いするのは、サブネットマスクが0.0.0.0になってるから
- 上記内容の理解のため、これから解説するよ!
前段というか雑談
家庭用のルーターとかだと、よく192.168.0.1だとか、192.168.100.1みたいなIPがついてますよね。
で、それに繋ぐと192.168.0.2みたいなIPが自動的に割り振られて接続しますよね。
なんとなーく、192.168.0.1と192.168.0.2って似てるし、同じネットワークに居るんだなあ、というのは直感的に感じ取られるかと思います。 が、その意図、仕組みというのを正確に理解している人は意外と少ない印象を受けます。
特に、プライベートIPアドレスの払い出しを考えたときに、/8や/16、/24でぶった切ることは簡単ですが、/28や/30といったものを考えたときに思考が止まってしまうようです。
2進数という名の魔物
コンピュータは2進数、所謂1と0で計算をします。IPアドレスもその例に漏れなく、2進数の計算をします。WindowsやMacに近しい人は、サブネットマスクとかいうなんか適当に255.255.255.0を設定する奴を見ますよね。アレです。あいつです。今からあいつの正体を暴きます。
その前に、2進数という概念がどうしても必要になりますので解説します。とはいえ、8桁の2進数がなんとなーくわかれば十分なので、下の表をご覧ください。
8bit | 7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit |
---|---|---|---|---|---|---|---|
10000000 | 01000000 | 00100000 | 00010000 | 00001000 | 00000100 | 00000010 | 00000001 |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
2進数と10進数の対応を表にしています。見易さの観点から、逆順にしています。
例えば、2進数で3という数値を表現したいときは、3=2+1=00000010+00000001=00000011となります。
10101010を10進数にしたいときは、10000000+00100000+00001000+00000010=128+32+8+2=170になります。
なんとな~くわかってもらえれば十分です。こんな感じの扱い方をします。
AND計算を理解しよう!
で、足し算がわかったところで、今度はANDとかいう掛け算みたいな奴です。2進数でいうところだと、ざっくりと掛け算と覚えててくれればいいです。
2進数は0と1しかありません。その掛け算といえば、下記のような計算結果になります。0をかければ0になってしまう、そのままの通りです。
1項 | 2項 | 計算結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
では、例題を解いてみましょう。00001111と11111100のANDを考えます。
00001111
11111100
00001100
縦に書くと分かりやすいです。小難しいこと考えず、こんなもんなんだと理解してください。
ちなみに、コレを10進数に直すと、
00001111 = 8+4+2+1 = 15
11111100 = 128+64+32+16+8+4=252
00001100 = 8+4=12
なので、15 AND 252 = 12 とかいう式が出来上がります。とくに意味はないです。
ここまで理解できれば、多分大丈夫!
ネットワークアドレスとはなんぞや!
最初に話した、192.168.0.2と、255.255.255.0とかいうちょっと強そうな設定の例で計算をしてみましょう。
種類 | IPアドレス(10進) | IPアドレス(2進) |
---|---|---|
クライアントIP | 192.168.0.2 | 11000000 10101000 00000000 00000010 |
サブネットマスク | 255.255.255.0 | 11111111 11111111 11111111 00000000 |
ネットワークアドレス | 192.168.0.0 | 11000000 10101000 00000000 00000000 |
この計算結果のネットワークアドレスというのが、所属するネットワークのIPアドレスとなります。このネットワークアドレスが一致している通信機器は、同じ機械につながっているようなものです。
ちなみに、上記の表では露骨に文字色を変えてみました。192.168.0.XXXの部分は、サブネットマスクとAND計算すると、全てが0になることがわかりますね。
今感じた通り、192.168.0.0~192.168.0.255までは、同じネットワークに居ることになります。
それでは、2つほど例題を出してみましょう。認識があっているかの確認です。
種類 | IPアドレス(10進) | IPアドレス(2進) |
---|---|---|
クライアントIP | 10.0.0.126 | 00001010 00000000 00000000 01111110 |
サブネットマスク | 255.0.0.0 | 11111111 00000000 00000000 00000000 |
NWアドレス | 192.168.0.0 | 11000000 10101000 00000000 00000000 |
種類 | IPアドレス(10進) | IPアドレス(2進) |
---|---|---|
クライアントIP | 172.20.123.45 | 10101100 00010100 01111011 00101101 |
サブネットマスク | 255.255.128.0 | 11111111 11111111 11110000 00000000 |
NWアドレス | 172.20.112.0 | 10101100 00010100 01110000 00000000 |
特に2番目のを理解できた人はすごいです。オレンジを付け加えた部分は、10進数だと混じってしまっている部分です。とりあえず、IPアドレスは仕組み上こんなネットワークの作り方もできるということです。
テキストベースだと、ふーんって感じですが、実際は、GUIだとこういう設定を入れるわけです。ぱっと見むずがゆいですねw
グローバルアドレスにARPを聞きにいくということ
では、ネットワークアドレスの計算がわかりました。で、上記の操作は、1回の通信で2回行います。自分のIPと、通信したい相手のIPに対してです。このとき注意したいのは、サブネットマスクは両方自分のものを使うということです。相手のことなんてわかりませんからね。
まとめると、こういうことです。
と思うのです。では、サブネットマスクを0.0.0.0とした場合、どうなるでしょう。
種類 | IPアドレス(10進) | IPアドレス(2進) |
---|---|---|
クライアントIP | 1.2.3.4 | 00000001 00000010 00000011 00000100 |
サブネットマスク | 0.0.0.0 | 00000000 00000000 00000000 00000000 |
NWアドレス | 0.0.0.0 | 00000000 00000000 00000000 00000000 |
真っ赤です。全部です。どのような値を与えても計算結果は0.0.0.0になります。
つまり、どんなIPアドレスを突っ込んでも、同じネットワークに居ると勘違いします。
同じネットワークに居る、イメージとしては同じルーターにつながっているなら、「あれ?お前すぐそこに居るんじゃね?」と思ってしまいますよね。すぐそこに居る機械のMACアドレスを聞きに行きます。これがARPというものです。
以上より、サブネットマスクが0.0.0.0と設定されているため、全てのIPアドレスが同一ネットワーク内に居ると勘違いし、グローバルIPアドレスのARP問い合わせを実施していたということです。
番外編:名前解決について
今回の話のなかでは、あえて名前解決には触れませんでした。というのも、発端のツイートは、
という条件下で、色んなアプリケーションがドメイン名を指定して通信しようとしている様子が見て取れます。そのため、ARPも色んなものを聞きに行こうとしています。
その話まで含めようとするとややこしいので、今回は触れませんでした。
以上!明日起きれるかなあ・・・