Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Implementing a Captive Portal in Scala
Search
Kurochan
June 19, 2019
Technology
4.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Implementing a Captive Portal in Scala
社内勉強会で話したもの
Kurochan
June 19, 2019
More Decks by Kurochan
See All by Kurochan
ABEMAのバグバウンティの取り組み
kurochan
1
1.1k
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
190
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
170
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.3k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
140
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
280
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
410
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6.4k
Other Decks in Technology
See All in Technology
AWSとGitHub Actionsの責任境界と 組織で安全に使用する取り組み
nealle
1
240
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
0
590
VPCでもFloatingIPを使いたいんだ
y_kotani
1
140
Hub & Spoke 環境のネットワークルーティングを分解してみる
tsuyataku
1
490
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
130
みてねにおけるAI-DLC導入活動とAIドリブン開発の現在地/JAWS-UG AI-DLC #2
isaoshimizu
2
320
分割40%キーボードにスムーズに入門するには
hoto17296
1
210
AIエージェントを雇う前に決める5つのこと
knishioka
1
120
AI駆動開発をチームに根付かせる - 「1行も書かない」チームがHarnessを育てた1年 -
kenichirokimura
6
3.6k
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
3
840
Genie Code ワークショップ 応用編 / Genie-Code-Workshop-advanced
databricksjapan
PRO
0
210
サービス内で複数のOP・ASを連鎖させる(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
420
Featured
See All Featured
Designing for Performance
lara
611
70k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
230
The Limits of Empathy - UXLibs8
cassininazir
1
620
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
エンジニアに許された特別な時間の終わり
watany
108
250k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
360
GitHub's CSS Performance
jonrohan
1033
470k
Navigating Weather and Climate Data
rabernat
0
500
Transcript
Implementing a Captive Portal in Scala @kuro_m88
ScalaͰύέοτΛॻ͖͍͑ͨ • ScalaͰύέοτॲཧ͕ͨ͘͠ͳͬͨ • ཧ༝ޙड़͠·͢ • ScalaͰݱ࣮తʹύέοτॲཧ͢Δํ๏͋Δͷ͔ʁ • ͲͷϨΠϠ·Ͱૢ࡞Ͱ͖Δͷ͔
ScalaͰύέοτΛಈతʹॻ͖͑Δํ๏ • libpcap? • Ͱ͖ͳ͘ͳ͍͚Ͳ͠ΜͲͦ͏ɺ͏ͪΐͬͱָ͕͍ͨ͠ • ϧʔςΟϯάϓϩτίϧʁ • ѼઌͰϧʔςΟϯάͰ͖Δ͕ɺૹ৴ݩͰϧʔςΟϯάͰ͖ͳ͍ •
Policy Based Routing͕͋Δ͕ɺ੍ޚ͕Ή͔ͣͦ͠͏ • iptables? • Ͱ͖ͳ͘ͳͦ͞͏ɺScalaͰ੍ޚ͢ΔͷͲ͏͢ΔΜ͚ͩͬ… • Segment Routing? • ࠷৽ٕज़?ա͗ͯͲ͜·Ͱ͑Δͷ͔Α͘Θ͔Βͳ͍… • OpenFlow? • ͳΜ͔ฉ͍ͨ͜ͱ͋Δɺ͍͚ͦ͏ͳؾ͕͖ͯͨ͠
OpenFlow • Software Defined Network(ͷͨΊͷ௨৴ϓϩτίϧ) • SDN: Ϋϥυͷཁૉٕज़ͱͯͯ͠͞Ε͍ͯΔ(ͨ?) • ίϯτϩʔϧϓϨʔϯͱσʔλϓϨʔϯΛ
• ίϯτϩʔϧϓϨʔϯ͕ࣗ༝ʹ࣮Ͱ͖Δ • 2011ʹversion 1.1͕ग़ͨ + https://www.nic.ad.jp/ja/newsletter/No52/0800.html
OpenFlowͷ֓ཁ • 5ͰΘ͔Δɺ͜Ε·ͰͷSDNಈ • https://qiita.com/ttsubo/items/9062addd7c24d5adfcf3 • Ͳ͏ॲཧ͍͍͔ͯ͠Θ͔Βͳ͍ύέοτ => ίϯτϩʔϥʔʹసૹ •
ίϯτϩʔϥʔ => ड͚औͬͨύέοτͷॲཧΛεΠονʹࢦࣔ • ίϯτϩʔϥʔ => ॲཧͷύλʔϯΛ ༧ΊεΠονʹڭ͓͑ͯ͘ (ίϯτϩʔϥʹసૹ͞Εͳ͍ͷͰߴ)
OpenFlowίϯτϩʔϥʔͷطଘͷ࣮ • Python: Ryu • Ruby: Trema • Java: Floodlight
• Java: OpenDaylight • ࠓճϑϨʔϜϫʔΫΛΘͳ͍Ͱ ࣗલͰ࣮ͯ͠ΈΔ • OpenDaylightͷϝοηʔδͷύʔα͚ͩطଘ࣮Λྲྀ༻
OpenFlowίϯτϩʔϥʔΛScalaͰ࣮͢Δ • HTTPͷ௨৴͚ͩΛNAT͢Δ(ߦ͖)
OpenFlowίϯτϩʔϥʔΛScalaͰ࣮͢Δ • HTTPͷ௨৴͚ͩΛNAT͢Δ(ؼΓ)
OpenFlowίϯτϩʔϥʔΛScalaͰ࣮͢Δ • HTTPͷ௨৴͕͖ͨΒίϯτϩʔϥʔʹసૹ͢Δ
༧උ࣮ݧ • ScalaͰͲΕ͘Β͍ύέοτΛॲཧͰ͖Δͷ͔࣮ݧͯ͠ΈΔ • Packet in => Packet out ͢Δ͚ͩͷίϯτϩʔϥʔΛ
netty + Akka StreamsͰ࣮ • OpenFlowController + Open vSwitch: c5.2xlarge • iperf3Ͱଌఆ
༧උ࣮ݧ݁Ռ • 200Mbps, 150K packets / sec͘Β͍సૹͰ͖ͨ • ύέοτͷԟ෮Ԇ2~3ms͘Β͍ •
࠷େͷసૹੑೳ͕200Mbpsఔͱ͍͏͜ͱ͕Θ͔ͬͨ
༧උ࣮ݧ݁Ռ • Կॲཧ͠ͳ͍࣌ͷ࠷େͷసૹੑೳ͕200MbpsఔͰͳ͍ͷ͔ʁ • ͳ͍ • ࠓճͯ͢ͷύέοτΛίϯτϩʔϥʔܦ༝ʹ͕ͨ͠ɺϢʔβ͝ͱͷύ έοτͷॲཧํ๏ΛεΠονʹهԱ͓͚ͤͯ͞ίϯτϩʔϥʔʹ௨৴͕ ͘Δͷॳճͷ1ύέοτ͚ͩɺ͋ͱεΠονͷసૹੑೳ •
࣮ݧͰOpen vSwitch(ԾεΠονΛར༻)ɺϓϩτίϧʹޓੑ͕͋Δ ͷͰཧεΠονಉ༷ʹίϯτϩʔϧՄೳ
ͳΜͰScalaͰύέοτΛॻ͖͑ͨ͘ͳͬͨͷ͔ • Scala MatsuriͷWi-FiεϙϯαʔΛ͠·͢ʂ • ۀͩͱׂʹ߹Θͳ͔ͬͨܦҢΛฉ͍ͨͷͰɺͬͯΈ͍ͨਓୡͰΔ • Wi-Fiʹෆຬ͕ग़͍ͯͨΒ͍͠ͷͰɺྔͰԥΓ͍ͨʂʂ • ͬͯΈ͍ͨ͜ͱΛΔ
• PublicΫϥυΛΘͣʹࣗ࡞͢Δ • ΠϯλʔωοτଓΛ Home NOC Operator's Groupʹ ఏڙ͍ͯͨͩ͘͠
ͳΜͰScalaͰύέοτΛॻ͖͑ͨ͘ͳͬͨͷ͔ • Scala MatsuriͳͷͰΠϯϑϥʹScalaΛऔΓೖΕ͍ͨ • Scalaཁૉ͕ͪΐͬͱͰೖͬͯΕਖ਼ͳΜͰ͍͍ • LT/ΞϯΧϯϑΝϨϯεͷωλʹͳΓͦ͏ͳ͜ͱΛΓ͍ͨ • Captive
PortalΛ࡞ͬͯΈΔ…ʁ
Captive Portalͱʁ • Free Wi-Fiʹଓ͢Δͱ͖ʹॳճʹϒϥβભҠ͢Δͭ • نͱ͔ʹಉҙ͢ΔϘλϯԡ͢ͱΠϯλʔωοτʹͭͳ͕Δ (߹ʹΑͬͯೝূ) • ͜ΕΛScalaͰ࣮ͯ͠ΈΔ
Captive Portal͕Ͳ͏ͬͨΒ࣮ݱͰ͖Δͷ͔ • ࣮ࡍͷΈΑ͘Βͳ͍ͷͰ૾Ͱ࣮͢Δ • ͨͿΜҎԼ͕࣮ݱͰ͖Ε͍͍ • ೝՄ͍ͯ͠ͳ͍(IP)͔Βͷhttp௨৴ڧ੍ϦμΠϨΫτ • ೝՄ͍ͯ͠Δ(IP)͔Βͷ௨৴Πϯλʔωοτʹ௨͢
• ಛఆͷwebϖʔδͰϘλϯΛԡ͢ͱೝՄ͢Δ
Captive Portalը໘ʹભҠͤ͞ΔΈ • Captive Portal Detection • OS͕Captive PortalΛݕग़͢ΔͨΊʹཪଆͰҎԼͷURLΛͨͨ͘ •
Android: http://connectivitycheck.gstatic.com/generate_204 • iOS/Mac: http://captive.apple.com/hotspot-detect.html • Windows: http://www.msftncsi.com/ncsi.txt • ظ͞ΕΔϨεϙϯε͕ฦ͖ͬͯͨ => Πϯλʔωοτଓ͕͋Δ • Ϩεϙϯε͕͔͑ͬͯ͜ͳ͍ => Πϯλʔωοτଓ͕ͳ͍ • ϦμΠϨΫτ͞Εͨ => Captive PortalΛݕ
Captive PortalΛ࣮͢Δʹ • ૹ৴ݩͷೝՄ/ະೝՄ IPʹԠͯ͡ύέοτΛॻ͖͑Δඞཁ͕͋Δ • ૹ৴ݩ͕ೝՄࡁͩͬͨ߹ Α͏ͦ͜ը໘(ೝূ) Πϯλʔωοτ Captive
Portal (webαʔό) Ϣʔβ OpenFlow Switch
Captive PortalΛ࣮͢Δʹ • ૹ৴ݩͷೝՄ/ະೝՄ IPʹԠͯ͡ύέοτΛॻ͖͑Δඞཁ͕͋Δ • ૹ৴ݩ͕ະೝՄͩͬͨ߹ Α͏ͦ͜ը໘(ೝূ) Πϯλʔωοτ Captive
Portal (webαʔό) Ϣʔβ OpenFlow Switch ✗
Implementing a Captive Portal in Scala • server: netty •
controller: Akka Streams • http: Akka Http OpenFlow Switch server http controller
·ͱΊ • Scala MatsuriͰScalaΛΠϯϑϥʹΈࠐΜͰΈΑ͏ͱ͍ͯ͠Δ • ؒʹ߹͏ͷ͔·ͩΘ͔Βͳ͍ • ಉ࣌ଓ1000ΫϥΠΞϯτنͷͱ͜ΖͰॳ৺ऀ͕SDNͰ͖Δͷ͔ઓ • Ϋϥυͷཁૉٕज़ͷͻͱͭͷཧղ͕ਂ·Δ͔͠Εͳ͍