わかったのかも → コメント参照
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
- まず、AとSTUNサーバ、BとSTUNサーバは別々につながってる。
AはNAT1の外側ポート6000番を通してSTUNサーバと、
BはNAT2の外側ポート10000番を通してSTUNサーバとつながってる
A< ——–>NAT1(port6000)< ——–>STUNサーバ< ——–>(port10000)NAT2< ——–>B
- 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
- 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
- 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でもいけるの?
誰か教えて!