SlideShare a Scribd company logo
NAT越えを雑に試す
kawasaki.rb #51 LT大会
@kechako
自己紹介
• 名前 秋山 亮介(@kechako)
• お仕事 株式会社SpiralMind 研究員
• 好きな言語 Go、Ruby、C#
• ブキ ラピッドブラスター
最近極稀に……
スプラトゥーン2やってると
NAT越えのエラーが出る
NAT越えか……
やったことないな
試してみよう!
(特に目的はありません)
NAT Traversal
• NAT機器を用いた複数のホスト間のネットワーク接続を確立するためのア
ルゴリズム
• 世の中のNATは機能が標準化されていない
• 環境に合ったNAT Traversal技術を選択する
NAT Traversal
NAT NAT
Internet
NAT 超えのための技術
• UPnP
• STUN
• TURN
• ICE
• etc…
UPnP
• Universal Plug and Play
• ルーターに、WAN側からの接続に対するポートマッピングを依頼する
• 二重ルーター構成でうまくいかない
STUN
• Session Traversal Utilities for NAT
• RFC5389にて規定
• STUNサーバーにアクセスしてグローバルIP、ポートを取得し、UDPパケ
ットを送りつける
• UDP接続
STUN
NAT
STUN Server
NAT
Local IP X
Port Y
Global IP X’
Port Y’
Global IP X’
Port Y’
にUDPパケット投げる
TURN
• Traversal Using Relay around NAT
• RF5766で規定
• TURNサーバー経由で通信する
• TCPおよびUDP接続
TURN
NAT TURN Server NAT
ICE
• Interactive Connectivity Establishment
• IETFのMMUSICワーキンググループによって開発
• RFC5245にて公開
• WebRTC で使われているらしい
今回やってみたこと
• GoでSTUN使ってUDP通信
• NAT内でサーバー立てる
• 別のネットワークからUDPでパケット送る
• パケット受信できれば成功
• https://github.com/kechako/go-stun-test
結果
• ドトールのWi-Fiではうまくいった
• お家帰って試したら駄目だった
• ポータブルWi-Fiでも駄目だった
Server
package main
import (
"encoding/hex"
"flag"
"fmt"
"log"
"net"
"os"
"os/signal"
"github.com/ccding/go-stun/stun"
)
func main() {
var server string
flag.StringVar(&server, "s", "", "Server address")
flag.Parse()
Server
client := stun.NewClient()
if server != "" {
client.SetServerAddr(server)
}
nat, host, err := client.Discover()
if err != nil {
log.Fatal(err)
}
fmt.Printf("NAT Type : %sn", nat)
fmt.Printf("Host : %sn", host)
Server
addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", host.Port()))
if err != nil {
log.Fatal(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
Server
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt)
go func() {
buf := make([]byte, 1024)
LOOP:
for {
size, addr, err := conn.ReadFromUDP(buf)
if err != nil {
log.Print(err)
break LOOP
}
fmt.Printf("Addr : %vn", addr)
fmt.Println(hex.Dump(buf[:size]))
}
}()
<-ch
}
Client
package main
import (
"fmt"
"io"
"log"
"net"
"os"
)
func main() {
if len(os.Args) != 2 {
return
}
addr := os.Args[1]
Client
conn, err := net.Dial("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
for {
fmt.Print("> ")
var msg string
_, err := fmt.Scanf("%sn", &msg)
if err != nil {
log.Print(err)
break
}
if msg == "exit" {
break
}
io.WriteString(conn, msg)
}
}
まとめ
• STUNだけではやっぱりダメ
• いろいろなネットワーク環境に対応させるためにはとても苦労しそう
• 奥が深い
• WebRTCも試してみたい

More Related Content

Similar to NAT越えを雑に試す

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews, Inc.
 
node.js 開発のためのお手軽サーバ構築について(仮)
node.js 開発のためのお手軽サーバ構築について(仮)node.js 開発のためのお手軽サーバ構築について(仮)
node.js 開発のためのお手軽サーバ構築について(仮)
Toru Tamura
 
Internet Week 2018 知っておくべきIPv6とセキュリティの話
Internet Week 2018 知っておくべきIPv6とセキュリティの話Internet Week 2018 知っておくべきIPv6とセキュリティの話
Internet Week 2018 知っておくべきIPv6とセキュリティの話
Akira Nakagawa
 
オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-
オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-
オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-
Takashi Sogabe
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-mainShotaro Uchida
 
自宅ラック勉強会Vol4 #routerboard
自宅ラック勉強会Vol4 #routerboard自宅ラック勉強会Vol4 #routerboard
自宅ラック勉強会Vol4 #routerboard
kometch H
 
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
VirtualTech Japan Inc.
 
最近遊んだLinuxボードたち
最近遊んだLinuxボードたち最近遊んだLinuxボードたち
最近遊んだLinuxボードたち
t n
 
545人のインフラを支えたNOCチーム!
545人のインフラを支えたNOCチーム!545人のインフラを支えたNOCチーム!
545人のインフラを支えたNOCチーム!
Masayuki Kobayashi
 
ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...
ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...
ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...
MapR Technologies Japan
 
DEFCON21×S2 REPORT
DEFCON21×S2 REPORTDEFCON21×S2 REPORT
DEFCON21×S2 REPORT
Takahiro Yoshimura
 
さくらのクラウドでVyOS使ってみた
さくらのクラウドでVyOS使ってみたさくらのクラウドでVyOS使ってみた
さくらのクラウドでVyOS使ってみた
SAKURA Internet Inc.
 
Kansai mrb gr_sakura
Kansai mrb gr_sakuraKansai mrb gr_sakura
Kansai mrb gr_sakura
Kosuga Masakatsu
 
NTPとうるう秒
NTPとうるう秒NTPとうるう秒
NTPとうるう秒
真乙 九龍
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
Koichi Sakata
 
OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾外道 父
 
WebRTCとSFU
WebRTCとSFUWebRTCとSFU
WebRTCとSFU
Saki Homma
 
強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい
強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい
強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい
Takuma Wakamori
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Go Sueyoshi (a.k.a sue445)
 
PreadNet
PreadNetPreadNet
PreadNet
Junya Kuwada
 

Similar to NAT越えを雑に試す (20)

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
node.js 開発のためのお手軽サーバ構築について(仮)
node.js 開発のためのお手軽サーバ構築について(仮)node.js 開発のためのお手軽サーバ構築について(仮)
node.js 開発のためのお手軽サーバ構築について(仮)
 
Internet Week 2018 知っておくべきIPv6とセキュリティの話
Internet Week 2018 知っておくべきIPv6とセキュリティの話Internet Week 2018 知っておくべきIPv6とセキュリティの話
Internet Week 2018 知っておくべきIPv6とセキュリティの話
 
オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-
オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-
オーバーレイネットワークで実現するプライベートクラウド -OpenStack/OpenContrailを用いたプライベートクラウドの構築及び評価計画のご紹介-
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-main
 
自宅ラック勉強会Vol4 #routerboard
自宅ラック勉強会Vol4 #routerboard自宅ラック勉強会Vol4 #routerboard
自宅ラック勉強会Vol4 #routerboard
 
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
 
最近遊んだLinuxボードたち
最近遊んだLinuxボードたち最近遊んだLinuxボードたち
最近遊んだLinuxボードたち
 
545人のインフラを支えたNOCチーム!
545人のインフラを支えたNOCチーム!545人のインフラを支えたNOCチーム!
545人のインフラを支えたNOCチーム!
 
ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...
ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...
ストリーミングアーキテクチャ: State から Flow へ - 2016/02/08 Hadoop / Spark Conference Japan ...
 
DEFCON21×S2 REPORT
DEFCON21×S2 REPORTDEFCON21×S2 REPORT
DEFCON21×S2 REPORT
 
さくらのクラウドでVyOS使ってみた
さくらのクラウドでVyOS使ってみたさくらのクラウドでVyOS使ってみた
さくらのクラウドでVyOS使ってみた
 
Kansai mrb gr_sakura
Kansai mrb gr_sakuraKansai mrb gr_sakura
Kansai mrb gr_sakura
 
NTPとうるう秒
NTPとうるう秒NTPとうるう秒
NTPとうるう秒
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
 
OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾
 
WebRTCとSFU
WebRTCとSFUWebRTCとSFU
WebRTCとSFU
 
強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい
強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい
強化学習初心者が強化学習でニューラルネットワークの設計を自動化してみたい
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
 
PreadNet
PreadNetPreadNet
PreadNet
 

NAT越えを雑に試す