Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy
Search
Kurochan
September 05, 2019
Technology
6.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy
ネットワークプログラマビリティ勉強会で発表した資料です
https://network-programmability.connpass.com/event/143534/
Kurochan
September 05, 2019
More Decks by Kurochan
See All by Kurochan
ABEMAのバグバウンティの取り組み
kurochan
1
1.2k
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
220
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
190
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.4k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
150
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
290
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
410
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
10
6.5k
Other Decks in Technology
See All in Technology
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
430
Mastering Agentic Development: Harness Engineering for Effective Coding Agents
konippi
3
520
Goodbye ShellScript, Hello File-based App
shunsock
0
960
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
160
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
0
160
おい、エージェントを使って終わらせろ
nwiizo
3
910
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
200
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
4
1.3k
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
130
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
520
今話題のAI「Jev」って何? 宇宙最速で学ぶ会
minorun365
PRO
32
21k
Harness Engineering on Rails
joelq
0
480
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
A designer walks into a library…
pauljervisheath
211
25k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Being A Developer After 40
akosma
91
590k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
830
Game over? The fight for quality and originality in the time of robots
wayneb77
1
290
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
720
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
Building AI with AI
inesmontani
PRO
1
1.2k
Are puppies a ranking factor?
jonoalderson
2
3.9k
Agile that works and the tools we love
rasmusluckow
331
22k
Transcript
ScalaでCaptive Portalを実装し カンファレンスで運⽤するまで #npstudy 株式会社サイバーエージェント AI事業本部 黒崎 優太 (@kuro_m )
黒崎 優太 • 広告配信プラットフォームの開発責任者 • 業務は Scala + AWS •
イラスト図解でよくわかる ITインフラの基礎知識 • 書きました • AWSのAZ(アベイラビリティーゾーン)とは?AZ 障害が起きたときどうすればよいのか • 最近ちょっとバズりました @kuro_m @kurochan
最近事業部名がかわりました • アドテク本部 → AI事業本部
開発している広告システム概況 • ⼊札リクエスト量: 数⼗万リクエスト / 秒 • ⼊札トラフィック: 約8Gbps •
レスポンスタイム: 100ms以内 • ログの量: 数TB / Day(圧縮状態) ຊͷೖࡳϦΫΤετඵ ຊΞϝϦΧͷϨεϙϯελΠϜ NTFD
最近⾒ていて楽しい画⾯ • オートスケーリング系のメトリクス
Contents • Captive Portal x Scala • Captive Portalとは •
実装, デプロイ, 運⽤ • Wi-Fi in ScalaMatsuri • 設計, 検証, 構築, 運⽤ • トラブル
Captive Portal x Scala
Captive Portalとは
Captive Portal • free Wi-Fiの認証/認可のシステム • 駅や商業施設で⾒かけたことがあると思います
Captive Portalを検知するには • Captive Portal Detection • Captive Portalを検知しポップアップ画⾯を出す仕組み •
Wi-Fi接続時に意図しないHTTPリダイレクトを検知する • iOS/macOS and Android, Windows, Linux, etc... • 例: • Wi-Fi接続時にバックグラウンドで以下のようなURLを叩く http://check.example.com implicitly. • 意図した応答があればインターネットにつながっていると判定し、なにもしない • HTTP Foundを検知するとCaptive Portalだと判断する
今回作ったもの
今回作ったもの • Scala Matsuriのfree Wi-Fiに初めて接続した時に Captive Portal画⾯を表⽰する • 認証/認可は超簡易的(参加者はRegisterボタンを押せば繋がる) ポップアップを表⽰するのみ
• Scala MatsuriなのでScalaをネットワークに組み込みたかった
実装
Captive Portalの実装⽅法 • 認証済ユーザ: 全てのパケットを通過させる • 認証していないユーザ: 全てのHTTP通信を Captive Portalにリダイレクトさせる
• Scalaが使いたいが、Scalaで全て実装するのは厳しいので OpenFlow + Scalaを選択
OpenFlow • Software Defined Networkの技術のひとつ • Control PlaneとData Planeが分離できる •
今回はScalaでControl Planeを実装する • OpenFlowのControl Planeの既存の 実装の例 • Java: Floodlight, Ruby: Trema, Python: Ryu https://qiita.com/ttsubo/items/ addd c d adfcf
OpenFlow Controllerを実装する • OpenFlowのメッセージのシリアライズ/デシリアライズの部分に Floodlightを利⽤ • TCPのコネクションとストリーミング部分はnettyを使う • その他の部分はScalaで実装 Scala
Application OpenFlow Switch OpenFlow Message
Performance Test • Simple Controller: packet-inしたらpacket-outするだけ • C . xlarge(
Core GB) • Mbps • 負荷分散していないので1コアしか使えていない状態 • パフォーマンス的には⼗分だった • 全パケットをScalaで処理したテスト • 実際にはフローはキャッシュされる • キャッシュヒット率が90%なら Gbpsくらいは出せそう Scala Application OpenFlow Message The Internet
構成 • OpenFlow Gateway • netty • OpenFlow Messageのシリアライズ/デシリアライズ •
HTTP Server • Akka HTTP • CaptivePortalのWebサーバ • Captive Portal Controller • Akka Streams • パケット処理とOpenFlowのフローの⽣成
• OpenFlow Switchとの通信 • メッセージのシリアライズ/デシリアライズ OpenFlow Gateway
HTTP Server • Captive Portalのwebサーバ • 認可したユーザのIPアドレスをRedisに書き込む
Captive Portal Controller • 認可済ユーザ: パケットを全て通す • 同様なフローをスイッチに書き込む • 未認可ユーザ:
DNSパケットは 全て偽DNSサーバに転送 • 偽DNSサーバは常に同じIPを返す • Akka Streamsで処理を書いた • パケット処理はストリーミング処理 そのものなので便利でした(後述)
Akka • Actorモデルを実装したScalaのフレームワーク • 分散型で並⾏性を持ち、耐障害性を備えている("let it crash") • ⾮同期でノンブロッキングかつ⾼性能なメッセージ駆動の アプリケーションが開発できる
Akka Streams w IUUQTEPDBLLBJPEPDTBLLBTDBMBTUSFBNTUSFBNDVTUPNJ[FIUNM
Akka Streams w IUUQTEPDBLLBJPEPDTBLLBTDBMBTUSFBNTUSFBNDVTUPNJ[FIUNM • 下流からpullされたらpushする、の連鎖でデータが受け渡される • 上流が下流にデータを送りつづけて下流が溢れるという事態が発⽣しない • =>
これが背圧制御 (back-pressure) • back-pressureの他にもdrop new, drop tail, drop buffer, failなどの戦略が選択できる
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In Authorized!
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In Authorized! Packet Out
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In Authorized! Packet Out Flow Cached
Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In Authorized! Packet Out Flow Cached
Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User
OpenFlow Switch Flow Cached
Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User
OpenFlow Switch Flow Cached
Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User
OpenFlow Switch Flow Cached
Case: 未認可ユーザ Captive Portal Server The Internet User OpenFlow Switch
Case: 未認可ユーザ Captive Portal Server The Internet User DNS packet
OpenFlow Switch
Case: 未認可ユーザ Captive Portal Server The Internet User Packet In
OpenFlow Switch
Case: 未認可ユーザ Captive Portal Server The Internet User Packet In
Unauthorized! OpenFlow Switch
Case: 未認可ユーザ Captive Portal Server The Internet User Packet In
Unauthorized! DNSύέοτͷ͖ઌΛ ِͷDNSαʔόʹॻ͖͑Δ OpenFlow Switch
Case: 未認可ユーザ Captive Portal Server The Internet User Packet In
Unauthorized! Packet Out OpenFlow Switch DNSύέοτͷ͖ઌΛ ِͷDNSαʔόʹॻ͖͑Δ
Case: 未認可ユーザ Captive Portal Server The Internet User Packet In
Unauthorized! Packet Out ِDNS Server OpenFlow Switch DNSύέοτͷ͖ઌΛ ِͷDNSαʔόʹॻ͖͑Δ
Case: 未認可ユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In Unauthorized! Packet Out Fake DNS Server ِDNS response DNSύέοτͷ͖ઌΛ ِͷDNSαʔόʹॻ͖͑Δ
Case: 未認可ユーザ Captive Portal Server The Internet User OpenFlow Switch
Packet In Unauthorized! Packet Out Fake DNS Server Captive PortalʹϦμΠϨΫτ DNSύέοτͷ͖ઌΛ ِͷDNSαʔόʹॻ͖͑Δ ِDNS response
デプロイ
データセンタのサーバにデプロイ • Linux Virtual Machine: Core GB (CPU, Memoryともに余った) •
データセンタにデプロイした理由は後述
運⽤
無事動作しました • ⼀部動かない端末が... • Samsung GalaxyシリーズでのみCaptive Portal検知ができず • 何かしらのHTTPのサイト (e.g.
http://neverssl.com ) を開いてもらうことでリダイレクトしてもらった • 約800ユーザが認証してくれました!
WiFi
Scala Matsuri Wi-Fi Team • サイバーエージェントのエンジニアで構築しました
準備
構成 • Home NOC Operator's Group(AS )の データセンタに接続 • データセンタとの間はフレッツのNGN折返し通信
• ⾼速な回線を提供したかった • やってみたかった The Internet AS59105 Scala Matsuri venue
Scala Matsuriの会場 • Wi-Fi Access Points x • Cisco Aironet
x • Cisco Meraki MR x • PoE Switching Hub x • Router x • NEC IX • Server x • LAN Cable • m
会場下⾒
社内検証環境 • 普段はコードを書くのが専⾨なので調べながら構築しました
配線の設計 • 当⽇しか構築ができないので事前に ほぼ準備を済ませました
LANケーブルを700m⽤意する • 50本くらい⼿作りしました • 買ったほうが(⼈のリソース含め)コスパがよかったかもしれない…?
構築
初⽇の消費カロリー
Entrance Hall( F)
Foyer( F)
Conference Hall ( F, F)
Media Hall ( F)
Conference Room ( F)
運⽤
監視 • トラフィック, APの死活監視, 外形監視, クライアント数等 • Datadog • ping,
DHCP, DNS • Zabbix + Grafana • SNMP
Traffic • 828クライアントが接続 • 1⽇で下り206GB, 上り64GB程度
Wi-Fi Clients
トラブル
Day
Day • 初⽇は4Fしか使わなかったので⼤丈夫だったはず…
Day • Day used only meeting room of F, so
it was OK maybe... 修復
Day (朝)
Day (朝) •
Day (朝) •
Day (朝) • どうしてこうなった
まとめ • Captive PortalをScalaで実装し、3⽇間無停⽌で運⽤できました! • コードは公開しています • https://github.com/kurochan/scaptive-portal • 快適なWi-Fiを提供することにも成功しました