ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

ssh での接続がなんか遅い問題の対策

なんか知らんけど、前々からさくら VPS にある FreeBSD マシンへ SSH するときに限って、 なんか接続に時間がかかる。

ssh って打ってから公開鍵のパスフレーズを聞かれるまでに体感で 5 秒くらい待たされる。 でも2回目以降は他の場所にあるマシンと同じくらいのリズムでつながるようになる。

……あ~~~~~~~~これ絶対 DNS とか名前引きとかそういうアレだよー……タイムアウトしたりそれがキャッシュされたり忘れたりする挙動、これ絶対 DNS とかそういうやつだよ……

みたいなことを思いながら調べた時の記録。

まずは接続するときに ssh -vvv で接続する。 遅いときは最初にあるサーバからのあいさつが遅い。 つまり返事するまでにサーバが何かしてる。

次。 /etc/ssh/sshd_configLogLevel DEBUG3 にする。 過去のトラウマがフラッシュバックしつつ $ sudo /etc/rc.d/sshd restart & を叩く。 嫌な予感がする時は、最後におまじないのごとく & をつけるのがポイント。こいつがあれば大体救われる。

XXX XX 03:44:32 host sshd[19640]: debug3: Trying to reverse map address 240b:11:xxxx:xxxx:xxxx:xxxx:xxxx:xxxxx.
XXX XX 03:44:35 host sshd[19640]: Connection from <snip>

ほらー!なにこのタイムスタンプの不自然な間は!!! どうみてもクライアントの IPv6 アドレスを逆引きしようとしてタイムアウトしてんじゃん。

$ drill -x 240b:11:xxxx:xxxx:xxxx:xxxx:xxxx:xxxxx
;; Query time: 4267 msec

ほらぁー……

という訳で、原因が分かったので対策します。

今回は /etc/rc.conflocal_unbound_enable="YES" こういうことして、 unbound をローカル用のリゾルバにしてたので、そこに固定のレコードを入れることに。

/etc/unbound/unbound.confserver セクションに以下の行を追加。

local-zone: "0.0.0.2.0.e.4.d.1.1.0.0.b.0.4.2.ip6.arpa." static

そして

$ sudo /etc/rc.d/local_unbound restart
$ drill -x 240b:11:xxxx:xxxx:xxxx:xxxx:xxxx:xxxxx
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 23003
;; Query time: 1 msec

ほい。この IP アドレスは誰も返事を返しません。あきらめてください。

これで ssh での接続が格段に速くなりました。やったね。

……これでいいのか?