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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
100
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
120
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.1k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
91
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
210
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
360
入門 電気通信事業者
kurochan
13
5.8k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6.1k
GoでTCP Proxyを実装してみよう
kurochan
1
1.3k
Other Decks in Technology
See All in Technology
IBM Bobを使って、PostgreSQLのToDoアプリをDb2へ変換してみよう/202603_Dojo_Bob
mayumihirano
0
180
vLLM Community Meetup Tokyo #3 オープニングトーク
jpishikawa
0
190
管理者向けGitHub Enterpriseの運用Tips紹介: 人にもAIにも優しいプラットフォームづくり
yuriemori
0
160
Shifting from MCP to Skills / ベストプラクティスの変遷を辿る
yamanoku
4
590
タスク管理も1on1も、もう「管理」じゃない ― KiroとBedrock AgentCoreで変わった"判断の仕事"
yusukeshimizu
2
1.3k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
14k
Digitization部 紹介資料
sansan33
PRO
1
7k
マネージャー版 "提案のレベル" を上げる
konifar
21
13k
Claude Cowork Plugins を読む - Skills駆動型業務エージェント設計の実像と構造
knishioka
0
280
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
8万デプロイ
iwamot
PRO
2
160
Serverless Agent Architecture on Azure / serverless-agent-on-azure
miyake
1
160
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.1k
The browser strikes back
jonoalderson
0
760
Why Our Code Smells
bkeepers
PRO
340
58k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
68
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.4k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
99
AI: The stuff that nobody shows you
jnunemaker
PRO
3
360
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
140
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
620
Docker and Python
trallard
47
3.8k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
150
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を提供することにも成功しました