Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy
Search
Kurochan
September 05, 2019
Technology
1
6.4k
ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy
ネットワークプログラマビリティ勉強会で発表した資料です
https://network-programmability.connpass.com/event/143534/
Kurochan
September 05, 2019
Tweet
Share
More Decks by Kurochan
See All by Kurochan
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
100
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
80
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
170
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
320
入門 電気通信事業者
kurochan
13
5.7k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6k
GoでTCP Proxyを実装してみよう
kurochan
1
1.3k
サイバーエージェントの広告配信におけるIPoEトラフィックの概況
kurochan
0
540
Other Decks in Technology
See All in Technology
AR Guitar: Expanding Guitar Performance from a Live House to Urban Space
ekito_station
0
240
Building Serverless AI Memory with Mastra × AWS
vvatanabe
0
600
AI駆動開発の実践とその未来
eltociear
2
500
TED_modeki_共創ラボ_20251203.pdf
iotcomjpadmin
0
150
Knowledge Work の AI Backend
kworkdev
PRO
0
280
Microsoft Agent Frameworkの可観測性
tomokusaba
1
110
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
New Relic 1 年生の振り返りと Cloud Cost Intelligence について #NRUG
play_inc
0
240
日本の AI 開発と世界の潮流 / GenAI Development in Japan
hariby
1
490
アプリにAIを正しく組み込むための アーキテクチャ── 国産LLMの現実と実践
kohju
0
230
ハッカソンから社内プロダクトへ AIエージェント「ko☆shi」開発で学んだ4つの重要要素
sonoda_mj
6
1.7k
[Neurogica] 採用ポジション/ Recruitment Position
neurogica
1
130
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
410
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
340
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
200
Testing 201, or: Great Expectations
jmmastey
46
7.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
82
Design in an AI World
tapps
0
100
Between Models and Reality
mayunak
0
150
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
980
Docker and Python
trallard
47
3.7k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
2
3.8k
GitHub's CSS Performance
jonrohan
1032
470k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
100
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を提供することにも成功しました