開発者向け
MacでSSHやGitがタイムアウトする
SSHとGitには、サーバへの正常なTCP接続が必要です。ポート22をブロックするネットワーク、壊れたIPv6経路、プロキシがあると、接続が止まることがあります。
症状
git pushやgit cloneがしばらく待ったあと、「Operation timed out」と表示されます。sshで、あるネットワークでは「Connection timed out」と表示され、別のネットワークではつながります。- SSHセッションが、何分か操作しないでいると固まります。
- HTTPSのGitリモートは使えるのに、SSHのリモートは使えません。
考えられる原因
- ポート22がブロックされている。会社、ホテル、公共のネットワークの中にはSSHをブロックするものがあります。GitHubも、ファイアウォールがSSH接続を拒否することがあると説明しています。
- IPv6の経路が壊れている。MacはまずIPv6を試します。IPv6が機能しないと、接続が待たされます。
- アイドル状態の接続が切られる。ルーターやファイアウォールは、しばらくデータを送らない接続を切断することがあります。
- プロキシが必要。会社のネットワークでHTTPSのGitを使うには、
http.proxyやプロキシ環境変数が必要な場合があります。
確認方法
詳細な出力付きで接続します。最後の数行で、接続がどこで止まっているかがわかります。
ssh -vT git@github.comTCPポートだけを、タイムアウト5秒でテストします。
nc -vz -G 5 github.com 22IPv4のみで試します。これでつながるなら、IPv6の経路が問題です。
ssh -4 -T git@github.comポート443でGitHubのSSHサービスをテストします。
ssh -T -p 443 git@ssh.github.comGitのプロキシ設定とプロキシ環境変数を表示します。
git config --get http.proxy env | grep -i proxy
解決方法
ポート22がブロックされている場合は、GitHubにポート443経由のSSHを使います。
~/.ssh/configに次のブロックを追加します。Host github.com Hostname ssh.github.com Port 443 User gitIPv6が失敗する場合は、そのホストにIPv4を使います。
~/.ssh/configのそのホストのブロックにAddressFamily inetを追加します。アイドル状態のセッションを維持するには、60秒ごとにメッセージを送ります。ホストのブロックに
ServerAliveInterval 60を追加します。長く待たされないようにするには、ホストのブロックに
ConnectTimeout 10を追加します。プロキシの内側でHTTPSリモートを使う場合は、Gitのプロキシを設定します。
git config --global http.proxy http://proxy.example.com:8080テストとして、リポジトリのSSH URLの代わりにHTTPS URLを使います。
Kilobatを使う場合
Kilobatの接続チェックはIPv4とIPv6を別々にテストするので、IPv6の経路が壊れていればはっきりわかります。
kilobat why github.com1つのプロセスが開いている接続を確認します。
kilobat destinations --pid 12345
よくある質問
ssh -4ではつながるのに、普通のsshではつながらないのはなぜですか?
MacがまずIPv6を試し、そのIPv6の経路が機能しなかったためです。-4を付けると、sshはIPv4だけを使います。
ServerAliveIntervalは何をするのですか?
データのない状態が指定の秒数続くと、sshが接続を通じてメッセージを送ります。デフォルトは0で、何も送りません。
出典
- GitHub Docs:Using SSH over the HTTPS port
- ssh(1)とssh_config(5)、macOS 27.2に付属のmanページ
- nc(1)、macOS 27.2に付属のmanページ
- git-config(1)、http.proxy、macOS 27.2に付属のmanページ(Git 2.56)
出典は2026年10月29日に確認しました。manページはmacOSに付属のものです。「ターミナル」でman <name>を実行すると開けます。