WebRTC Meetup Tokyo #5で講演した 「WebRTCの裏側にあるNATの話」の資料です。
●誤記修正 (2015/1/25追記) P.66 誤 元 1.1.1.200:80 正 元 1.1.1.100:80 P.69 誤 元 1.1.1.200:80 正 元 1.1.1.100:80
WebRTCの裏側にあるNATの話- A talk on NAT behind WebRTC -@iwashi86 / 岩瀬 義昌2014/11/26 WebRTC Meetup Tokyo #5
View Slide
●Attribute Name Yoshimasa Iwase @iwashi86 web iwashi.co●Work ・Web [email protected] Com ・HTML5 Experts.jp Editor●Recently ・HTML5 Experts.jpにてWebRTC特集掲載!
本題今日はNATの話(WebRTCなので特にUDPのNAT)
https://flic.kr/p/4HKJE1なぜ、いまさらNAT?
InternetNAT NATWebRTCのクライアントはNAT配下に居ることが多い
InternetNAT NATクライアント達は何の工夫も無しには直接通信できない・・・Dropped…
InternetNAT NATそこで、WebRTCでは主にSTUN※を使ってなんとか穴あけしているReached! ☺STUN STUN※UDP Hole Punchも
InternetNAT NATでも、ダメなケースもある…(その場合はTURNで中継)STUN STUNDropped…
そもそも
https://flic.kr/p/b6WaSPなんで通ったり落ちたりするの?
https://flic.kr/p/oH1mPu気になる!(技術者的な意味で)NAT
そんなあなたに良いRFC(4787)
UDP向けNATの振舞いについて熱く語っているRFC
あと、Obsoleteだけど3489(Classic STUN)も参考になる
Full Coneとか、Symmetric NATとか、その辺りの用語はこのRFCで登場(ただし、区分けがちょっと足りない)
続きはRFCで!
https://flic.kr/p/6n5y3kが、RFC読むと1分で、こうなる↓
そこで本トークでは特にWebRTCに関係するNAT振舞いのエッセンス(12章)を紹介(=RFC 4787をざっくりと)免責:正確性はRFC原典の用語を参照のこと
https://flic.kr/p/p1Q8WTRequirement
RFCの抜粋です
マッピングの話から
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存する
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:192.168.1.2:10000先:1.1.1.100:80
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.200:80
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:1.1.1.1:12345先:1.1.1.200:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.200:80
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:1.1.1.1:12345先:1.1.1.200:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.200:80エンドポイント(宛先)に拘らないマッピング
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.200:80元:1.1.1.1:54321先:1.1.1.200:80今回は、同じマッピングじゃない(下図だとPortが異なる)
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:8888じゃあ、同じホストの別ポートに送ると??
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:8888同じマッピング!つまり、宛先にのみ依存している。元:1.1.1.1:12345先:1.1.1.100:8888同じマッピング!つまり、宛先にのみ依存している
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:88883つ目のケースで、同じホストで違うポートに送ると???
3 種類のマッピング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:8888違うマッピングができる!元:1.1.1.1:54321先:1.1.1.100:8888
https://flic.kr/p/kSFs6bWebRTC的にイケてるのはどれでしょう?(正確には、P2P的にイケてるのはどれでしょう?)
1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存する
1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存する2と3は、STUNで自分のNATの外側のアドレス(= Server-Reflexive Address、Mapped-Address)を調べても、結局使えない…。
なのでRFCも・・・
MUSTになってる!
次
NATはパブリック側(外側)のIPアドレスを複数貯めておける。その貯めたアドレスを使う場合は、「同じ宛先には同じ送信元アドレス」を使いましょう、ということ。
ポート多重 ダメ・ゼッタイ
ポート多重(Port Overloading)NAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.3:10000先:1.1.1.200:80192.168.1.3
ポート多重(Port Overloading)NAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.3:10000先:1.1.1.200:80元:1.1.1.1:10000先:1.1.1.200:80192.168.1.3
ポート多重(Port Overloading)NAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.3:10000先:1.1.1.200:80元:1.1.1.1:10000先:1.1.1.200:80192.168.1.3同じの使っちゃうケース同じの使っちゃうケース
ちなみに帰り道(復路)は、送信元が大事NAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:10000先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:192.168.1.3:10000先:1.1.1.200:80元:1.1.1.1:10000先:1.1.1.200:80192.168.1.3NAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.100:80先:1.1.1.1:10000元:192.168.1.2:10000先:1.1.1.100:80192.168.1.3往路復路元:1.1.1.200:80先:1.1.1.1:10000このアドレスで復路を打ち分ける
もともとの送信元ポートが0-1023ならNAT後も0-1023、もともとの送信元ポートが1024-65535ならNAT後も1024-65535、といったように同じレンジを使うのがRECOMMENDED
NATするときのポート番号は、Before−>Afterで奇数偶数を同じにしようね ということ。つまり、もともとのポートが偶数なら、NAT後も偶数ということ。
マッピングの保持時間は2分以下だとダメだよ。5分以上がオススメで、自由に設定してOK。ただし、0-1023のウェルノウンポートはIANAに従ってね。
マッピング更新するトラフィックの向きはアウトバウンド(外向き)のトラフィックがMUST。インバウンドやってもいいけど、攻撃されちゃうかもね。
NATによっては、NAT前後のIPレンジが同じことも。例えば、10.0.0.0/Xから10.0.0.0/XのNATもあり得る。(ご家庭だとあんまり無いけど)そんなときはには、どっちかで対応すること:(1)内外でアドレスかぶらんように(2)アドレスがコンフリクト(衝突)してもよしなに翻訳転送してね
大事!絵!
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存する
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80まず外側に送る
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80さっきと宛先が違うホストから来ても通せる=エンドポイントに依存しない元:1.1.1.200:80先:1.1.1.1:12345
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80最初に送ったホストと違うから落ちる(=アドレスに依存している)元:1.1.1.200:80先:1.1.1.1:12345
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:1.1.1.200:80先:1.1.1.1:12345同じホストからならOK(上図だと、同じホストで異なるPort)
3 種類のフィルタリング:1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するNAT 1.1.1.1001.1.1.200192.168.1.2192.168.1.1 1.1.1.1元:1.1.1.1:12345先:1.1.1.100:80元:192.168.1.2:10000先:1.1.1.100:80元:1.1.1.200:80先:1.1.1.1:12345同じホストでも、ポートが異なるとNG(かなり厳しいフィルタリング)
https://flic.kr/p/kSFs6bRFC的にイケてるのはどれでしょう?(本日2回目)
1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するただし、RFC4787ではセキュリティを気にする場合は、2. Address DependentもRECOMMENDEDとしている。
1. Endpoint independentエンドポイントに依存しない2. Address Dependentアドレスに依存する3. Address and Port Dependentアドレスとポートに依存するWebRTC的に言えば、Mappingとの組み合わせが需要で、「3. Address and Port Dependent」でもつながるはず
ヘアピン接続もサポートしてね!
ヘアピン接続 点線のマッピングができている状態で、 PC-Aから、PC-BのNAT後のアドレスを指定して、 NAT折り返しで接続することNATPC-A192.168.1.1 1.1.1.1PC-B送信先アドレスとして外側のアドレスを指定するのがポイント
ALG(Application Level Gateway)の機能はOFFしてね(例:勝手にペイロードの中身も書き換えないでね)
好き勝手に動作を変えないでね(deterministic behaviorしてね)
(力尽きたので)そこまでWebRTCに関係しないので省略
https://flic.kr/p/4LXLZ214個おしまい!(一部ショートカット有り)
ん?そもそも
答えの前にUDPホールパンチングPC-A PC-BNAT NAT
答えの前にUDPホールパンチングPC-A PC-BNAT NATマッピングが無いので落ちる
答えの前にUDPホールパンチングPC-A PC-BNAT NATマッピングが無いので落ちるだが、PC-B向けに穴が開いた(マッピングが出来た)
答えの前にUDPホールパンチングPC-A PC-BNAT NAT次に反対向きに打つと今度は疎通OK
答えの前にUDPホールパンチングPC-A PC-BNAT NAT次に反対向きに打つと今度は疎通OKしかも、PC-A向けの穴が開くということは、
答えの前にUDPホールパンチングPC-A PC-BNAT NATいまなら一発目の向きも疎通OK
https://flic.kr/p/b6WaSP再掲:なんで通ったり落ちたりするの?
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)NAT- Endpoint Independent Mapping- Endpoint Independent FilteringNAT- Endpoint Independent Mapping- Endpoint Independent Filtering
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)NAT- Endpoint Independent Mapping- Endpoint Independent FilteringNAT- Endpoint Independent Mapping- Endpoint Independent Filteringいつなんとき誰のでも挑戦を待つ猪木的NAT
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)NAT- Endpoint Independent Mapping- Endpoint Independent FilteringNAT- Endpoint Independent Mapping- Endpoint Independent FilteringNAT- Address Dependent Mapping- Address Dependent FilteringNAT- Address Dependent Mapping- Address Dependent Filtering
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)NAT- Endpoint Independent Mapping- Endpoint Independent FilteringNAT- Endpoint Independent Mapping- Endpoint Independent FilteringNAT- Address Dependent Mapping- Address Dependent FilteringNAT- Address Dependent Mapping- Address Dependent Filtering相手が狙うべきアドレスが変わっちゃうから通らない(STUNで調べたアドレスがNG)
おまけMiscellaneous Topics
http://www.netmanias.com/en/?m=view&id=techdocs&no=6065古いRFCのNAT分類はマッピング×フィルタリングで説明できる
注今日の話はあくまでRFCの話!ホントの動作は装置依存です!
参考資料Further Study
P2P通信技術:NAT超え 〜STUNとUPnPと、時々、TURN〜http://homepage3.nifty.com/toremoro/study/voip2008/NATTraversal.pdfNAT技術者にお勧めするRFCとドラフトhttp://toremoro.tea-nifty.com/tomos_hotline/2008/06/natrfc_e2f2.htmlP2Pとファイアウォールhttp://homepage3.nifty.com/toremoro/p2p/firewall.htmlISPのNATには何が求められるか?http://www.janog.gr.jp/meeting/janog22/program/day1/data/day1-5-1_Nishitani.pdf参考資料:共存/移行技術とP2P対戦ゲームの相性https://www.janog.gr.jp/meeting/janog30/doc/janog30-v64-pre-stun-ryosato-02.pdf