💭

君は次に"来る"SNS arpchatを知っているか?

2024/12/30に公開

https://github.com/kognise/arpchat

情報系学科の人間でもないので年末に一人寂しくアドカレをします。
今年見つけた様々なソフトウェアの中で一番お気に入りになったarpchatの紹介をさせてください。

発端

今やオープンなコミュニティの時代は終わり、クローズドコミュニティの時代が到来しています。技術系コミュニティの誰もがDiscordに閉じこもっている!
そんなわけで、チャットは閉じていればいる程よい。なるべく近くの人とチャットしたいと思いました。
具体的には、同じネットワークに繋いでいる人とだけローカルにチャットできたらいいなあ。
しかも面倒だし電気代もかかるので、サーバーとかは立てたくないなあ。
そこで思いつきました。「ARPを使えばいいじゃないか!」と。

ARPとは

Address Resolution Protocol。IPアドレスとMACアドレスを照合するためのプロトコルです。OSI参照モデルでいうと第3層、ネットワーク層に入ります。
RFC 826だよ!
https://datatracker.ietf.org/doc/html/rfc826
皆さんも自分のターミナルでarp -aとコマンドを打ってみましょう。そのパソコンと同じネットワークにいる端末のIPとMACアドレスの一覧を見ることができます。
パソコンさんはこの表(ARPテーブル)を使ってパケットの送り先を探します。
みなさんがまいにち沢山作っているパケットは、このようにして送られているんですね!(感動)

パケットさんは最終目的地のIPアドレスに辿りつくまでに様々なネットワークを経由していきます。
ARPでは送信先のMACアドレスがわからなかった時、ブロードキャストで同じネットワーク内の全てのパソコンさんに「このIPをお持ちの方のMACアドレスはなんですか!」と呼びかけます。これをARP REQUESTといいます。
それを受け取ったパソコンさんは、自分がそのIPだった場合「はいわたしです」と呼びかけられたパソコンさんに返信し、そうでなかった場合は無視します。これをARP REPLYと呼びます。

ARPでchat

さて、ここまで読んだ勘のいい読者の方はお分かりでしょうが、このパケットは同じネットワーク内にしか送られません。
よって、このARPパケットのボディの部分に好きな文字列を突っ込むとさっき言った通り同じネットワーク内だけで、サーバーなしでチャットできることが分かりますね。やった!

と思って実装しようとしましたが、探したらあったのでやめました。
Thank you @kognise!

ところで、ARPにはボディなんかありません。なぜなら、いらないからです。
ARPのパケットフォーマットを見てみましょう。

https://www.geeksforgeeks.org/arp-protocol-packet-format/ より

こんな感じですね。ちなみに実際のところ最後の四項目はプロトコルに合わせて任意lengthになっています。
kognise氏のコードを見る限り、実装上テキストデータはプロトコルアドレスの項目に入っているようです。

使ってみてね

さて、ここまでわかったらあとは使ってみるだけですね。校舎のネットワークの方に「こういうのがあって」と言ったところ、「MACアドレスは命より重いので……」と断られてしまいました。

セキュリティに問題がある?すみません、当然です。しかしセキュリティの観点でいえば、同じネットワーク内に入られている時点で結構負けているので、まあいいんじゃないでしょうか。おうちでちょっと遊ぶくらいなら。
※会社でやったらドカ怒られでは済まないと思います

尤もわたしはARPスプーフィングになろうが、ネットワーク技術者ではないので、問題はありますが全然問題ありません。ドシドシやりましょう。

と、弊環境ではできたのですが、なんとスクショを撮るのを忘れていました。いかがでしたか?というわけで皆さんもぜひ試してみてください。これが"次世代"の真に流行るSNSです。

Discussion