- ターミナルのsshは繋がるのに、FileZillaだけが同じホスト名で接続に失敗するという食い違いが起きました
- 原因は、FileZillaが.ssh/configを見ておらず、test-lubという名前をそのままOSに名前解決させようとしていたことでした
- 以前つながっていたのは、DHCPやBonjour/mDNSといったローカルネットワークの名前解決の仕組みが働いていたためだと考えられます
- dns-sdコマンドでtest-lub.localという名前なら解決できることが分かり、それをホストに指定して無事に接続できました
サーバの配置を変えたら、IPアドレスが変わりました。 .ssh/configのHostNameを新しいIPに書き換えると、ターミナルからのsshはすぐに繋がるようになった。 ところが、同じホスト名を使っているはずのFileZillaでは、次のエラーが出て接続できません。
コマンド: open "chii@test-lub" 12024
エラー: ssh_init: nodename nor servname provided, or not known
Code language: CSS (css)
ssh_initのエラーは、ホスト名またはサービス名が見つからないという意味です。 .ssh/configを直したのに、なぜFileZillaだけ取り残されるのか。
ログをよく見ると、FileZillaはopen "chii@test-lub" 12024という形でtest-lubという文字列そのものへ接続しようとしています。 .ssh/configのHost test-lub設定を読みに行った形跡がありません。 つまりFileZillaにとってtest-lubは、config内のエイリアスではなく、OSに名前解決を頼む生のホスト名として扱われています。
1. FileZillaは.ssh/configを見ていない
ここでいったん、FileZillaとOpenSSHの関係を整理しておく必要があります。 FileZilla公式のサイトマネージャーでは、接続先はホスト欄とポート欄に直接入力する形で管理されています1。 IPアドレス形式でもホスト名形式でも指定できますが、この欄はあくまでFileZilla自身が保持している設定です。
1.1. PuTTY系の血筋
FileZilla側の開発チケットでは、.ssh/configはOpenSSHの設定ファイルであり、FileZillaのSFTP機能はOpenSSHではなくPuTTY系のpsftpをベースにしていると説明されています2。 だからこそ、.ssh/config側でHostNameを書き換えても、FileZilla側のサイトマネージャーに保存されたホスト欄には反映されません。 片方だけ直して安心していたら、もう片方が古いままだった。 これが今回の食い違いの正体です。
解決そのものは単純で、サイトマネージャーの該当サイトを開き、一般タブのホスト欄をtest-lubから新しいIPアドレスに書き換えればつながります。 鍵ファイルの指定はログにすでにkeyfileとして出ていたので、そこは問題ありませんでした3。
2. なぜ以前はtest-lubで繋がっていたのか
ただ、腑に落ちない点が残ります。 これまでFileZillaでもtest-lubという名前で普通に接続できていたはずなのに、なぜ配置変更を境に急に解決できなくなったのか。
考えられるのは、以前はmacOS側でtest-lubという名前がなんらかの形でIPアドレスに解決できていた、ということです。 ルーターのDHCPやDNSが以前のIPに紐づけていた可能性、/etc/hostsに旧IPが書かれていた可能性、あるいはBonjourやmDNSといったローカルネットワーク上の名前解決の仕組みで見えていた可能性もあります。 Appleの説明でも、Macのローカルホスト名はローカルネットワーク上での識別に使われ、Bonjour対応のサービスに表示されるとされています4。
サーバの配置換えで、この名前解決の経路がどこかで切れた。 ターミナルのsshは.ssh/config内のHostNameを見るので影響を受けませんが、FileZillaはOSの名前解決に頼っているぶん、経路が切れた瞬間に接続できなくなったわけです。
2.1. 確認の手段はシンプルだった
この仮説を確かめるのに、大掛かりな調査は要りませんでした。 ターミナルでpingを打つか、次のようにdscacheutilで名前解決を直接確認すれば、macOS側でtest-lubが今どう解決されているか分かります。
dscacheutil -q host -a name test-lub
Code language: Bash (bash)
ここで何も返らなければ、現在の環境ではtest-lubという裸の名前は解決できていないということになります。 その場合、FileZilla側の対処は、ホスト欄をIPに直接書き換えるか、/etc/hostsにtest-lubとIPの対応を追加するかのどちらかです。
3. ネットワーク内から探し出す
サーバ側でip -aを見て新しいIPを確認できていたので、今回はホスト欄を直接書き換えるだけで解決できました。 ただ、もしIPが分からない状況で同じ問題に当たったらどうするか、という点も気になったので調べてみました。
FileZilla自体には、ネットワーク内を再検索してSFTPサーバを見つけるような機能は基本的にありません。 入力されたホスト名やIPへ接続するだけの道具なので、探索はmacOS側やルーター側で行うことになります。 もっとも確実なのは、ルーターの管理画面からDHCPクライアント一覧を見て、目的の機器のMACアドレスを探す方法です。
Macから探る場合は、まず自分のいるネットワーク範囲を確認します。
ipconfig getifaddr en0
Code language: Bash (bash)
Wi-Fi接続なら多くの場合en0です。 たとえば192.168.1.23と返ってきたら、同じネットワークはおおよそ192.168.1.0/24の範囲になります。
その範囲に対して、SFTPのポートである12024が開いている機器をnmapで探せます。
nmap -p 12024 --open 192.168.1.0/24
Code language: Bash (bash)
nmapが入っていない環境でも、macOS標準のncを使って総当たりで確認する方法があります。
for i in {1..254}; do nc -z -G 1 192.168.1.$i 12024 2>/dev/null && echo 192.168.1.$i; done
Code language: Bash (bash)
254台分を順番に叩くだけの、力技といえば力技のやり方です。 ネットワークのアドレス帯が違う場合は、192.168.1の部分を実際の帯域に合わせて変えれば同じように使えます。
3.1. test-lub.localで解決できた瞬間
もう一つ、Bonjour/mDNSの経路が生きているかを確かめる方法も試しました。 使ったのはdns-sdコマンドです5。
dns-sd -G v4 test-lub.local
Code language: Bash (bash)
実行すると、次のような結果が返ってきました。
Timestamp A/R Flags IF Hostname Address TTL
8:49:38.925 Add 40000002 6 test-lub.local. 192.168.10.127 120
test-lub.localという名前なら、192.168.10.127というIPにきちんと解決できています。 裸のtest-lubでは失敗し、.localを付けたtest-lub.localでは成功する。 この差が、原因を言い当てています。
.localはBonjour/mDNSが使うローカルネットワーク用の名前です。 FileZillaのホスト欄がOSの標準的な名前解決の仕組みに頼っている以上、そこにはtest-lubではなくtest-lub.localを渡すのが筋が通っています。 実際、ホスト欄をtest-lub.localに書き換えたところ、無事に接続できました。
固定のIPアドレスをそのまま書いてしまう手もありますが、サーバ側のIPが今後また変わる可能性を考えると、test-lub.localのようにmDNS経由で解決される名前を使っておいたほうが、次の配置換えのときに慌てずに済みそうです。 一つのツールがつながらないというだけの出来事の裏に、OpenSSHとPuTTY系、DNSとmDNSという、それぞれ別の名前解決の仕組みが重なっていました。 普段は意識しない層が、ネットワーク構成が変わった瞬間に一斉に顔を出してくる。 そういう場面に出くわすのは、地味に面白いものです。
- FileZilla公式ドキュメントでは、Host欄にIPアドレス形式またはホスト名形式でサーバーアドレスを入力し、必要な場合はPort欄にポート番号を入力すると説明されています。 – How to connect to an SFTP Server
- FileZillaの開発チケットでは、~/.ssh/configはOpenSSHの設定ファイルであり、FileZillaはOpenSSHを使わず、そのSFTP機能はPuTTYのpsftpをベースにしていると回答されています。 – #8450 (FileZilla should parse and follow ~/.ssh/config directives when using SFTP)
- FileZillaでは、サイトマネージャーのログオンタイプを「Key file」にして秘密鍵を指定するほか、設定のConnection→SFTPから鍵ファイルを追加する方法もサポートされています。 – How to Use SFTP (SSH File Transfer Protocol)
- Apple公式サポートでは、ローカルホスト名はMacの名前に.localを加えたもので、Bonjour対応サービスにMacを識別させる役割を持つと説明されています。 – Change your computer’s name or local hostname on Mac
- dns-sdはmacOSに搭載されたネットワーク診断ツールで、pingやtracerouteと同様にmDNSやDNSサービスディスカバリーの動作を対話的に確認するために使われます。 – dns-sd(1) osx man page