ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iPhoneとMacBookとのテザリング時にiCloud同期によるパケット浪費を食い止める方法

   

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00000

筆者は外出時、MacBookとiPhone 7 Plus、iPad Pro 9.7を持ち出すことが多いです。

それを持ってカフェなどで油を売るのですが、iCloudフォトライブラリを使い始めたこともあって、MacBookとiPhone 7 Plusをテザリングして使っていると、目を離したすきにiCloud関係でGB単位のパケットを浪費して、筆者の契約である月間のデータ通信容量6GBをやすやすと踏み越えてしまうことが多くなってきました。

外出時はどちらかというとiCloud関係の同期は止めておきたい。

iPad ProとiPhone 7 Plusでテザリングするときには省データモードを適用することができ、その組み合わせではパケットの浪費が起きないため、macOSにも同等の機能の存在を期待します。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00010

しかし、実際にはそういう機能はmacOSにはないようです。

そこで対策を施しました。

通信量を把握する

Mac App StoreにBandwith+(無料)というアプリがあり、これを使うと、インターフェースごとの通信量が把握できます。

ステータスバーに常駐し、常に通信量を把握できるので重要です。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00007

彼を知り己を知れば百戦殆からず。

現在どれぐらいの通信が発生しているのかを知らずしてこの問題に対峙することは罷りなりません。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00008

ちなみに、既にメニューバー上にたくさんアイコンがある場合、Commandキーを押しながらアイコンをドラッグ&ドロップすると右の方にずらせ、アプリケーションのメニュー項目に消されてしまうことを避けることができます。

見知らぬプロセスばかりで原因の特定に必ずしもつながるわけではありませんが、「/アプリケーション/ユーティリティ/アクティビティモニタ」の「ネットワーク」タブは、何というプロセスがどれぐらいの通信をしているかを確認することができます。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00012

止められる自動アップデートは止めておく

筆者はカフェで作業中にXcodeの自動アップデートがかかって、あわてて止めた経験があります。

外での作業が多いマシンは、自動アップデートも止めておく方がいいですね。

「システム環境設定>ソフトウェアアップデート>Macを自動的に最新の状態に保つ>詳細>新しいアップデートがある場合はダウンロード」のチェックボックスはオフに。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00013

「/アプリケーション/App Store>環境設定…>自動アップデート」このチェックボックスもオフに。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00014

「ミュージック.app>環境設定…>一般>自動ダウンロード」、「Podcasts>環境設定…>一般>エピソードを自動的にダウンロード」などもありますが、こちらは不用意な通信が発生することはほぼないのでそのままにしています。

ファイアウォールでアプリケーション単位の通信をブロックする

macOSの「システム環境設定>セキュリティとプライバシー>ファイアウォール」は認証されていないアプリケーション、プログラム、サービスへの外部からの接続を受け入れないように設定可能で、これを使うとiCloud Drive、iCloudフォトライブラリの同期を阻止可能のようです。

背景となる知識

iCloud関連のデータ転送を司っているのがnsurlsessiondというデーモンで、この活動を確認したら停止しにいくという対策があります。(本来はもっと機械的にやります)

sudo killall nsurlsessiond

nsurlsessiondの所在は下記の通りです。

/usr/libexec/nsurlsessiond

外出中はnsurlsessiondの活動を完璧に停止させるために一時的に実行権限を剥奪する手を考えましたが、macOS Catalinaでは/usr/libexec/は読み出し専用の領域であるため、それが簡単にはいきませんでした。

ファイアウォールによるiCloud同期の阻止手順

  1. 「システム環境設定>セキュリティとプライバシー>ファイアウォール」を開く
  2. ウインドウ左下の「変更するにはカギをクリックします。」をクリック
  3. 「ファイアウォールをオンにする」ボタンをクリック
  4. 「ファイアウォールオプション…」をクリック
  5. 「+」ボタンをクリックし「/アプリケーション/写真」を追加
  6. 「+」ボタンをクリックし、Command+Shift+Gで移動ダイアログを表示
  7. 移動ダイアログに「/システム/ライブラリ/CoreServices/Finder」と入力して「移動」ボタンをクリック
  8. そこにある「Finder」を追加
  9. 追加した「写真」と「Finder」の「外部からの接続を許可」を「外部からの接続をブロック」に変更
  10. 「内蔵ソフトウェアが外部からの接続を受け入れるのを自動的に許可」のチェックボックスをオフ
  11. 「OK」ボタンをクリック

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00009

これでどうやらiCloud関係の同期が止まるようです。

素早くファイアウォールのオン・オフを切り替えられるように設定する

テザリング中だけファイアウォールをオンにし、自宅に帰ってきたらファイアウォールをオフにすればよいわけですが、ファイアウォールの設定の所在の階層が「システム環境設定>セキュリティとプライバシー>ファイアウォール」と深く、これをいちいち起動するのが面倒。

実はこの設定パネルには固有のURLが割り当てられています。

これを何らかの方法で素早く開けるようにすれば、設定の手間が大分省かれます。

例えば、BetterTouchToolを使って、キーボードに割り当てるなどです。

以下をダウンロードし、BetterTouchToolの設定画面にドラッグ&ドロップするとF12キーでファイアウォールの設定が開けるようになります。

以下をダウンロードし、AlfredのWorkflow設定画面にドラッグ&ドロップし、ブランクになっているHotkeyにF12を登録すると、F12キーでファイアウォールの設定が開けるようになります。

URLを開くだけのAppleScriptアプリケーションも作成しました。初回だけ右クリック(Ctrl+クリック)から「開く」で起動します。

ダウンロード: LaunchFirewall.zip

これをシンプルにDockに登録しておくのも便利かもしれません。

ファイアウォールのオン・オフを自動的切り替えられるように設定する

ファイアウォールの設定を切り替えようとするとパスワードを求められたりとスムーズにはいきません。

そこで、ファイアウォールの適用を全自動化するスクリプトを作成しました。

動作にはHammerspoonという自動化ソフトウェアが必要です。

ダウンロードはこちらからできます。

Hammerspoonの設定方法

  • Hammerspoonは、初回だけアプリケーションアイコン「右クリック>開く」から起動
  • 起動すると「Enable Accessibility」と促してきます
    • How to stop packet loss due to icloud sync when tethering between iphone and macbook 00001
  • 「システム環境設定>セキュリティとプライバシー>プライバシー>アクセシビリティ>下のアプリケーションにコンピュータの制御を許可。」を開く
  • ウインドウ左下の「変更するにはカギをクリックします。」をクリック、パスワードを入力
  • リストアップされているHammerspoonの行頭にあるチェックボックスをオンに
    • How to stop packet loss due to icloud sync when tethering between iphone and macbook 00002
  • HammerspoonのPreferencesを見て「Accessibility is enabled. You’re all set!」となっていればOK
    • How to stop packet loss due to icloud sync when tethering between iphone and macbook 00003

基本設定ができたところで、今度は今回の問題のための設定を追加します。

  1. メニューバー上にあるHammerspoonのアイコンをクリックし「Open Config」を実行
    • How to stop packet loss due to icloud sync when tethering between iphone and macbook 00004
  2. テキストエディタでHammerspoonの設定ファイルが開かれます
  3. 下掲のスクリプトを追記
  4. 追記したスクリプト内の以下の部分を書き換え
    • ;——————————– 設定 ———————————-
      TETHERING_SSIDS = {“iPhone 7 Plus”, “iPhone 8 Plus”}
      PASSWORD = “0000”
      ;————————————————————————–
    • 「TETHERING_SSIDS」は、ファイアウォールをオンにしたいWiFi接続先のSSIDを列記していきます。一つの場合は「{“iPhone 7 Plus”}」というようにします
    • 「PASSWORD」はログイン中のユーザのパスワードです
  5. テキストエディタで保存
  6. メニューバー上にあるHammerspoonのアイコンをクリックし「Reload Config」を実行

動作確認

メニューバー上にあるHammerspoonのアイコンをクリックし「Console」を実行。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00006

WiFiテザリングを開始したり、別のWiFiアクセスポイントに接続したりすると、Consoleに実行状況のログが流れてきます。

How to stop packet loss due to icloud sync when tethering between iphone and macbook 00011

TETHERING_SSIDSに列記した接続先につながると自動的にファイアウォールがオンになり、それ以外の場合は、ファイアウォールが自動的にオフになるはずです。

ファイアウォールの動作状況を「システム環境設定>セキュリティとプライバシー>ファイアウォール」で確認する場合、いったんシステム環境設定を終了させないとファイアウォールのオン/オフ表示が反映されないのでご注意ください。

 - iOS, iPhone, Mac