4月14日、著者が「Modifying FileZilla to Workaround Bambu 3D Printer's FTP Issue」と題した記事を公開した。この記事では、Bambu 3DプリンターのFTPサーバーが返す無効なIPアドレス(0.0.0.0)によってFileZillaでファイル一覧を取得できない問題を、ソースコード改修で解決する方法について詳しく紹介されている。以下に、その内容を紹介する。
FileZillaで接続できない問題の正体
著者がBambu A1 Mini 3DプリンターをFileZillaで接続した際、ユーザー名とパスワードは正しくログインできるものの、ファイル一覧の取得時に「connection refused」エラーが発生した。Bambu公式フォーラムでも複数のユーザーが同様の問題を報告している。
WindowsのWinSCPでは動作するという報告があったが、著者はLinuxを使用しているため、根本原因を調査することにした。
問題の核心は、FTPのパッシブモード(PASV)でのサーバーレスポンスにある。通常のFTPサーバーは以下のような形式で応答する:
227 (192,168,1,1,7,232)
しかし、Bambuのプリンターは以下のように応答していた:
> PASV
< 227 (0,0,0,0,7,232)
最初の4つの数字が全て0、つまりIPアドレス0.0.0.0を返しているのが問題だった。
0.0.0.0が引き起こすOS別の動作差
0.0.0.0は「このマシンの全IPアドレス」を表す特殊なアドレスで、RFC 1122によると接続先としては無効である。各OSでの動作は以下の通り:
- Windows:
WSAEADDRNOTAVAILエラーで接続失敗 - macOS/Linux:
127.0.0.1(ローカルホスト)への接続にリダイレクト
LinuxではローカルマシンにFTPサーバーがないため、ECONNREFUSEDエラーが発生していた。
WinSCPには「パッシブ接続でIPアドレスを強制する」設定があり、これによってサーバーから返されるIPアドレスを無視してポート番号のみを使用できるため、偶然この問題を回避できていた。
FileZillaソースコード解析と改修
FileZillaには設定不良のFTPサーバー向けの特別処理ロジックが存在する。src/engine/ftp/rawtransfer.cppのCFtpRawTransferOpData::ParsePasvResponse()関数で実装されている:
if (!fz::is_routable_address(host_) && fz::is_routable_address(peerIP)) {
if (options_.get_int(OPTION_PASVREPLYFALLBACKMODE) != 1 || bTriedActive) {
log(logmsg::status, _("Server sent passive reply with unroutable address. Using server address instead."));
log(logmsg::debug_info, L" Reply: %s, peer: %s", host_, peerIP);
host_ = peerIP;
}
// ...
}
しかし、is_routable_address()関数は**0.0.0.0をプライベートIPではなくパブリックIPと判定**するため、この特別処理が動作しない。
著者は以下のパッチを作成して問題を解決した:
std::wstring const zeroIP = fz::to_wstring(std::string("0.0.0.0"));
if (
std::wcscmp(host_.c_str(), zeroIP.c_str()) == 0
|| (!fz::is_routable_address(host_) && fz::is_routable_address(peerIP))
) {
if (options_.get_int(OPTION_PASVREPLYFALLBACKMODE) != 1 || bTriedActive) {
log(logmsg::status, _("Server sent passive reply with unroutable address. Using server address instead."));
log(logmsg::debug_info, L" Reply: %s, peer: %s", host_, peerIP);
host_ = peerIP;
}
この改修により、**0.0.0.0が返された場合は常にサーバーの実際のIPアドレスを使用する**ようになる。
パッチ適用後にFileZillaを再コンパイルしたところ、正常にプリンターのFTPサービスにアクセスできるようになった。
接続設定の詳細
記事の末尾では、Bambu 3DプリンターのFTP接続設定も紹介されている:
- ホスト:
ftps://[プリンターのIPアドレス] - ユーザー名:
bblp - パスワード: プリンター設定のLANページで確認できる8桁のアクセスコード
- ポート:
990 - 暗号化:
Require implicit FTP over TLS
なお、FTP使用にはLANモードの有効化は不要で、有効化するとBambuクラウド機能が停止するため注意が必要だ。
この記事は、単なる設定変更では解決できない問題をプロトコルレベルで分析し、ソースコード改修で根本解決するエンジニアリングアプローチを示している。3Dプリンター界隈でも同様の問題に直面している開発者にとって有用な情報といえる。
詳細はModifying FileZilla to Workaround Bambu 3D Printer's FTP Issueを参照していただきたい。