webrtcの裏側にあるnatの話 - a talk on nat behind webrtc
DESCRIPTION
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:80TRANSCRIPT
WebRTCの裏側にあるNATの話- A talk on NAT behind WebRTC -
@iwashi86
2014/11/26 WebRTC Meetup Tokyo #5
●AttributeName Yoshimasa Iwase
@iwashi86web iwashi.co
●Work
・Web Engineer@NTT Com
・HTML5 Experts.jp Editor
●Recently
・HTML5 Experts.jpにてWebRTC特集掲載!
本題今日はNATの話
(WebRTCなので特にUDPのNAT)
https://flic.kr/p/4HKJE1
なぜ、いまさらNAT?
Internet
NAT NAT
WebRTCのクライアントはNAT配下に居ることが多い
Internet
NAT NAT
クライアント達は何の工夫も無しには直接通信できない・・・
Dropped…
Internet
NAT NAT
そこで、WebRTCでは主にSTUN※を使って
なんとか穴あけしている
Reached!
STUN STUN
※UDP Hole Punchも
Internet
NAT NAT
でも、ダメなケースもある…(その場合はTURNで中継)
STUN STUN
Dropped…
そもそも
https://flic.kr/p/b6WaSP
なんで通ったり落ちたりするの?
https://flic.kr/p/oH1mPu
気になる!(技術者的な意味で)
N
A
T
そんなあなたに良い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/p1Q8WT
Requirement
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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.168.1.1 1.1.1.1
3 種類のマッピング:1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.168.1.1 1.1.1.1
3 種類のマッピング:1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.168.1.1 1.1.1.1
3 種類のマッピング:1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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つ目のケースで、同じホストで違うポートに送ると???
3 種類のマッピング:1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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/kSFs6b
WebRTC的にイケてるのはどれでしょう?(正確には、P2P的にイケてるのはどれでしょう?)
1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
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)
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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:80
192.168.1.3
ポート多重(Port Overloading)
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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:80
192.168.1.3
ポート多重(Port Overloading)
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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:80
192.168.1.3
同じの使っちゃうケース同じの使っちゃうケース
ちなみに帰り道(復路)は、送信元が大事
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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:80
192.168.1.3
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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:80
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.168.1.1 1.1.1.1
3 種類のフィルタリング:1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.168.1.1 1.1.1.1
3 種類のフィルタリング:1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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
アドレスとポートに依存する
NAT1.1.1.100
1.1.1.200
192.168.1.2
192.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/kSFs6b
RFC的にイケてるのはどれでしょう?
(本日2回目)
1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
1. Endpoint independent
エンドポイントに依存しない2. Address Dependent
アドレスに依存する3. Address and Port Dependent
アドレスとポートに依存する
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-A
192.168.1.1 1.1.1.1
PC-B
送信先アドレスとして外側のアドレスを指定する
のがポイント
ALG(Application Level Gateway)の機能はOFFしてね(例:勝手にペイロードの中身も書き換えないでね)
好き勝手に動作を変えないでね(deterministic behaviorしてね)
(力尽きたので)そこまでWebRTCに関係しないので
省略
https://flic.kr/p/4LXLZ2
14個おしまい!(一部ショートカット有り)
ん?そもそも
https://flic.kr/p/b6WaSP
なんで通ったり落ちたりするの?
答えの前にUDPホールパンチング
PC-A PC-B
NAT NAT
答えの前にUDPホールパンチング
PC-A PC-B
NAT NAT
マッピングが無いので落ちる
答えの前にUDPホールパンチング
PC-A PC-B
NAT NAT
マッピングが無いので落ちる
だが、PC-B向けに穴が開いた(マッピングが出来た)
答えの前にUDPホールパンチング
PC-A PC-B
NAT NAT次に反対向きに打つと今度は疎通OK
答えの前にUDPホールパンチング
PC-A PC-B
NAT NAT次に反対向きに打つと今度は疎通OK
しかも、PC-A
向けの穴が開くということは、
答えの前にUDPホールパンチング
PC-A PC-B
NAT NATいまなら
一発目の向きも疎通OK
https://flic.kr/p/b6WaSP
再掲:なんで通ったり落ちたりするの?
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filteringいつなんとき
誰のでも挑戦を待つ猪木的NAT
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Address Dependent Mapping
- Address Dependent Filtering
NAT
- Address Dependent Mapping
- Address Dependent Filtering
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Address Dependent Mapping
- Address Dependent Filtering
NAT
- Address Dependent Mapping
- Address Dependent Filtering
Mapping × Filtering の特性で決まる(特にUDPホールパンチングで通す場合)
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Endpoint Independent Mapping
- Endpoint Independent Filtering
NAT
- Address Dependent Mapping
- Address Dependent Filtering
NAT
- 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.p
df
NAT技術者にお勧めするRFCとドラフトhttp://toremoro.tea-nifty.com/tomos_hotline/2008/06/natrfc_e2f2.html
P2Pとファイアウォールhttp://homepage3.nifty.com/toremoro/p2p/firewall.html
ISPの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