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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
1k
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
160
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
150
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.3k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
110
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
260
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
380
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6.3k
Other Decks in Technology
See All in Technology
大量データに対しても、生成AIを用いてリーズナブルにデータ加工をしたい!Databricksのai_queryについて調べてみた
kamoshika
1
220
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
480
AI Driven AI Governance
pict3
0
490
SRE Next 2026 何でも屋からの脱却
bto
0
1k
壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの
k_adachi_01
1
420
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
160
Kaggleで成長するために意識したこと
prgckwb
2
420
しぶいSRE: サーバから見えない障害にどう向き合うか。ラストワンマイルのデバッグ実践 / Shibui SRE
kanny
13
6.6k
世界、断片、モデル。そして理解
ardbeg1958
1
130
関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pure at the Core, Effects at the Edge: Bringing Functional Thinking into TypeScript
kaminashi
2
130
Gen3R: 3D Scene Generation Meets Feed-Forward Reconstruction
spatial_ai_network
0
130
ヘルスケア領域における AI 活用と その安全性担保のための取り組み (Leveraging AI in Healthcare and Our Efforts to Ensure Its Safety) - Google I/O Extended Tokyo 2026, July 11, 2026
zettaittenani
0
430
Featured
See All Featured
For a Future-Friendly Web
brad_frost
183
10k
ラッコキーワード サービス紹介資料
rakko
1
3.9M
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
Product Roadmaps are Hard
iamctodd
55
12k
Agile that works and the tools we love
rasmusluckow
331
22k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
350
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
Odyssey Design
rkendrick25
PRO
2
730
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.1k
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Ͱ͖Δͷ͔ઓ • Ϋϥυͷཁૉٕज़ͷͻͱͭͷཧղ͕ਂ·Δ͔͠Εͳ͍