[DHT][P2P]P2P-VPNの提案
ご存知の方が多いとは思うがSoftEtherと呼ばれるユニークなVPNソフトがある。
これはグローバルアドレスを持った仮想ハブと言う呼ばれるノードがあり、それに対して色々なノード(例えばプロキシ内のノード等)がアクセスして、仮想的なレイヤ2ネットワーク、すなわちイーサネットを作ることである。
ここで問題なのはグローバルアドレスを持った仮想ハブを「固定して」誰かが持っていないといけないことである。
ではこの場合を単純に考えた場合、どのような問題が起こるだろうか?
1.仮想ハブにトラフィックが集中する
2.仮想ハブがダウンした場合にトラフィックが停止する
このように考えると、ある程度トラフィックがでる場合、この手のVPNには仮想ハブがある程度以上のスペックが必要であることがわかる。また仮想ハブをだれかが管理しないといけない。
そこで、DHT(分散ハッシュテーブル)を使って上記の課題点をクリヤしよう。DHTはSkypeのスーパーノードに使われている技術だと思えば良い。すなわちDHTを使ったP2P-VPNである。
(※実はこのP2P-VPNについては既に昨年9月に行われた第1回P2P勉強会で可能性についてさらりとコメントしている。次の日曜日(6/26)のDHTオフ会にSoftEtherのIKeJIさんが来るので、もう少し検討したものである。)
1.仮想ハブにトラフィックが集中する
解決方法としては2点存在する。
解決方法1.UDP HolePunchingを使い、UDP上で仮想TCPを動かす。
解決方法2.DHTのノード間で仮想ハブを分散し、経路毎に通過する仮想ハブを変化させる。
解決方法1はskypeのNAT越えでおなじみのUDP Hole Punchingだ。DHTのグローバルアドレスを持ったノードはSTUNノード[且つ仮想ハブ]になる。VPN間でUDP Hole Punchingを使える場合、TCP over UDPで通信を行う。
UDP Hole Punchingが使えない場合、TCPで1ノード経由してVPN通信を行う。
解決方法2はDHTのグローバルノードが仮想ハブになるが、それがDHTをうまく使って、仮想ハブの役目を分散させることだ。今、ノードAがノードBとノードCと通信する場合、通常ノードB、ノードCに対して同じ仮想ハブを用いる。DHTを使えば、仮想ハブを分散させる事が可能だ。
例えば、各ノードXのNodeIDをNodeID_Xとすると、ノードA⇔ノードBと通信する場合、
NodeID=(NodeID_A+NodeID_B)/2 となるノードを仮想ハブにすれば、仮想ハブが分散される。
このようにすれば、仮想ハブにトラフィックが集中しないし、例え仮想ハブがダウンしても、すぐさま隣のNodeIDのノードにセッションを引き継ぐようにすれば良い。この辺はDHTによる分散ストレージに似た議論になる。
いずれの2方法にせよ、SoftEtherの場合、完全にEthernetのエミュレーションなので、ブロードキャストなどが発生した場合には実装に工夫が必要だろう。この手のDHTの話は仮想レイヤ2よりも仮想レイヤ3(4)の方が簡単なのかもしれない。つまり、DHTのグローバルノードを仮想ハブでなく、仮想ルータにして、ここで完全に通信のルーティング、ポート等を制御してしまう方法である。
仮想ハブ、ルータはDHT上に置かれている各ノードの電子証明書を用いて認証及び通信の制御を行う。通信自体は電子証明書によって暗号化されるので、中間侵入攻撃はムリで、仮想ハブ、仮想ルータによって改ざんされることはない。(ただし、通信を意図的にドロップすることは可能である。)
ちなみにもしDHT全体を仮想ハブ等にすると、DHTに入っているNodeIDを上手く変換してMACアドレスにしてしまう手も考えられる。NodeIDは基本的に衝突しないので、うまく行くのではないだろうか?
DHTオフ会ではもう少しつっこんだ内容でプレゼンしたいと思う。
| 固定リンク
「P2P」カテゴリの記事
- WebRTCを実現するためにSTUNだけでなくTURNも必要な理由(2015.01.08)
- [P2P]P2Pストリーミングのサーベイ文書について(2014.11.09)
- Winnyの開発者、金子 勇氏の急逝を悼んで(2013.07.07)
- 「分散ハッシュシステムでのNAT超えの考察」に対する質問について(2012.12.16)
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2)(2011.11.20)
この記事へのコメントは終了しました。
コメント