View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC19に戻る

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • 最新のMacのためのNetwork Extension

    Kernel Extensionを使用せずにmacOSのネットワーキング機能を拡張およびカスタマイズできるAppを作成するために使用できる、macOSの強力な新APIについてご確認ください。

    リソース

    • Filtering Network Traffic
      • HDビデオ
      • SDビデオ
    • プレゼンテーションスライド(PDF)

    関連ビデオ

    WWDC21

    • iCloud Private Relayの準備

    WWDC19

    • ネットワーキングの最新情報(パート1)
    • ネットワーキングの最新情報(パート2)
    • macOSセキュリティの最新情報
    • macOS向けAppKitの新機能
    • System ExtensionとDriverKit
  • このビデオを検索

    (音楽)

    (拍手) 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ページに デモを行ったトンネルコードへの リンクがあります

    ネットワーキングラボも開催中です ぜひいらしてください 質問にもお答えします ありがとうございました (拍手)

Developer Footer

  • ビデオ
  • WWDC19
  • 最新のMacのためのNetwork Extension
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン