2016年8月4日

ブロードバンドタワー國武です。

今回はIPv6ネタに見せかけた、ちょっとしたトラブルシュートです。

以下は、CentOS7 でのお話しです。下記のように、鍵サーバにアクセスできないとエラーが出る場合があります。

$ sudo gpg --keyserver keys.gnupg.net --recv-key 62B4981F
gpg: 鍵62B4981Fをhkpからサーバkeys.gnupg.netに要求
gpgkeys: HTTP fetch error 7: Failed to connect to 2001:1af8:3100:b010:a000::1: Network is unreachable
gpg: 有効なOpenPGPデータが見つかりません。
gpg: 処理数の合計: 0

この結果を見ると

2001:1af8:3100:b010:a000::1: Network is unreachable

と表示されています。このサーバ自体は特にIPv6の設定はされていません。

エラーメッセージを読むと、 IPv6 の問題にも見えますが、実際は hkp が 11371番ポートを使っていて、内部から外部へのポート制限により、IPv4で接続しに行った時に、Connection refused がサーバに返されています。その後、IPv6にフォールバックするものの、経路がないので、network unreacable になって終了。出力結果には、IPv4 での Connection refused の結果は表示されず、最後のエラーだけが表示されています。

今回利用していた検証環境では、yum update のために外部に 80番ポートが開いていたので

$ gpg --keyserver hkp://keys.gnupg.net:80 --recv-key 62B4981F
gpg: 鍵62B4981Fをhkpからサーバkeys.gnupg.netに要求
gpg: /home/kunitake/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵62B4981F: 公開鍵"Fusiondirectory Archive Manager <contact@fusiondirectory.org>"をインポートしました
gpg:         処理数の合計: 1
gpg:           インポート: 1

とすることで、鍵を取り込むことができました(単純に keys.gnupg.net:80 にするだけでなく hkp:// を付与することも必要です)

ちなみに gpg は libcurl を使ってます。ということで curl でも試したところ

$ curl keys.gnupg.net:11371
curl: (7) Failed to connect to 2001:1488:ac15:ff90::146: ネットワークに届きません

と同じ結果が表示されます。IPv4 だけでの接続を強制すると

$ curl --ipv4 keys.gnupg.net:11371
curl: (7) Failed connect to keys.gnupg.net:11371; 接続を拒否されました

と、IPv4 で接続が失敗していることが見て取れます。今回は、tcpdump で実際の問題に気付きましたが、実際のトラブルと、エラーメッセージが一致しないので、知らないと少し戸惑ってしまいますね(挙動的に、IPv4からIPv6にフォールバックしているのも驚きでしたが)

少し気になってソースコードを追いかけましたが、この挙動は curl 7.34.0 にて修正……というより変更されました。7.33.0 から 7.34.0 の間に Happy Eyeballs の実装が入ったために、結果として期待されるようなエラーメッセージが表示されるようになったかと思います。

以上、簡単ですがご紹介まで。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: Koichi KUNITAKE

XenServerやLinux周りを触ってます。IPv6はボチボチ……