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
ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy
Search
Kurochan
September 05, 2019
Technology
1
6.3k
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
AWS Elemental MediaPackageと格闘🤼
kurochan
2
50
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
52
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
260
入門 電気通信事業者
kurochan
13
5.6k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
5.8k
GoでTCP Proxyを実装してみよう
kurochan
1
1.2k
サイバーエージェントの広告配信におけるIPoEトラフィックの概況
kurochan
0
500
スケールするというのはどういうことなのか
kurochan
14
5k
サイバーエージェントのGitHub Copilot導入と 開発生産性
kurochan
52
47k
Other Decks in Technology
See All in Technology
about #74462 go/token#FileSet
tomtwinkle
1
510
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
5.5k
Optuna DashboardにおけるPLaMo2連携機能の紹介 / PFN LLM セミナー
pfn
PRO
2
920
o11yで育てる、強い内製開発組織
_awache
3
130
生成AI_その前_に_マルチクラウド時代の信頼できるデータを支えるSnowflakeメタデータ活用術.pdf
cm_mikami
0
120
バイブコーディングと継続的デプロイメント
nwiizo
2
480
Adminaで実現するISMS/SOC2運用の効率化 〜 アカウント管理編 〜
shonansurvivors
4
390
「AI駆動PO」を考えてみる - 作る速さから価値のスループットへ:検査・適応で未来を開発 / AI-driven product owner. scrummat2025
yosuke_nagai
3
750
Why React!?? Next.jsそしてReactを改めてイチから選ぶ
ypresto
10
4.6k
大規模サーバーレスAPIの堅牢性・信頼性設計 〜AWSのベストプラクティスから始まる現実的制約との向き合い方〜
maimyyym
2
1.7k
「Verify with Wallet API」を アプリに導入するために
hinakko
1
260
【Oracle Cloud ウェビナー】クラウド導入に「専用クラウド」という選択肢、Oracle AlloyとOCI Dedicated Region とは
oracle4engineer
PRO
3
120
Featured
See All Featured
BBQ
matthewcrist
89
9.8k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
850
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
19
1.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Music & Morning Musume
bryan
46
6.8k
How STYLIGHT went responsive
nonsquared
100
5.8k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
900
Site-Speed That Sticks
csswizardry
11
890
Speed Design
sergeychernyshev
32
1.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
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を提供することにも成功しました