Slide 1

Slide 1 text

ScalaでCaptive Portalを実装し
 カンファレンスで運⽤するまで #npstudy 株式会社サイバーエージェント AI事業本部
 黒崎 優太 (@kuro_m )

Slide 2

Slide 2 text

黒崎 優太 • 広告配信プラットフォームの開発責任者 • 業務は Scala + AWS • イラスト図解でよくわかる ITインフラの基礎知識 • 書きました • AWSのAZ(アベイラビリティーゾーン)とは?AZ 障害が起きたときどうすればよいのか • 最近ちょっとバズりました @kuro_m @kurochan

Slide 3

Slide 3 text

最近事業部名がかわりました • アドテク本部 → AI事業本部

Slide 4

Slide 4 text

開発している広告システム概況 • ⼊札リクエスト量: 数⼗万リクエスト / 秒 • ⼊札トラフィック: 約8Gbps • レスポンスタイム: 100ms以内 • ログの量: 数TB / Day(圧縮状態) ೔ຊͷೖࡳϦΫΤετඵ ೔ຊΞϝϦΧͷϨεϙϯελΠϜ NTFD

Slide 5

Slide 5 text

最近⾒ていて楽しい画⾯ • オートスケーリング系のメトリクス

Slide 6

Slide 6 text

Contents • Captive Portal x Scala • Captive Portalとは • 実装, デプロイ, 運⽤ • Wi-Fi in ScalaMatsuri • 設計, 検証, 構築, 運⽤ • トラブル

Slide 7

Slide 7 text

Captive Portal x Scala

Slide 8

Slide 8 text

Captive Portalとは

Slide 9

Slide 9 text

Captive Portal • free Wi-Fiの認証/認可のシステム • 駅や商業施設で⾒かけたことがあると思います

Slide 10

Slide 10 text

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だと判断する

Slide 11

Slide 11 text

今回作ったもの

Slide 12

Slide 12 text

今回作ったもの • Scala Matsuriのfree Wi-Fiに初めて接続した時に
 Captive Portal画⾯を表⽰する • 認証/認可は超簡易的(参加者はRegisterボタンを押せば繋がる)
 ポップアップを表⽰するのみ • Scala MatsuriなのでScalaをネットワークに組み込みたかった

Slide 13

Slide 13 text

実装

Slide 14

Slide 14 text

Captive Portalの実装⽅法 • 認証済ユーザ: 全てのパケットを通過させる • 認証していないユーザ: 全てのHTTP通信を
 Captive Portalにリダイレクトさせる • Scalaが使いたいが、Scalaで全て実装するのは厳しいので
 OpenFlow + Scalaを選択

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

OpenFlow Controllerを実装する • OpenFlowのメッセージのシリアライズ/デシリアライズの部分に
 Floodlightを利⽤ • TCPのコネクションとストリーミング部分はnettyを使う • その他の部分はScalaで実装 Scala Application OpenFlow Switch OpenFlow Message

Slide 17

Slide 17 text

Performance Test • Simple Controller: packet-inしたらpacket-outするだけ • C . xlarge( Core GB) • Mbps • 負荷分散していないので1コアしか使えていない状態 • パフォーマンス的には⼗分だった • 全パケットをScalaで処理したテスト • 実際にはフローはキャッシュされる • キャッシュヒット率が90%なら
 Gbpsくらいは出せそう Scala Application OpenFlow Message The Internet

Slide 18

Slide 18 text

構成 • OpenFlow Gateway • netty • OpenFlow Messageのシリアライズ/デシリアライズ • HTTP Server • Akka HTTP • CaptivePortalのWebサーバ • Captive Portal Controller • Akka Streams • パケット処理とOpenFlowのフローの⽣成

Slide 19

Slide 19 text

• OpenFlow Switchとの通信 • メッセージのシリアライズ/デシリアライズ OpenFlow Gateway

Slide 20

Slide 20 text

HTTP Server • Captive Portalのwebサーバ • 認可したユーザのIPアドレスをRedisに書き込む

Slide 21

Slide 21 text

Captive Portal Controller • 認可済ユーザ: パケットを全て通す • 同様なフローをスイッチに書き込む • 未認可ユーザ: DNSパケットは
 全て偽DNSサーバに転送 • 偽DNSサーバは常に同じIPを返す • Akka Streamsで処理を書いた • パケット処理はストリーミング処理
 そのものなので便利でした(後述)

Slide 22

Slide 22 text

Akka • Actorモデルを実装したScalaのフレームワーク • 分散型で並⾏性を持ち、耐障害性を備えている("let it crash") • ⾮同期でノンブロッキングかつ⾼性能なメッセージ駆動の
 アプリケーションが開発できる

Slide 23

Slide 23 text

Akka Streams w IUUQTEPDBLLBJPEPDTBLLBTDBMBTUSFBNTUSFBNDVTUPNJ[FIUNM

Slide 24

Slide 24 text

Akka Streams w IUUQTEPDBLLBJPEPDTBLLBTDBMBTUSFBNTUSFBNDVTUPNJ[FIUNM • 下流からpullされたらpushする、の連鎖でデータが受け渡される • 上流が下流にデータを送りつづけて下流が溢れるという事態が発⽣しない • => これが背圧制御 (back-pressure) • back-pressureの他にもdrop new, drop tail, drop buffer, failなどの戦略が選択できる

Slide 25

Slide 25 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch

Slide 26

Slide 26 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch

Slide 27

Slide 27 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In

Slide 28

Slide 28 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In Authorized!

Slide 29

Slide 29 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In Authorized! Packet Out

Slide 30

Slide 30 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In Authorized! Packet Out Flow Cached

Slide 31

Slide 31 text

Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In Authorized! Packet Out Flow Cached

Slide 32

Slide 32 text

Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User OpenFlow Switch Flow Cached

Slide 33

Slide 33 text

Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User OpenFlow Switch Flow Cached

Slide 34

Slide 34 text

Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User OpenFlow Switch Flow Cached

Slide 35

Slide 35 text

Case: 未認可ユーザ Captive Portal Server The Internet User OpenFlow Switch

Slide 36

Slide 36 text

Case: 未認可ユーザ Captive Portal Server The Internet User DNS packet OpenFlow Switch

Slide 37

Slide 37 text

Case: 未認可ユーザ Captive Portal Server The Internet User Packet In OpenFlow Switch

Slide 38

Slide 38 text

Case: 未認可ユーザ Captive Portal Server The Internet User Packet In Unauthorized! OpenFlow Switch

Slide 39

Slide 39 text

Case: 未認可ユーザ Captive Portal Server The Internet User Packet In Unauthorized! DNSύέοτͷ޲͖ઌΛ
 ِͷDNSαʔόʹॻ͖׵͑Δ OpenFlow Switch

Slide 40

Slide 40 text

Case: 未認可ユーザ Captive Portal Server The Internet User Packet In Unauthorized! Packet Out OpenFlow Switch DNSύέοτͷ޲͖ઌΛ
 ِͷDNSαʔόʹॻ͖׵͑Δ

Slide 41

Slide 41 text

Case: 未認可ユーザ Captive Portal Server The Internet User Packet In Unauthorized! Packet Out ِDNS Server OpenFlow Switch DNSύέοτͷ޲͖ઌΛ
 ِͷDNSαʔόʹॻ͖׵͑Δ

Slide 42

Slide 42 text

Case: 未認可ユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In Unauthorized! Packet Out Fake DNS Server ِDNS response DNSύέοτͷ޲͖ઌΛ
 ِͷDNSαʔόʹॻ͖׵͑Δ

Slide 43

Slide 43 text

Case: 未認可ユーザ Captive Portal Server The Internet User OpenFlow Switch Packet In Unauthorized! Packet Out Fake DNS Server Captive PortalʹϦμΠϨΫτ DNSύέοτͷ޲͖ઌΛ
 ِͷDNSαʔόʹॻ͖׵͑Δ ِDNS response

Slide 44

Slide 44 text

デプロイ

Slide 45

Slide 45 text

データセンタのサーバにデプロイ • Linux Virtual Machine: Core GB (CPU, Memoryともに余った) • データセンタにデプロイした理由は後述

Slide 46

Slide 46 text

運⽤

Slide 47

Slide 47 text

無事動作しました • ⼀部動かない端末が... • Samsung GalaxyシリーズでのみCaptive Portal検知ができず • 何かしらのHTTPのサイト (e.g. http://neverssl.com ) を開いてもらうことでリダイレクトしてもらった • 約800ユーザが認証してくれました!

Slide 48

Slide 48 text

WiFi

Slide 49

Slide 49 text

Scala Matsuri Wi-Fi Team • サイバーエージェントのエンジニアで構築しました

Slide 50

Slide 50 text

準備

Slide 51

Slide 51 text

構成 • Home NOC Operator's Group(AS )の
 データセンタに接続 • データセンタとの間はフレッツのNGN折返し通信 • ⾼速な回線を提供したかった • やってみたかった The Internet AS59105 Scala Matsuri venue

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

会場下⾒

Slide 54

Slide 54 text

社内検証環境 • 普段はコードを書くのが専⾨なので調べながら構築しました

Slide 55

Slide 55 text

配線の設計 • 当⽇しか構築ができないので事前に
 ほぼ準備を済ませました

Slide 56

Slide 56 text

LANケーブルを700m⽤意する • 50本くらい⼿作りしました • 買ったほうが(⼈のリソース含め)コスパがよかったかもしれない…?

Slide 57

Slide 57 text

構築

Slide 58

Slide 58 text

初⽇の消費カロリー

Slide 59

Slide 59 text

Entrance Hall( F)

Slide 60

Slide 60 text

Foyer( F)

Slide 61

Slide 61 text

Conference Hall ( F, F)

Slide 62

Slide 62 text

Media Hall ( F)

Slide 63

Slide 63 text

Conference Room ( F)

Slide 64

Slide 64 text

運⽤

Slide 65

Slide 65 text

監視 • トラフィック, APの死活監視, 外形監視, クライアント数等 • Datadog • ping, DHCP, DNS • Zabbix + Grafana • SNMP

Slide 66

Slide 66 text

Traffic • 828クライアントが接続 • 1⽇で下り206GB, 上り64GB程度

Slide 67

Slide 67 text

Wi-Fi Clients

Slide 68

Slide 68 text

トラブル

Slide 69

Slide 69 text

Day

Slide 70

Slide 70 text

Day • 初⽇は4Fしか使わなかったので⼤丈夫だったはず…

Slide 71

Slide 71 text

Day • Day used only meeting room of F, so it was OK maybe... 修復

Slide 72

Slide 72 text

Day (朝)

Slide 73

Slide 73 text

Day (朝) •

Slide 74

Slide 74 text

Day (朝) •

Slide 75

Slide 75 text

Day (朝) • どうしてこうなった

Slide 76

Slide 76 text

まとめ • Captive PortalをScalaで実装し、3⽇間無停⽌で運⽤できました! • コードは公開しています • https://github.com/kurochan/scaptive-portal • 快適なWi-Fiを提供することにも成功しました