ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
最新のMacのためのNetwork Extension
Kernel Extensionを使用せずにmacOSのネットワーキング機能を拡張およびカスタマイズできるAppを作成するために使用できる、macOSの強力な新APIについてご確認ください。
リソース
関連ビデオ
WWDC21
WWDC19
-
ダウンロード
(音楽)
(拍手) Network Extensionの セッションへようこそ 僕はジェイミー ソフトウェアエンジニアです 僕たちはmacOS Catalinaに 新たにパワフルなAPIを導入しました Network Kernel Extensionを使わずに 機能の拡張などが可能な アプリケーションを作れます
まずは皆さんの フィードバックに感謝します アプリケーションで Network Kernel Extensionを どう使うか WWDCでは 皆さんに聞いてきました
頂いたフィードバックを元に カテゴリーごとに アプリケーションを分類しました macOS Mojave以前のOSでは これらの実行には Network Kernel Extensionが必要でした
今日は皆さんに このカテゴリーを 1つずつ説明しながら macOS Catalinaに導入した APIについてお話しします Network Kernel Extensionは使いません では始めましょう コンテンツフィルタAppを説明します パーソナル ファイアウォールAppがそうです システムに流れるトラフィックを 監視して 不審なものをブロックします ペアレンタルコントロールAppも そうです
これはWebの閲覧活動に フォーカスして 子供に適さないサイトの 視聴を制限します
他にも まだ例があります トラフィックを積極的に遮断せずに ネットワーク活動を 記録することもできます 記録した活動のログを あとで解析できるので 例えば 極秘情報の 送信時刻の特定もできます
新たに導入されたAPIについて お話しする前に コンテンツフィルタApp実行時の 要件を説明します コンテンツフィルタAppのコードには 実行時の明確な要件があります システムにログインがなくても コードが常時 実行されていることです 例えばペアレンタルコントロールApp アプリケーションを 実行していない時でも アクセスの制限が必要です
パーソナルファイアウォールAppでは 攻撃からMacを守らなくてはなりません ログインのない間もです
Kernel Extensionでコードを実行した時 コードはKernel内で作動しているので 要件を満たしています ログインのない間も ずっと動いていますね
ユーザ空間での 実行要件を満たすため― System Extensionという技術を 新たに導入しました
App Extensionをご存じですね? これはmacOSで実行可能な 一連のコードで ユーザ体験の拡張と カスタマイズができます
System Extensionは これと似ています アプリケーションに組み込まれており OSによって管理されています ですからファイルシステムに 配置するための ユーザ用の インストールパッケージは不要です 削除するためのアンインストーラも 書く必要はありません
System Extensionの 開始や停止については OSが必要に応じて実行してくれます
App Extensionとの他の相似点は 開発とデバッグが簡単なことです 開発には一般的なツールが使えます XcodeやLLDB Instrumentsなどです
Kernel Extensionの開発とデバッグは かなり厄介ですよね 開発の間は何度も再起動が必要です デバッグには2台の装置を 接続しなくてはなりません その後 デバッガを起動できても ソースコードの シングルステップ実行は不安定です
System Extensionは ログイン中のユーザに関係なく動きます ですからネットワーク処理の― コードの実行に理想的です
System Extensionの詳細は “System Extensions and DriverKit”を見てください 今週 開催したセッションです
System Extensionを使って このリストの アプリケーションを実行するとします コンテンツフィルタAppや DNSプロキシAppなどです 新しく導入したAPIを使うと コンテンツフィルタAppを実行できます
Network Extensionフレームワーク内の コンテンツフィルタAPIは iOS 9で初めて導入されました macOS Catalinaでも導入しました これらAPIの使い勝手は向上しています
ではコンテンツフィルタAPIを 説明します
メインUI Appでは NEFilterManagerで コンテンツフィルタを設定します その設定で コンテンツフィルタを登録するので システムで実行できます
更にSystem Extensionを作り コードを実行します
このAPIは2つのレイヤで コンテンツをフィルタさせます フローレイヤとパケットレイヤです
フローレイヤのフィルタリングには NEFilterDataProviderの サブクラスを作ります
設定と登録の後 コンテンツフィルタが実行されます ネットワークデータの 新しいTCPやUDPのフローは システムで作られます
フローは NEFilterDataProviderの サブクラスに渡されます これは NEFilterFlowオブジェクトです
その後はサブクラスが各フローについて 許可するかドロップするかを決定します
フローの存続中は皆さんも決定できます フローが最初に開いた時や フローの量を確認したあとに 決められます
NEFilterDataProviderのクラスが フローへの読み取り専用アクセスを 提供します
フローの性質を 修正することはできません
システムは NEFilterDataProviderのサブクラスに TCPとUDPデータのフローを渡します ペアレンタルコントロールAppを 書いているなら 重要なのはWebトラフィックですね NEFilterの設定でルールを作り フィルタで見たいフローを システムに通知します
これがフローレベルの フィルタリングの仕方です
パケットレイヤで トラフィックをフィルタするには NEFilterPacketProviderの サブクラスを作ります System Extensionにおいてです
システムは流れている ネットワークパケットを FilterPacketProviderのサブクラスに オブジェクトとして渡します
皆さんは各パケットを 許可するか決めます
以上がコンテンツフィルタAPIと アプリケーションでの使い方です
次のアプリケーションは System Extensionと コンテンツフィルタAPIを使って ファイアウォールを実行します
このアプリケーションの機能は単純です
ポート8888での受信TCP接続を 許可するか拒否するよう ユーザを誘導します では実際にお見せしますね
SimpleFirewallという アプリケーションです コンテンツフィルタは停止中なので UIインジケータが赤くなっています スタートをクリックします
System Extensionが ブロックされていると出ました System Extensionがあれば システムで多くのことを実行できます ネットワークトラフィックも 調べられます System Extensionを実行する前に ユーザの承認を得てください システム環境設定から
“セキュリティとプライバシー”を 開きます 管理者の認証情報を入れて “許可”をクリックし実行します
ネットワークトラフィックの フィルタリングをしてもいいか― 確認する画面が出ます “同意”をクリック コンテンツフィルタが動いているのが 色で確認できますね 僕のMacのポート8888に接続して どうなるか見てみましょう ポート8888でWeb Serverを実行中です Safariを開きます ローカルWeb Serverをクリックすると ロードし始めますが中断されました SimpleFirewall Appから ポート8888での 新しい接続を通知されます 許可するか確認されるので “同意”をクリックすると ロードが再開します
よし 動いていますね
さて次は System Extensionと コンテンツフィルタAPIの 使い方をお話ししますね 僕のプロジェクトにはターゲットが2つ メインUI Appである “SimpleFirewall”と “SimpleFirewallExtension”です こちらは System Extensionです
まずはアプリケーションのコードです
メインのビューコントローラの クラスを実行します まず最初に見るのは startFilter関数です SimpleFirewall UIのスタートボタンを クリックすると呼び出せます
まずSystem Extensionの バンドルIDを取得 System Extensionの activationRequestを作成します
ビューコントローラオブジェクトを デリゲートに設定するので activationRequestの完了後 通知があります
OSSystemExtensionManagerに 作成した要求を送ると System Extensionの アクティベーションが開始 必要に応じて ユーザから実行許可を得ます
System Extensionの実行を ユーザが許可したら
didFinishWithResult関数を 呼び出します 要求が完了したのを確認したら 次はコンテンツフィルタの設定です
NEFilterManagerで設定し システムに登録します
設定の詳細がここに 入力されているのが分かりますね
filterSocketsは“true”にして トラフィックをフローレイヤで フィルタリング
filterPacketsは“false” パケットレイヤでは フィルタリングしません
コンテンツフィルタの設定を イネーブルにして saveToPreferencesを呼び出し 設定を登録します
設定がイネーブルになったので System Extensionと コンテンツフィルタを開始できます
では次に行きましょう NEFilterDataProviderの サブクラスです System Extensionの中で実行します
このFilterDataProviderという サブクラスでは 3つのメソッドを オーバーライドしました “startFilter”と“stopFilter” “handleNewFlowです”
startFilterは―
コンテンツフィルタ開始時に 呼び出される関数です
システムはデフォルトで TCPとUDPのフローを コンテンツフィルタに全部渡します ここで気になるのは ポート8888への受信TCP接続です
NEFilterSettingsオブジェクトを作り 見たいトラフィックを システムに知らせます
TCP接続がどこから来ているのかは 気にしません どんなアドレスにTCP接続が つながっているのかも関係ありません NEFilterRuleを2つ作ります IPv4ワイルドカードアドレスのものと 同じくIPv6のものです
ルールごとに NENetworkRuleオブジェクトを作り ルールに合っている 見たいフローの特徴を指定します
remoteNetworkと remotePrefixは“nil”と“0” つまりこのルールは どのトラフィックにも合います どこからのでも大丈夫 ローカルネットワークには ワイルドカードアドレスと ポート8888で作った NWHostEndPointを渡しました
このルールは受信フローと合います ポート8888に接続しているフローです
protocolを“TCP”に directionを“inbound”に指定 NEFilterRuleオブジェクトを作り NENetworkRuleを渡します actionは“filterData”です
NENetworkRuleに合うデータの 新しいフローが
システムに作られます
更にフィルタ情報のアクションごとに コンテンツフィルタに渡されます
これらのNEFilterRuleができたら NEFilterSettingsオブジェクトを作って ルールを渡します デフォルトのアクションを “許可”にします 新しいフローが フィルタルールと合わない場合に コンテンツフィルタに 渡さないようにするのです
“apply”を呼び出し 設定を適用します 次にstartFiltercompletionHandlerを 呼び出して フィルタは準備完了だと システムに知らせます
関数“handleNewFlow”は ルールに合った新しいフローが 作成されると呼び出されます
この関数はNEFilterFlow オブジェクトであるパラメータを取り 新しいフローを判定して どうすべきか示します
ここではディクショナリの フローの詳細をパッケージにして そのディクショナリをUI Appに送ります フローを許可するか指示を促すのです
ユーザの決断のプロセスは 同期していません “pause”の判定をシステムに渡して フローを再開するまで 何もしないようOSに指示します
ユーザが決断したら それに合わせて “allow”または“drop”の 判定を作ります 次に“resumeFlow”を呼び出します
以上がアプリケーションの一例です System Extensionと コンテンツフィルタAPIを使い ファイアウォールを実行しました
透過プロキシAppの説明に移ります
その一例である クラウドセキュリティAppは 特定サイトへのトラフィックを クラウドサービスに回り道させます ここで補助的な安全確認を行うのです ユーザ認証や認可などです
透過プロキシAppとしては 他にも 特別な送信を トラフィックに行うものがあります 暗号化アルゴリズムの適用や 特殊な方法で受信した リソースのキャッシュなどです
他にも透過プロキシAppは単一接続で トラフィックのフローを多重化します ネットワーク遅延を減らす 特殊なプロトコルも使えます 透過プロキシAppは ユースケースが多数あります macOS Catalinaでは新しいAPIを Network Extensionフレームワークに 導入しました Kernel Extensionなしで 透過プロキシAppsを作れます
これらのAPIはNetwork Extension フレームワークにあります 次はアプリケーションでの使い方です
メインUI Appで NETransparentProxyManagerを使い 透過プロキシの設定をして登録します ですからシステムは 透過プロキシを実行できます
System Extensionを作り プロキシを実行します
これらAPIはフローレイヤでの フローをプロキシ可能にします それにはNEAppProxyProviderの サブクラスを作ります システムはフローを プロキシに回り道させないので NENetworkRuleを作り プロキシするフローを指定しましょう
透過プロキシを実行し NENetworkRuleをインストールします
ルールにマッチする― 新しいTCPとUDPのフローが開きます これらフローはNEAppProxyProviderの サブクラスに回り道します ここからのフローの処理は あなた次第です 他の接続でのフローの多重化や 特殊な送信も可能 皆さんが決めてください
以上 透過プロキシAPIの アプリケーションでの使い方でした
次は DNSプロキシAppです DNSプロトコルはパワフルで実用的です ただ安全とはいえません
DNSレスポンスになりすまし ブラウザを不正なサイトに導くのも容易 閲覧をスパイするのも簡単です DNSクエリーを 見ればいいだけですからね
対処法としてDNSプロキシは DNSプロトコルに セキュリティを付加します
例えばDNSトラフィックを暗号化したり 安全な伝送路でプロキシするのです
新たに導入したAPIのおかげで DNSプロキシAppを実行できます Network Kernel Extensionは不要です
Network Extensionフレームワークに これらAPIはあります 実はiOS 11で導入されたのですが macOS Catalinaでも利用できます 次はアプリケーションでの 動作の仕方です
メインUI Appで NEDNSProxyManagerを使い DNSプロキシを設定します ですからシステムは DNSプロキシを実行できます
System Extensionを作り DNSプロキシを実行 NEDNSProxyProviderクラスの サブクラスとしてプロキシを実行します
設定の登録後 System Extensionを動作します NEDNSProxyProviderのサブクラスに DNSクエリーは回り道させられます
ここからDNSクエリーの処理は あなた次第です 暗号化してもいいし 安全な伝送路で― 送信してもいいです
以上がDNSプロキシAPIの概要です 次はVPN Appです VPN Appのよくあるユースケースは 企業の社内ネットワーク 安全なリモートアクセスを 社員に提供します
更に 最近人気があるのは パーソナルVPN Appです これらを使えば 匿名で安全にネットを閲覧できます
macOS 10.10のVPN APIを また導入しました 今回のリリースでは 更に改良しています VPN APIを詳しく説明します
メインUI Appで NETunnelProviderManagerを使います VPNを設定し VPNクライアントを登録
System Extensionを作り コードを実行します
NEPacketTunnelProviderの サブクラスとしてVPNクライアント実行 NEPacketTunnelProviderに対応する― utunインターフェイスを作ります
NEPacketTunnelProviderは VPNの経路を指定し システムに伝えます
IPパケットは指定された経路を通ります utunインターフェイスに向かい― NEPacketTunnelProviderへ回り道します そこから カスタムトンネリングプロトコルの トンネル接続で それらのパケットは送られます
以上がVPN APIの動作の仕方です 次はVPN APIの向上した点です “includeAllNetworks”は VPN設定にセットできるフラッグで パーソナルVPN Appで特に有用です VPNトンネルの外に トラフィックは漏れません 全部 VPNを通したいですよね (拍手) ですよね (拍手)
設定でincludeAllNetworksを イネーブルすれば トラフィックはVPNの経路を通ります VPNが利用できない時がありますね 例えばMacが WiFiネットワークを変える時とか VPNが一時的に ダウンしている時などです
こういう場合 トラフィックはドロップされます
includeAllNetworksをイネーブルしたが ローカルネットワークの リソースにアクセスさせたい そんな時はexcludeLocalNetworksを イネーブルしてください
Per-App VPNも改良しました トラフィックを送れるドメインの リストを3つ 追加しました
どういうものか説明しますね 各リストと一致するアプリケーションが ホストと接続します ホストのドメインがリストにあれば トラフィックは Per-App VPNでルートを指定されます 例えばメールAppに アカウントが2つあるとします 個人的なEメールのアカウントと 会社のアカウントですね
会社のEメールサーバーのドメインを メールドメインのアレイに指定します
メールが 会社の Eメールサーバーに接続すると その接続はPer-App VPNを経由します
個人のEメールサーバーへの接続は Per-App VPNを経由しません
CalenderDomainsや ContactsDomainsも同様です カレンダーAppとコンタクトAppは 除外です
以上がmacOSで利用可能なVPN APIと VPN App作成の概要でした Network Kernel Extensionは使いません
次は仮想マシンを作成し管理する 仮想マシンAppです 仮想マシンはネットワークへの 接続が必要ですね macOSのvmnetフレームワークによって 仮想マシンを接続できます このフレームワークは macOS 10.10で導入されました
今回のリリースでは より多くの接続方法を提供しています
仮想マシンを接続するための いくつかのモードが使えます 共有モードを改良しました IPv6が利用可能です 仮想マシンに割り当てるIPの 範囲を指定でき ポートフォワーディングルールも 設定可能です
新しいブリッジモードでは 仮想マシンはローカルネットワークに 存在するかのようです
以上が仮想マシンAPIの概要です これらAPIで仮想マシンを ネットワークに接続できます
次にお話しするのは カスタム低レイヤプロトコルを 使うアプリケーションです カメラやオーディオデバイスなどの ハードウェアとの通信を 必要とするものです つまり― 低レイヤプロトコルだけを 理解するハードウェアです カスタムリンク層プロトコルなどですね
カスタムIPプロトコルを使う アプリケーションは 他のマシンとの通信が必要なものです 高度に最適化された プロトコルを使います
お知らせできてうれしいです 新しいAPIでは カスタム低レイヤプロトコルを使い Kernel Extensionなしで通信できます
まずはカスタムIPプロトコルのAPIです
ネットワークフレームワークの 新しいAPIです
動作の仕方は アプリケーションにあります NWParametersオブジェクトを作り カスタムIPプロトコルの ID番号を指定します 次にNWParametersオブジェクトで NWConnectionを作成 今度はNWConnectionを使います TCPやUDPのNWConnectionのように カスタムIPプロトコルを使い 通信します
昨年の“Introducing Network Framework”に詳細があります
次はカスタムIPプロトコルの 使い方を示す― コードのサンプルです このコンストラクタに カスタムIPプロトコルのID番号を渡し NWParametersオブジェクトを 作っています
ここで渡すのは システムが処理しているプロトコルの 番号ではないので注意してください TCPやUDP ICMPなどですね
次にデスティネーションを作成 NWConnectionに パラメータと一緒に渡します
ここからは― 他のNWConnectionと同じく その接続を使います カスタムIPプロトコルを使って パケットを送受信します
次はカスタムリンクレイヤ プロトコルAPIです ネットワークフレームワークに 追加されました
これが作動する方法は アプリケーションにあります NWEthernetChannelオブジェクトを作り カスタムイーサタイプを指定します イーサネットインターフェイスで 通信を行います
コードを見てみましょう
まずイーサネットインターフェイスの リファレンスを取得します
NWEthernetChannelオブジェクトを作り インターフェイスと カスタムイーサタイプを渡します
カスタムIPプロトコルAPIのように ここでも渡さなくてはなりません IPやIPv6など システムが既に 扱っているイーサタイプではダメです
チャンネルを作ったら コールバックのブロックを設定
stateUpdateHandlerのブロックは
チャンネルの状態が変化すると 呼び出されます チャンネルが準備できたら カスタムイーサタイプのパケットの 送受信を開始します
新しいパケットを受信すると receiveHandlerのブロックが 呼び出されます
チャンネルが全部セットされたら カスタムイーサタイプでの 通信が開始可能です
以上が新たに導入したAPIの概要です Kernel Extensionなしで 通信が可能になりました
今日はたくさんのAPIについて お話ししました こちらのカテゴリーで アプリケーションを作れます Network Kernel Extensionは不要です
さてここで 今後についてお話しします
Network Kernel Extensionには 問題があります
まず開発が難しいです 前に言ったように 新しい機能を試す際は 何度も再起動が必要です 他にも とても低レベルの概念を 頻繁に使わなくてはなりません マニュアルのM-Buffチェーン操作などは 厄介なコードで間違いやすいです
Kernel Extensionは デバッグも難しいです 前に言ったように2台の装置が必要で シングルステップ実行は面倒です
他にもKernel Extensionの― 不安定さはシステムにとって打撃です Kernel Extensionがクラッシュすると アプリケーションは閉じ システム全体が再起動 ユーザにはストレスですし データの紛失もあり得ます
macOSは節目を迎えたと言えるでしょう Network Kernel Extensionを使わずに アプリケーションを 作れるようになったのですから Network Kernel Extensionは macOS Catalinaでは非推奨です 現行のものは macOS Catalinaでも 今までと同じように使用できます しかし新しいAPIを ぜひ試していただきたいです アプリケーションの作成に これらのAPIを使ってください なるべく早くそうしてほしいです Network Kernel ExtensionのmacOSでの サポートをまもなく廃止するからです
さて今日説明したのは パワフルなAPIについてでした macOS Catalinaに導入されたAPIで コンテンツのフィルタや プロキシが可能です 仮想マシンとネットワークの接続も カスタム低レイヤプロトコルでの 通信も可能です すべてNetwork Kernel Extensionは 不要です
皆さんに強くお勧めします 新しいAPIをぜひ使ってください Network Kernel Extensionは 非推奨となり 今後のリリースでは サポートも終了します
このセッションのWebページに デモを行ったトンネルコードへの リンクがあります
ネットワーキングラボも開催中です ぜひいらしてください 質問にもお答えします ありがとうございました (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。