🎉

【Ruby】gem のインストールの際に IPv4 のフォールバックを設定する

に公開

自宅の光回線で gem をインストールしようとしたところ、ネットワークのタイムアウトエラーに遭遇した。いろいろ調べた結果、~/.gemrc:ipv4_fallback_enabled: true を追加することでインストールできるようになった

echo ":ipv4_fallback_enabled: true" >> ~/.gemrc

~/.gemrc の設定項目は Gem::ConfigFileマニュアルに記載されている。Gem::ConfigFile は lib/rubygems/config_file.rb で定義されている。

ほかの方法として /etc/gai.conf を編集して api.rubygems.org の IPv6 の優先順位を下げる方法もあるそうだ。具体的な設定ファイルの例は stackoverflow の回答に記載されている。

IPv6 のアドレスを調べるには dignslookup を使う。Debian であれば次のコマンドでインストールできる

sudo apt install dnsutils

次のコマンドで IPv6 のアドレスを調べてみる

dig AAAA rubygems.org +short
rubygems.org
2a04:4e42:200::483
2a04:4e42::483
2a04:4e42:400::483
2a04:4e42:600::483

ネームサーバーを指定することもできる

dig AAAA @8.8.8.8 rubygems.org +short

Ruby 3.4 では Socket モジュールは Happy Eyeballs Version 2 (RFC8305) に対応するという[1]。IPv6 と IPv4 の両方で問い合わせをして応答の速かったほうが採用されるという

1 https://github.com/ruby/ruby/pull/9374

Discussion