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
6k
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
12
5.2k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
5.1k
GoでTCP Proxyを実装してみよう
kurochan
1
840
サイバーエージェントの広告配信におけるIPoEトラフィックの概況
kurochan
0
390
スケールするというのはどういうことなのか
kurochan
14
4.5k
サイバーエージェントのGitHub Copilot導入と 開発生産性
kurochan
45
42k
Cloudflare Zero Trustを利用したセキュアな開発環境へのアクセス手法の確立
kurochan
10
3.1k
セキュキャンを卒業してその後
kurochan
0
1.3k
サイバーエージェントの実践×実験Snowflake 導入の経緯から最新機能のトライアルまで / How Snowflake Is Used In CyberAgent - Go To the Future
kurochan
1
1k
Other Decks in Technology
See All in Technology
Introduction to Works of ML Engineer in LY Corporation
lycorp_recruit_jp
0
110
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
安心してください、日本語使えますよ―Ubuntu日本語Remix提供休止に寄せて― 2024-11-17
nobutomurata
1
990
【Pycon mini 東海 2024】Google Colaboratoryで試すVLM
kazuhitotakahashi
2
500
The Role of Developer Relations in AI Product Success.
giftojabu1
0
120
AIチャットボット開発への生成AI活用
ryomrt
0
170
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
380
Incident Response Practices: Waroom's Features and Future Challenges
rrreeeyyy
0
160
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
380
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
200
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
150
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
A better future with KSS
kneath
238
17k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Making Projects Easy
brettharned
115
5.9k
Done Done
chrislema
181
16k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
What's in a price? How to price your products and services
michaelherold
243
12k
Producing Creativity
orderedlist
PRO
341
39k
Ruby is Unlike a Banana
tanoku
97
11k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
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を提供することにも成功しました