FTPの動作モードのアクティブモードでNAPTでうまくいかないことについて、少し調べる機会があったのでその備忘録です。
参考
FTPはネットワーク層に信頼性の高いTCPを使う
データ転送でパケットロスの可能性があったら嫌だよね。
TCPならパケットの再送も面倒見てくれるよ。
2つのコネクションについて
FTPはクライアントとサーバの間で2つのTCPコネクションを張る。
最初に制御用コネクションを張り、その後データ転送用コネクションを張る。
制御用コネクション
コマンドの送信、結果の受信用のコネクション。
クライアントからサーバの21番ポート宛てにTCPのコネクションの確立を行う。
データ転送用コネクション
実際にデータを転送するコネクション。
クライアントとサーバ間のデータ転送用コネクションの確立手順には2つの異なる動作モードがある。
動作モードについて
データ転送用コネクションを確立する手順にはアクティブモードとパッシブモードがある。
これはサーバ目線の言い方だと思われる。
サーバが動的にクライアントへデータ転送コネクションを確立しに行くのがアクティブ(動的)、サーバがデータ転送コネクションの確立を待つのがパッシブ(受け身)。
アクティブモード
アクティブモードの具体的な流れを見てみる。
クライアントが制御用コネクションを使って、「データ転送用コネクション用の俺のポートはこの番号だぁ!!」とサーバに教え、サーバからの接続を待ち受ける。
サーバは、教えてもらったポート番号宛てにデータ転送用コネクションを確立しにいく。
これだとクライアント側のポート番号がそのときによって変わるので途中の経路でNAPT・PATが使われている場合、うまくいかないことがある。
(その辺りをよしなに変換してくれる機器もあるらしい。)
アクティブモードの通信イメージ
- クライアント「(サーバに対して)データ制御用コネクションを確立させて」
↓ - サーバ「OK」
↓ - クライアント「よし、制御用コネクションはOKだな。次はデータ転送用コネクションを確立しよう。データ転送用コネクション用の俺のポート番号はAだぁ!!」
↓ - サーバ「クライアントのポート番号はAね、はいよ。じゃあポート番号A宛てにデータ転送コネクションを確立しますよ。」
↓ - サーバがクライアント宛てにデータ転送コネクションを確立しようとする
↓ - サーバ「クライアントのポート番号A宛にデータ転送コネクションを確立しよう・・・。」
↓ - NAPT・PAT(ルータとかL3SWでクライアント宛てのポート番号Xにしれっと変換される)
↓ - クライアント「あれ?なんかポート番号X宛てに要求が来たぞ。こんなの知らねぇ。こっちはポート番号Aって通知しているからポート番号Aで待ち受けるぞ。早くサーバからデータコネクションの確立要求こないかな♪」
↓ - そのまま通信できない状態となる
↓ - サーバ「なんだ、クライアントから応答ないじゃん。あっちからデータ転送用コネクションの要求してきたくせに!!もう時間切れ!タイムアウトだ!」
↓ - サーバが制御用コネクションを使って強制的にコネクションを切断する。
↓ - クライアント「あれれ~~~?」
↓ - タイムアウトになる
だいたい↑こんな流れ。
アクティブモードではどうやってポートを通知している?
クライアントからサーバ宛てのデータ転送コネクションのポート番号通知の通信をのぞいてみると、こんな風になっている。
これは「192.168.1.1のIPアドレスでポートは1028で待ち受けているからよろしく」という意味。
4,4のところがポート番号1028を表す。
PORTコマンドを使ってIPアドレスの1~4オクテットをカンマで区切ったもの + クライアントが提案したポートの16進数を2桁に分割して10進数で表したものをカンマでつなげたものをクライアントが送りつけている。
わかりづらい。
ポートのところがわかりづらい。
というわけでExcelの関数を使って変換するにはこんな感じにするといいかも↓。
計算式
パッシブモード
イマドキのFTPクライアントのデフォルト設定は基本的にこっちです。
制御用コネクションもデータ転送用コネクションもクライアントからコネクション確立要求をする。
途中のNAPT・PATでポート番号が変換されても、クライアントから通信を開始しているので問題なく通信が可能となっている。
ひとこと
いまどきアクティブモードを使うこともなかろうかと思いますが、まぁ色々な事情がありますね。
枯れっ枯れの技術(誉め言葉)であるFTP、歴史があるため組織の資産の中には「え!?こんな使い方を!?」ということがありますね。
ニッチな内容ですがネットワークは面白いですね。
というわけで、ここまでお読みいただきありがとうございました。