web-dev-qa-db-ja.com

新しい証明書を作成するときのPuppetエージェントの遅延

root@testpgmaster:/# puppetd --test
info: Creating a new SSL key for testpgmaster
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for ca
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
info: Creating a new SSL certificate request for testpgmaster
info: Certificate Request fingerprint (md5): C9:83:59:EF:6A:B8:16:31:B6:92:5D:70:F1:67:39:4F
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled
root@testpgmaster:/# 

これは通常の出力であり、結果は予想どおり、証明書要求が適切に作成されます。問題は、警告が表示されるたびに、約2分の遅延があることです。

Straceを使用して同じコマンドを実行すると、混沌としたstrace出力で、次のようになります。

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 6
fcntl(6, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(6, {sa_family=AF_INET, sin_port=htons(8140), sin_addr=inet_addr("10.0.2.15")}, 16) = -1 EINPROGRESS (Operation now in progress)
...
[lots of intermediate output]
...
select(7, [6], [], [], {119, 999900})   <- The pause occurs here

AFAIU、これは、操り人形マスターが何かに応答するのを待っている間、ブロックすることを意味します。

PuppetmasterはApache2でパッセンジャーを実行し、ポート8140でリッスンします。ファイアウォールもありますが、ポート8140でエージェントが許可されます。実際、エージェントは、マスターとして機能するマシン内で実行されるopenvzコンテナーです。コンテナはNATを使用し、ホストは転送を行います。これらすべての設定に問題がある可能性はありますが、問題は「警告:ピア証明書が検証されません」というメッセージが表示された場合にのみ発生します。このSSLセッションで」;他のすべての場合、すべてが問題なく実行されます。

この問題は、パペットマスターがIPアドレスからクライアントの名前を解決しようとしたときに発生しました。ファイアウォールの設定ミスが原因で、着信UDPパケットがフィルタリングされていました。これは、DNSクエリが最終的にタイムアウトしたことを意味します。

ネットワークタイムアウトであると思われるため、パペットマスターでwiresharkを実行して問題を特定し、一時停止の直前に発生したいくつかのパケットを調べて原因を特定したいと考えました。確かにそれはうまくいった。 DNSの完全な障害が他の問題を引き起こさなかったのは奇妙です。 1つの理由は、aptプロキシを使用していたことです。つまり、apt-getはDNS要求を行いませんでした。