mDNS を利用したWebRTC のローカル IP 隠蔽機能

Chrome Canary M74 や Safari Technology Preview 74 では mDNS を利用したローカル IP 隠蔽機能が利用できるようになりました。

要約

  • ローカル IP アドレスはすべて UUID.local になる
  • ローカル内で mDNS を利用し名前解決を行い IP アドレスを取得する
  • 名前解決できない場合は UDP ホールパンチングを試みず破棄できる

UUID.local

まずはどうなるのかを見てもらおうと思います。

ちょっとわかりにくいですが Chrome Canary M74 で取得した Candidate です。UUID.local となってるのがわかるでしょうか?

a=candidate:3252390177 1 udp 2122262783 56264e2a-1cc6-433f-8330-1594df32034c.local 64557 typ host

もう一つは Chrome M72 で取得した Candidate です。普通に IP アドレス(加工済)表示になっています。

a=candidate:505434299 1 udp 2122194687 192.0.2.6 60586 typ host

mDNS

そもそも mDNS というのは何なんでしょうか?mDNS は Multicast DNS の略です。

同一 LAN 内で IP アドレスを<好きな名前>.local とつけて、登録するという仕組みです。macOS であれば Bonjour という仕組みで知られています。Linux だと avahi という名前で知られています。

WebRTC でなぜ mDNS が必要なのか

簡単に言えばローカル IP アドレスの隠蔽が目的になります。

WebRTC では P2P 通信をするために、自分の IP アドレスをいろいろな形で取得して通信相手に投げるという仕組みがあります。ただ、この仕組を悪用してこっそりとローカル IP アドレスを知ることもできてしまいます。

それを防ぐために提案されたのが mDNS を利用した IP アドレスの隠蔽です。

そもそもローカルで通信する以外にローカル IP アドレスは不要なわけです。そして同一ローカルにいるのであれば、それは名前を逆引きできるはずです。

つまり自分の IP アドレスを UUID.local として登録しておき、その値をを相手に投げつけて、相手に解決してもらい IP アドレスを知ってもらうという仕組みです。

ちなみに Apple と Google が共著で Draft を出しています。

隠蔽以外でもメリットがあります。UUID.local が解決できない場合はその候補を捨てれば良くなります。わざわざ UDP ホールパンチングを試したりする必要もありません。

まとめ

デメリットが自分には見つけられないくらい素晴らしい仕組みのように感じます。Apple と Google が採用してくるため Firefox も採用してくると思います。今後は WebRTC で利用するローカル IP アドレスは UUID.local でやりとりされるのが当たり前になると考えています。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store