トラブルシューティングのためのFTPプロトコル解説

暗号化通信があたりまえの昨今ですが、いまだにFTPが利用される場面が少なくありません。しかしご存じの通りFTPはNAT環境ではトラブルの元となります。

また、FW(ファイアウォール)で遮断されて通信できない、というトラブルもよく発生します。

ジョージ

FTPが出てくると、大抵トラブルが発生します。

そこで、FTP絡みのトラブルシューティングに備えて、インフラエンジニアが知っておくべきFTPプロトコルの動きについてまとめました。

目次

FTPの2種類の通信「コントロール通信」「データ通信」

FTPには「コントロール通信」と「データ通信」という2種類の通信があります。

コントロール通信

コントロール通信はコマンドの実行要求と応答で利用されます。

FTPログインの様子

FTPクライアントがサーバーへの接続に成功すると、次のような流れでFTPログインがおこなわれます。

FTPログインの様子

FTPクライアントはUSERコマンドでユーザー名を送信し、それを受けてサーバーはパスワードを要求します。FTPクライアントがパスワードを送信し認証に成功するとログイン処理は完了します。

これらはすべてコントロール通信でおこなわれています。

データ通信

データ通信はデータを送受するためのもので「アクティブモード」と「パッシブモード」という2種類の通信モードがあります。

通信モードの違いはコネクションを張る方向の違いです。

アクティブモードとは

アクティブモードはFTPサーバーからFTPクライアントへ向けてデータ通信のための接続を開始します。

アクティブモードでは「データ通信用のIPアドレスとポート番号」をFTPクライアントからサーバーへ通知します。

以下はアクティブモードで mytext.txt というファイルをダウンロードする際のフロー図です。破線がデータ通信をおこなっている箇所です。

アクティブモードで通信している様子

アクティブモードではFTPクライアントはPORTコマンドで接続するべきIPアドレスとポート番号をFTPサーバーへ通知します。

PORT 192,168,0,203,199,239

このコマンドの最初の「192,168,0,203」がIPアドレスとなります。

192,168,0,203 → 192.168.0.203

残りの「199,239」がポート番号です。ポート番号は次のように計算します。

199 x 256 + 239 = 51183

最初の「199」に256を掛けて、残りの「239」を足した結果が「51183」となります。

FTPサーバーはポート20番(FTP-DATA)からFTPクライアントのポート51183番へ向けてTCP接続をおこないデータ転送します。

パッシブモードとは

パッシブモードはFTPクライアントからFTPサーバーへ向けてデータ通信のための接続を開始します。

パッシブモードでは「データ通信用のIPアドレスとポート番号」をFTPサーバーからFTPクライアントへ通知します。

以下はパッシブモードで mytext.txt というファイルをダウンロードする際のフロー図です。破線がデータ通信をおこなっている箇所です。

パッシブモードで通信している様子

最初にFTPクライアントがPASVコマンドでパッシブモードへの移行を要求しています。

FTPサーバーがパッシブモードを受け入れると接続するべきIPアドレスとポート番号をFTPクライアントへ通知します。

227 Entering Passive Mode(192,168,0,101,79,42)

アクティブモードのときと同様に接続するべきポート番号を計算できます。

79 x 256 + 42 = 20266

アクティブモードではFTPクライアントがFTPサーバーのポート20266番へ向けてTCP接続をおこないデータ転送します。

ジョージ

サーバーが自分から接続するなら「アクティブモード」、サーバーが接続を受けるなら「パッシブモード」というように”サーバー目線”で捉えると覚えやすいですね!

FTPでよくあるトラブル

FTPはトラブルが発生することが多いプロトコルです。特に通信経路上でアドレス変換やポート変換をしているとFTPのデータ通信で問題が発生します。

ケース① lsコマンドがタイムアウトする

よく見かけるトラブルのひとつがFTPログインした後に”ls”コマンドを実行するとタイムアウトしてしまうものです。

これはパソコンで発生することが多く、クライアント側が内向けの通信をすべて遮断するようなファイアウォール設定になっている場合に発生します。

原因はアクティブモードでデータ通信をしようとした際にFTPサーバーからFTPクライアントへ接続する通信が遮断されてしまうためです。

このような場合の解決策はふたつあります。

  1. パッシブモードでデータ転送する
  2. クライアント側のFW設定を変えてFTPデータ通信を許可する

また、ネットワーク機器のACLでデータ通信を許可する設定を入れていない場合もデータ通信が失敗します。

アクティブモードとパッシブモードではACL設定がまったく異なるので、FTP通信をおこなう場合は事前にどちらのモードで通信するのか決めておいた方が良いでしょう

事前に「アクティブモード」か「パッシブモード」か、どちらで通信するのか決めておくとトラブルを回避しやすい。

ケース② アドレス・ポート変換でトラブルが起きる(NAT環境)

NAT環境ではPORTコマンドで通知するIPアドレスやポート番号がNAT後のものと異なることがあり、そのような環境ではトラブルが発生します。

ネットワーク機器の中にはNATする際にPORTコマンドで通知するIPアドレスとポート番号を書き換えてくれるものがありますが、そのような機能がない場合はFTPのデータ通信に失敗します。

FTPのデータ通信が失敗する場合は経路上のネットワーク機器のACLやNATの設定を見直していくことになるでしょう。最終的にはパケットキャプチャしてPORTコマンドでのやり取りを調査することになるかも知れません。

FTPの利用が分かっている場合はNATする際に注意する必要があります。

NATとFTPの相性はよくないので、FTPを使う際はNW機器のNATの仕様を事前に調べたり検証しておくとトラブルを回避しやすい。

おしまいに

FTPは前時代的なプロトコルですが、いまだに新規構築でFTPを採用することがあります。

これは顧客の要望もあり仕方がないことなので、インフラエンジニアの方はトラブルシューティングのためにもFTPプロトコルについて最低限の知識を持っていた方が良いかと思います。

できればtcpdumpやWireSharkでFTP通信がどのようにおこなわれているのか実際に目で見ておくとトラブルシューティングの際に役立つこと間違いありません。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

氷河期世代ど真ん中。
高卒フリーターからブラック企業を経てITエンジニアに転職。
リーマンショックのときは派遣切りにも遭いました!
36歳でフリーランスに転向し、現在は年収1200万円を突破!
年収アップを応援するWEBサイトを運営しています。

コメント

コメントする

目次