RTシリーズのTCP/IPに関するFAQ
ftpのpassiveモード(PASVモード)って何ですか?
| 最終変更日 | 2010/Jul/21 |
| 文書サイズ | 9.2KB |
ftpのpassiveモード(PASVモード)って何ですか?
FTPでは、制御用とデータ転送用で異なるTCPセッションを使用します。制御用
のTCPセッションは、FTPサーバ側のポート番号が21で、FTPクライアント側か
ら接続されます。これは通常、FTPクライアントを立ち上げている間、ずっと
つながりっぱなしです。
[ 制御・コネクション ]
FTPクライアント(3001) FTPサーバ(21)
| |
| 接続の始まり |
| 3001/tcp ------------> 21/tcp |
| |
| コマンドの送信 |
|------------------------------>|
| |
| コマンドの応答 |
|<------------------------------|
| |
※FTPクライアント側のポート番号は、環境に依存しており、仮に3001とします。
これに対して、データ転送用のTCPセッションは、制御用のTCPセッションで流 されるコマンドによってその都度生成され、データを転送し、それが終わると 切断されます。ですから、データ転送用TCPセッションは一回のFTP通信の間に 何度も接続と切断を繰り返します。
データ転送用TCPセッションは、通常FTPサーバ側のポート番号が20で、FTPサー バ側から接続されます。FTPサーバはFTPクライアントの接続先のポートを知る 必要がありますが、それは制御用TCPセッションで流されるPORTコマンドによっ てFTPサーバに通知されます。
[ 制御・コネクション ]
FTPクライアント(3001) FTPサーバ(21)
| |
| "PORT 192,168,0,1,11,186" |
|------------------------------>|
| (OK) |
|<------------------------------|
| |
[ データ・コネクション ]
FTPクライアント FTPサーバ
| |
| データ転送用接続の始まり |
| 3002/tcp <-------- 20/tcp |
| |
| GET時のデータ転送 |
|<------------------------------|
| |
※FTPクライアント側のポート番号は、環境に依存しており、仮に3002とします。ここで、PORTコマンドの書き方が問題になります。つまり、PORTコマンドは引 数としてFTPクライアントのIPアドレスとデータ転送用に待ち受けているポー ト番号を以下のような形で引数として持ちます。
"PORT a1,a2,a3,a4,p1,p2"
a1〜a4: IPアドレスの第1〜4オクテットを10進表記したもの
p1,p2: ポート番号の第1、第2オクテットを10進表記したもの
化けるわけではなく、数値の表現方法が異なるのです。
10進数表記の3002は、16進数表記で、0x0bbaになります。
0x0bと0xbaの2つのオクテット(バイト)に分け、10進数表記すると、
11(0x0b)と186(0xba)になります。
PORTコマンドなどでは、それらが文字列("PORT 192,168,0,1,11,186")として処理 されます。
ポート番号の変換例
| 10進数表記 | 16進数表記 | 第1オクテット | 第2オクテット |
|---|---|---|---|
| 1024 | 0x0400 | 4 (0x04) | 0 (0x00) |
| 1279 | 0x04ff | 4 (0x04) | 255 (0xff) |
| 1280 | 0x0500 | 5 (0x05) | 0 (0x00) |
| 3002 | 0x0bba | 11 (0x0b) | 186 (0xba) |
| 3003 | 0x0bbb | 11 (0x0b) | 187 (0xbb) |
| 60001 | 0xea61 | 234 (0xea) | 97 (0x61) |
| 64096 | 0xfa60 | 250 (0xfa) | 96 (0x60) |
NATやIP MasqueradeではIPアドレスやポート番号を変換してしまうため、 このPORTコマンドで渡されるものも書換えないといけません。 しかし、PORTコマンドの引数は10進表記であるため、値が変ると文字列の長さ が変ってしまいます。これを吸収するためにいろいろな工夫が行われるのです が、複雑な処理になるためバグになりやすいのです。
一方、PASVモードでは、データ通信用セッションは制御用セッションと同様に FTPクライアント側から張ります。そのために、PASVコマンドを使用します。
[ 制御・コネクション ]
FTPクライアント(3001) FTPサーバ(21)
| |
| PASV |
|------------------------------>|
| OK(133,176,200,51,4,255) |
|<------------------------------|
| |
[ データ・コネクション ]
FTPクライアント FTPサーバ
| |
| データ転送用接続の始まり |
| 3002/tcp --------> 1279/tcp |
| |
| GET時のデータ転送 |
|<------------------------------|
| |
※FTPサーバ側のポート番号は、環境に依存しており、仮に1279とします。この場合、PASVコマンドに対するレスポンスにFTPサーバのIPアドレスと待ち 受けているポート番号がPORTコマンドと同じように記述されますが、これは NATやIP Masqueradeでの変換対象にはなりません。だから、PASVだとバグには なりません。
[ ftp clientでpassiveモードに設定する方法 ]
マニュアルやメニューなどで、「passive」や「PASV」などの単語を
しらみ潰しで調べる。
各FTPサイトの登録毎に、[Sessionのプロパディ]→[Advanced]→ [Passive Transfers]をチェックする。
FTPサイトを登録する接続ダイアログ(接続先一覧ウィンドウ)で 「Use PASV Mode」あるいは「PASVを使用」にチェックを入れる ことで対応できるようです。
メインのウィンドウで、FTP → 設定 → オプションで開いた中で、 ファイアウォールのタブを選択すると「タイプ」の欄にPASVを選ぶとこ ろがあります。
プルダウンメニューから設定します。
[Customize]→[Prefence]→[Firewall]→[Use passive mode transfer (PASV)]を
チェックする。
# Shortcut毎の設定でなく、Fetchの動作モード設定のようです。
Bookmarkエディタでpassiveモードの設定項目があります。
"Can use passive FTP"で、[Yes]と設定します。
[ FAQ for RT-Series ]
[ FAQ for TCP/IP / files / IP-Filter / VPN(IPsec) / Intro / Install / Config ]