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ホールパンチング整理(わかったかも)”

  1. mash on 9月 20th, 2008 20:20

    わかったかも。

    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番から出てく、って事なのかな。
    それなら問題ないんだけれども。

    実験してみよう。

  2. uctk on 9月 24th, 2008 10:21

    > 3. AはNAT2のport10000に送ってみる
    > だがNAT2内からNAT1宛てにパケットが送られて
    > いないのでマッピングが無い。
    > NAT2ではじかれる
    > ここで、AからNAT2へ向けていったパケットは、
    > NAT1の6002とか、6000ではない番号から出て行くだろう?
    > NATの外側ポートって変わらないのかな?

    Aのアプリが、STUNサーバに送ったときと同じ src IP/Port を使ってNAT2にパケットを送信すれば、ConeNATにてマッピングされる外側のIP/Portは同じになります。

  3. mash on 9月 25th, 2008 20:56

    ありがとうございます!
    やはりそうですか、、ちょっと実装しながら確認していきたいと思います。

Leave a Reply