Pro Yearly is on sale from $80 to $50! »

ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy

1f745ff900e1be51aedae18cae76593c?s=47 Kurochan
September 05, 2019

ScalaでCaptive Portalを実装しカンファレンスで運用するまで #npstudy

ネットワークプログラマビリティ勉強会で発表した資料です
https://network-programmability.connpass.com/event/143534/

1f745ff900e1be51aedae18cae76593c?s=128

Kurochan

September 05, 2019
Tweet

Transcript

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

  2. 黒崎 優太 • 広告配信プラットフォームの開発責任者 • 業務は Scala + AWS •

    イラスト図解でよくわかる ITインフラの基礎知識 • 書きました • AWSのAZ(アベイラビリティーゾーン)とは?AZ 障害が起きたときどうすればよいのか • 最近ちょっとバズりました @kuro_m @kurochan
  3. 最近事業部名がかわりました • アドテク本部 → AI事業本部

  4. 開発している広告システム概況 • ⼊札リクエスト量: 数⼗万リクエスト / 秒 • ⼊札トラフィック: 約8Gbps •

    レスポンスタイム: 100ms以内 • ログの量: 数TB / Day(圧縮状態) ೔ຊͷೖࡳϦΫΤετඵ ೔ຊΞϝϦΧͷϨεϙϯελΠϜ NTFD
  5. 最近⾒ていて楽しい画⾯ • オートスケーリング系のメトリクス

  6. Contents • Captive Portal x Scala • Captive Portalとは •

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

  8. Captive Portalとは

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

  10. 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だと判断する
  11. 今回作ったもの

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

    • Scala MatsuriなのでScalaをネットワークに組み込みたかった
  13. 実装

  14. Captive Portalの実装⽅法 • 認証済ユーザ: 全てのパケットを通過させる • 認証していないユーザ: 全てのHTTP通信を
 Captive Portalにリダイレクトさせる

    • Scalaが使いたいが、Scalaで全て実装するのは厳しいので
 OpenFlow + Scalaを選択
  15. 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
  16. OpenFlow Controllerを実装する • OpenFlowのメッセージのシリアライズ/デシリアライズの部分に
 Floodlightを利⽤ • TCPのコネクションとストリーミング部分はnettyを使う • その他の部分はScalaで実装 Scala

    Application OpenFlow Switch OpenFlow Message
  17. Performance Test • Simple Controller: packet-inしたらpacket-outするだけ • C . xlarge(

    Core GB) • Mbps • 負荷分散していないので1コアしか使えていない状態 • パフォーマンス的には⼗分だった • 全パケットをScalaで処理したテスト • 実際にはフローはキャッシュされる • キャッシュヒット率が90%なら
 Gbpsくらいは出せそう Scala Application OpenFlow Message The Internet
  18. 構成 • OpenFlow Gateway • netty • OpenFlow Messageのシリアライズ/デシリアライズ •

    HTTP Server • Akka HTTP • CaptivePortalのWebサーバ • Captive Portal Controller • Akka Streams • パケット処理とOpenFlowのフローの⽣成
  19. • OpenFlow Switchとの通信 • メッセージのシリアライズ/デシリアライズ OpenFlow Gateway

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

  21. Captive Portal Controller • 認可済ユーザ: パケットを全て通す • 同様なフローをスイッチに書き込む • 未認可ユーザ:

    DNSパケットは
 全て偽DNSサーバに転送 • 偽DNSサーバは常に同じIPを返す • Akka Streamsで処理を書いた • パケット処理はストリーミング処理
 そのものなので便利でした(後述)
  22. Akka • Actorモデルを実装したScalaのフレームワーク • 分散型で並⾏性を持ち、耐障害性を備えている("let it crash") • ⾮同期でノンブロッキングかつ⾼性能なメッセージ駆動の
 アプリケーションが開発できる

  23. Akka Streams w IUUQTEPDBLLBJPEPDTBLLBTDBMBTUSFBNTUSFBNDVTUPNJ[FIUNM

  24. Akka Streams w IUUQTEPDBLLBJPEPDTBLLBTDBMBTUSFBNTUSFBNDVTUPNJ[FIUNM • 下流からpullされたらpushする、の連鎖でデータが受け渡される • 上流が下流にデータを送りつづけて下流が溢れるという事態が発⽣しない • =>

    これが背圧制御 (back-pressure) • back-pressureの他にもdrop new, drop tail, drop buffer, failなどの戦略が選択できる
  25. Case: 認可済みユーザ Captive Portal Server The Internet User OpenFlow Switch

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

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

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

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

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

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

    Packet In Authorized! Packet Out Flow Cached
  32. Case: 認可済みユーザ (second packet) Captive Portal Server The Internet User

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

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

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

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

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

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

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

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

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

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

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

    Packet In Unauthorized! Packet Out Fake DNS Server Captive PortalʹϦμΠϨΫτ DNSύέοτͷ޲͖ઌΛ
 ِͷDNSαʔόʹॻ͖׵͑Δ ِDNS response
  44. デプロイ

  45. データセンタのサーバにデプロイ • Linux Virtual Machine: Core GB (CPU, Memoryともに余った) •

    データセンタにデプロイした理由は後述
  46. 運⽤

  47. 無事動作しました • ⼀部動かない端末が... • Samsung GalaxyシリーズでのみCaptive Portal検知ができず • 何かしらのHTTPのサイト (e.g.

    http://neverssl.com ) を開いてもらうことでリダイレクトしてもらった • 約800ユーザが認証してくれました!
  48. WiFi

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

  50. 準備

  51. 構成 • Home NOC Operator's Group(AS )の
 データセンタに接続 • データセンタとの間はフレッツのNGN折返し通信

    • ⾼速な回線を提供したかった • やってみたかった The Internet AS59105 Scala Matsuri venue
  52. 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
  53. 会場下⾒

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

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

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

  57. 構築

  58. 初⽇の消費カロリー

  59. Entrance Hall( F)

  60. Foyer( F)

  61. Conference Hall ( F, F)

  62. Media Hall ( F)

  63. Conference Room ( F)

  64. 運⽤

  65. 監視 • トラフィック, APの死活監視, 外形監視, クライアント数等 • Datadog • ping,

    DHCP, DNS • Zabbix + Grafana • SNMP
  66. Traffic • 828クライアントが接続 • 1⽇で下り206GB, 上り64GB程度

  67. Wi-Fi Clients

  68. トラブル

  69. Day

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

  71. Day • Day used only meeting room of F, so

    it was OK maybe... 修復
  72. Day (朝)

  73. Day (朝) •

  74. Day (朝) •

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

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