なんか知らんけど、前々からさくら VPS にある FreeBSD マシンへ SSH するときに限って、 なんか接続に時間がかかる。
ssh
って打ってから公開鍵のパスフレーズを聞かれるまでに体感で 5 秒くらい待たされる。
でも2回目以降は他の場所にあるマシンと同じくらいのリズムでつながるようになる。
……あ~~~~~~~~これ絶対 DNS とか名前引きとかそういうアレだよー……タイムアウトしたりそれがキャッシュされたり忘れたりする挙動、これ絶対 DNS とかそういうやつだよ……
みたいなことを思いながら調べた時の記録。
まずは接続するときに ssh -vvv
で接続する。
遅いときは最初にあるサーバからのあいさつが遅い。
つまり返事するまでにサーバが何かしてる。
次。 /etc/ssh/sshd_config
で LogLevel 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.conf
で local_unbound_enable="YES"
こういうことして、
unbound をローカル用のリゾルバにしてたので、そこに固定のレコードを入れることに。
/etc/unbound/unbound.conf
の server
セクションに以下の行を追加。
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 での接続が格段に速くなりました。やったね。
……これでいいのか?