暗号化通信があたりまえの昨今ですが、いまだにFTPが利用される場面が少なくありません。しかしご存じの通りFTPはNAT環境ではトラブルの元となります。
そこで、FTP絡みのトラブルシューティングに備えてFTPプロトコルの動きについてまとめようと思います。
目次
FTPの2種類の通信
FTPには「コントロール通信」と「データ通信」という2種類の通信があります。
コントロール通信
コントロール通信はコマンドの実行要求と応答で利用されます。
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クライアントへ接続する通信が遮断されてしまうためです。
このような場合の解決策はふたつあります。
- パッシブモードでデータ転送する
- クライアント側のFW設定を変えてFTPデータ通信を許可する
また、ネットワーク機器のACLでデータ通信を許可する設定を入れていない場合もデータ通信が失敗します。アクティブモードとパッシブモードではACL設定がまったく異なるので、FTP通信をおこなう場合は事前にどちらのモードで通信するのか決めておいた方が良いでしょう。
アドレス・ポート変換でトラブルが起きる(NAT環境)
NAT環境ではPORTコマンドで通知するIPアドレスやポート番号がNAT後のものと異なることがあり、そのような環境ではトラブルが発生します。
ネットワーク機器の中にはNATする際にPORTコマンドで通知するIPアドレスとポート番号を書き換えてくれるものがありますが、そのような機能がない場合はFTPのデータ通信に失敗します。
FTPのデータ通信が失敗する場合は経路上のネットワーク機器のACLやNATの設定を見直していくことになるでしょう。最終的にはパケットキャプチャしてPORTコマンドでのやり取りを調査することになるかも知れません。
FTPの利用が分かっている場合はNATする際に注意する必要があります。
おしまいに
FTPは前時代的なプロトコルですが、いまだに新規構築でFTPを採用することがあります。これは顧客の要望もあり仕方がないことなので、インフラエンジニアの方はトラブルシューティングのためにもFTPプロトコルについて最低限の知識を持っていた方が良いかと思います。
できればtcpdumpやWireSharkでFTP通信がどのようにおこなわれているのか実際に目で見ておくとトラブルシューティングの際に役立つこと間違いありません。
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント