インターネット非接続時における複数 NAT 越え P2P 通信方式
田中 有彩

1

(指導教員：小口 正人)

はじめに

3.2

STUN(Session Traversal Utilities for NATs) とは，NAT 越えの方法の一つである. 通信するホストがSTUN サーバに UDP 接続を行い，NAT が割り当てたグローバル IP アドレスとポート番号を取得する.NATの種類にはフルコーン型・制限コーン型・ポート制限コーン型・シンメトリック型と全部で 4 種類ある.STUN が対応できる NAT は，フルコーン型・制限コーン型・ポート制限コーン型の 3 つに限られる. そのため，STUN では対応できないシンメトリック型には TURN(TraversalUsing Relay NAT) を使用することで，全ての NAT に対応する. しかしすべての通信を TURN サーバ経由で行うため，P2P 通信ではなくなり, またサーバにも高負荷が掛かってしまう.

多くのネットワークアプリケーションはクライアン
ト・サーバ型通信を使用しており，災害時には被災域外への通信の遮断や輻輳を起こす恐れがある. そのため災害時においてインターネットにつながらない場合，もしくは衛星回線等によりインターネット接続回線が非常に細い場合においては情報共有ができなくなってしまう. そこで本研究では，インターネットにつながっていない状況でも情報共有できるアプリケーション通信環境が必要であると考え，インターネット非接続時でもプライベートネットワーク間で NAT 越えを実現することにより，P2P 型通信を用いた情報共有を行うことを目指す. 方法としては，シグナリングサーバとSTUN サーバ，必要に応じて TURN サーバを用意し，WebRTC 技術を用いて，NAT 配下にある端末同士のP2P 型通信を可能にすることを検討する.

2

3.3

P2P 方式とは，ネットワーク上で対等な関係にある端末間を相互に直接接続し，データを送受信する方式である．また，そのような方式を用いて通信するソフトウェアやシステムの総称でもある．データの送り手と受け手が分かれているクライアント・サーバ方式などと対比される用語で，利用者間を直接繋いで音声やファイルを交換するシステムが実用化されている．これにより，特定のサーバを介さずに，端末同士の通信を可能にする．クライアント・サーバ方式とは, サービスを提供する側（サーバ）とサービスを受ける側（クライアント）をネットワークで結び, クライアントからの要求にサーバが応答する形で処理を進める方式である. 通常のネットワーク通信で利用されているのはクライアント・サーバ方式である. また MANET(MobileAd-hoc NETwork) はモバイル環境において P2P 接続を利用し, 一時的なネットワークを構成するものである. 通常の MANET は端末間の P2P 接続を用いるが,本研究では端末が所属するプライベートネットワーク間の接続を利用する点が特徴である.

NAT 越え技術と WebRTC

3.1

NAT 越えWebRTC

WebRTC(Web Real-Time Communications) とは，ブラウザでリアルタイムコミュニケーションを実現するための仕組みである．つまり，P2P 通信を利用して端末間の相互接続が可能である．プロトコルにはUDP が使われているため，高速な通信ができる．WebRTC による P2P 通信をするためには，シグナリン
グと ICE(Interactive Connectivity Establishment) が必要である．シグナリングとは，通信相手の IP アドレス情報やポート番号等の情報を解決する手法である．
ICE は後述する NAT 越え通信のためのセッション確立のための情報交換を行うプロトコルである．

P2P(Peer to Peer) 方式とクライアン
ト・サーバ方式

3

STUN と TURN

3.4

NAT 越えと P2P 通信

WebRTC を用いてプライベートネットワーク内の端末同士の P2P 通信を行うためには， NAT 越えが必要となる．この時，シグナリングと ICE という仕組みが利用される．端末同士が P2P セッションを確立するには，シグナリングにより通信相手の IP アドレスや接続ポート番号等の情報を互いに交換しなければいけないため，どちらの端末からもアクセスできるシグナリングサーバが必要となる．ICE とは STUN や TURNなどの NAT 越えの手順をまとめたものであり，通信できそうな候補を集め，シグナリングにより相手とその候補を交換し，相手との通信を試みる仕組みである．

多くの端末はプライベートネットワークに所属してNAT 配下にあり，端末から外のネットワークへ通信をすることが通常である．しかし逆に，外から NAT 配下の端末へ直接通信することはできない．この問題を解決する手法を NAT 越え（NAT Traversal）という．

4

ローカル環境における NAT 越え実験

4.1

動作の流れ

本研究での端末の動作の流れを図 1 に示す．これには NAT 越え技術と P2P 通信技術が使用されている．
動作は以下の通りとなっている．

1) 相手と通信するには相手の外から見た IP アドレスが必要であるため，STUN・TURN サーバに自45

サーバにおける STUN/TURN サーバの設定は,IP ア
ドレス 192.168.1.144 のポート番号 3478 とした. 2 台の AP とサーバは有線 LAN でつなぎ，同じネットワーク内となっているため，ネットワークは全部で赤色と青色と緑色の 3 つとなっている．そしてプライベートネットワーク間で情報共有ができるかどうかを試す．
今回は Client1 から Client2 へ test.zip という 2MB のZIP ファイル送受信を行う．
実験結果

4.3

Client2 における Wireshark によるパケットキャプ
チャを図 3 と図 4 に示す．図 3 の info より,Client2 の通信相手である Peer の IP アドレスが 192.168.42.100であること, つまり Client1 であることが分かる. また図 4 の info より,TURN が使用されていることが見て分かる. 以上のことから,TURN を使用して Client1 から Client2 への情報共有に成功していることが分かる.
このことよりローカル環境における NAT 越え情報共有ができていることが確認できた.

図 1: NAT 越えと P2P 通信の処理分の外から見た IP アドレス情報を問い合わせる．

2) 自分の外から見た IP アドレス情報と様々な相手との経路情報を獲得．これにより，NAT 越え問
題を解決．
3) 相手と通信したいことを通知．
4) 相手の情報や通信経路情報を交換．

図 3: Client2 におけるパケットキャプチャ1

5) P2P 通信または TURN による通信の開始．
4.2

実験環境

本研究では，WebRTC のオープンソースソフトウェ
アである easyRTC， STUN 兼 TURN サーバが構築できるオープンソースソフトウェアである coturn を用い，実験用のローカル環境を構築した．その環境を
図 2 に示す．これにより，ローカル環境における NAT越え情報共有の実験を行う．

図 4: Client2 におけるパケットキャプチャ2

5

まとめと今後の課題

ローカル環境における TURN を用いた NAT 越えと情報共有が可能であることが確認できた．今後は，
まず STUN を用いて P2P 通信ができるようにし, プライベートネットワーク同士が NAT ルータを介してアドホックに接続した際に自律的にシグナリングサー
バ，STUN/TURN サーバを一意に検出し，NAT 越えの P2P 通信による情報共有が行える手法を検討する．

謝辞
本研究を進めるにあたり，ご指導して下さった株式会社スペースタイムエンジニアリングの前野誉さん，情報通信研究機構の大和田泰伯さん，UCLA の高井峰生先生に深く感謝致します.

図 2: 実験環境
無線 LAN を搭載した Debian GNU/Linux サーバ 2台にそれぞれ hostapd をインストールし，Wi-Fi AP 兼NAT ルータとして動作させた．ESSID は AP(COM9)が test-p2p ，AP(COM10) が test-nat となっている．これにより 2 つの異なるプライベートネットワークを作成した．Client としては PC2 台をそれぞれ別の Wi-Fi AP に繋げて設置した．IP アドレスはClient1 が 192.168.42.100，Client2 が 192.168.42.99 となっている．サーバとして， アクセスポイントである
COM9 のポート番号 8080 にシグナリングサーバである easyRTC を，ポート番号 3478 に STUN 兼 TURNサーバである coturn を構築した．またシグナリング

参考文献[1] 鈴木秀和，渡邊晃” 通信グループに基づくサービスの制御が可能な NAT 越えシステム”，マルチメ
ディア，分散，協調とモバイル (DICOMO2009)
シンポジウム，pp.372-378，2009 年 7 月.
[2] easyRTC https://easyrtc.com/, 2016 年 10 月参照.
[3] coturn https://github.com/coturn/coturn, 2016年 9 月参照.

46