UDPホールパンチング整理(わかったかも)
Posted on 9月 20, 2008
Filed Under stun, udp, nat, P2P |
わかったのかも → コメント参照
symmetric NAT以外の話、つまりFull Cone NAT,Restricted Cone NAT,Port-Restricted Cone NATなら
UDPホールパンチングを使って外から中向けのセッションを張れるようだ。
Full Cone NATとは
NAT内からNAT外へ出る(UDP)パケットを送って、マッピングをつくったら、
NAT外のどのIP,ポートからでも、そのマッピングを利用してNAT内にパケットを送ることのできるNAT。
Restricted Cone NATとは
Full Cone NATに加えて、一度NAT内からパケットが送信されたIPからのみ、そのマッピングを利用できるNAT。
Port-Restricted Cone NATとは
Restricted Cone NATに加えて、一度NAT内からパケットが送信されたIPとポートからのみ、そのマッピングを利用できるNAT。
Symmetric NATとは
NAT内からNAT外へ出るパケットを送って、マッピングを作っても、
その同じ宛先からのみ、マッピングを利用できるNAT。
逆に言うと、
NAT内からNAT外へ出るパケットを送って、マッピングを作っても、
違うIPとポートの組み合わせからはそのマッピング(=NATの外側のIPとポート)からはNAT内にパケットを送れないNAT。
こいつに対してはTURNを使う。
簡略化のためIPは省略、Full Cone NATもRestricted Cone NATもPort-Restricted Cone NATも同じだから
一番厳しいPort-Restricted Cone NATだと思って考える
図
A< ——–>NAT1(port6000)< ——–>STUNサーバ< ——–>(port10000)NAT2< ——–>B
1. まず、AとSTUNサーバ、BとSTUNサーバは別々につながってる。
AはNAT1の外側ポート6000番を通してSTUNサーバと、
BはNAT2の外側ポート10000番を通してSTUNサーバとつながってる
A< ——–>NAT1(port6000)< ——–>STUNサーバ< ——–>(port10000)NAT2< ——–>B
2. STUNサーバが外側ポートを教える
STUNサーバは、Aに対して、「BはNAT2のport10000番にいるよ」って言う
STUNサーバは、Bに対して、「AはNAT1のport6000番にいるよ」って言う
A< ——–>NAT1(port6000)< ——–>STUNサーバ< ——–>(port10000)NAT2< ——–>B
A———>NAT1(port6002)————–>—————>x(port10000)NAT2 B
3. AはNAT2のport10000に送ってみる
だがNAT2内からNAT1宛てにパケットが送られていないのでマッピングが無い。
NAT2ではじかれる
ここで、AからNAT2へ向けていったパケットは、NAT1の6002とか、6000ではない番号から出て行くだろう?
NATの外側ポートって変わらないのかな?
A< ——–>NAT1(port6000)< ——–>STUNサーバ< ——–>(port10000)NAT2< ——–>B
A NAT1(port6000)x< —————————–(port10002)NAT2<———B
4. BからNAT1のport6000に送ってみる
NAT1には、AからNAT2のport10000番へ向けて送ったマッピングがあるが、
NAT2の外側ポートは10002とか、10000ではない番号から出て行く(?)。
NAT2のport10002番から来ているので、ポート番号が違うのでマッピングは利用できない
NAT1ではじかれる
3,4ではじかれるように、STUNサーバではないやつに対してパケット送った時に
NATの外側ポートが変わっちゃうと困るよね?
それが、昨日ちょろっと話していた、keep_alivedみたいなことでNATの外側ポートを変えずにいけるのかな?
とりあえず、Full Cone NATと、IP Restricted Cone NATの組み合わせまでならいけるんだろうなということはわかった。
Port Restricted Cone NATでもいけるの?
誰か教えて!
Comments
3 Responses to “UDPホールパンチング整理(わかったかも)”
Leave a Reply
わかったかも。
http://en.wikipedia.org/wiki/Network_address_translation
Port-Restricted cone NAT
* Once an internal address (iAddr:port1) is mapped to an external address (eAddr:port2), any packets from iAddr:port1 will be sent through eAddr:port2. An external host (hostAddr:port3) can send packets to iAddr:port1 by sending packets to eAddr:port2 only if iAddr:port1 had previously sent a packet to hostAddr:port3.
って書いてある
AからNAT2の10000番に送るときに6000番から出てくし、
BからNAT1の6000番に送るときに10000番から出てく、って事なのかな。
それなら問題ないんだけれども。
実験してみよう。
> 3. AはNAT2のport10000に送ってみる
> だがNAT2内からNAT1宛てにパケットが送られて
> いないのでマッピングが無い。
> NAT2ではじかれる
> ここで、AからNAT2へ向けていったパケットは、
> NAT1の6002とか、6000ではない番号から出て行くだろう?
> NATの外側ポートって変わらないのかな?
Aのアプリが、STUNサーバに送ったときと同じ src IP/Port を使ってNAT2にパケットを送信すれば、ConeNATにてマッピングされる外側のIP/Portは同じになります。
ありがとうございます!
やはりそうですか、、ちょっと実装しながら確認していきたいと思います。