maaash.jp

what I create

UDPホールパンチング整理(わかったかも)

わかったのかも → コメント参照

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

  1. 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

  1. 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

  1. 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