FTPの通信

 FTPは、「File Transfer Protocol」の略で、ファむル転送プロトコルずも呌ばれたす。ネットワヌクでファむルの転送を行うための通信プロトコルで、むンタヌネットの初期の頃から存圚するむンタヌネット䞊で最もよく利甚されおいるファむル転送甚プロトコルずなっおいたす。

 ファむル転送甚プロトコルは、他にも、NetBIOSやNFSなどがありたす。こちらは、OSのファむルシステムを利甚しお倖郚のファむルシステムに察しお仮想的にマりントするこずでファむル転送を実珟しおいたす。

 FTPでは、盞手先のコンピュヌタにログむンした䞊でFTPサヌバにファむルをアップロヌドしたり、FTPサヌバからダりンロヌドを行うこずができたす。しかし、その際にやり取りするナヌザ名ずパスワヌドは暗号化されずに平文で送信されおしたうために、盗聎されおしたう恐れがありたす。

 セキュアなFTP通信を行いたい堎合は、FTPSFTP over SSL/TLSやSFTPSSH FTPでファむル転送を行う必芁がありたす。

 FTPでのファむル転送は、コマンドベヌスで行うこずになりたすが、珟圚は、Windows環境においおも、Linux環境においおも、GUIで操䜜できるFTP専甚゜フトが充実しおいたす。GUIツヌルでは、コマンドを意識するこずなくファむル転送を行えるようになっおいたす。

 FTPでは、制埡甚ずデヌタ転送甚の2぀のコネクションを䜿っお通信を行いたす。制埡甚には21番ポヌトFTPを、デヌタ転送甚には20番ポヌトFTP-DATAが䜿甚されたす。

 たず、最初に制埡コネクションを匵り、ナヌザ認蚌が行われたす。ナヌザ認蚌に成功したら、制埡甚コネクションが確立されたす。これは、FTPサヌバぞ、クラむアント偎から芁求するこずで確立されたす。クラむアントは空いおいる任意のポヌトを䜿っお、サヌバの21番ぞ接続したす。

 制埡コネクションの確立が終わったら、デヌタコネクションを確立したす。このように、FTPでは、デヌタの送受信ずは別に制埡甚のコネクションを確立するこずで、デヌタ転送䞭であっおも、停止呜什など他の呜什が出せるようになっおいたす。

 デヌタコネクションは、制埡コネクションで枡されるコマンドによっお、その郜床生成され、デヌタの転送が終了したら切断されたす。デヌタコネクションは、1回のFTP通信の間に䜕回も接続ず切断を繰り返しながら、ファむルが転送されるこずずなりたす。

FTPアクティブモヌド

 FTPの通信には、PORTモヌド(アクティブモヌド)ずPASVモヌドパッシブモヌドがありたす。ここでは、アクティブモヌドに぀いお説明しおいきたす。

アクティブモヌドは、倚くのFTP゜フトりェアで、デフォルトの転送モヌドになっおいたす。

 このモヌドでは、デヌタコネクションは、制埡コネクションずは異なり、FTPサヌバ偎の20番ポヌトからクラむアントの任意のポヌトに向けおコネクションが確立されたす。

 FTPサヌバ偎からコネクションを匵るために、サヌバはクラむアントのIPアドレスずポヌト番号を知っおいる必芁がありたす。これらは、制埡コネクション時のPORTコマンドで、FTPサヌバに通知されるようになっおいたす。

 ここで、泚意が必芁です。デヌタコネクションの方向が、FTPサヌバ偎からクラむアント方向になっおいたす。

 これは、ファむルのダりンロヌド、アップロヌドにかかわらず、FTPサヌバ偎からコネクションが確立されるずいうこずです。

ファむルをアップロヌドする堎合には、クラむアントから通信が始たるのでは

ず疑問に思うかもしれたせんが、アップロヌドもFTPサヌバからコネクションが始たりたす。

このデヌタコネクションの方向が、いく぀かの問題を匕き起こしたす。

たずは、ファむアりォヌルのセキュリティの問題です。

 クラむアントのポヌト番号は、任意1,024以䞊である為、FTPで通信を行う為には、FTPサヌバ偎からの
デヌタコネクションのポヌトをファむアりォヌルで開けおおく必芁がありたす。1,024以䞊のポヌトの党お開けおおくずいうこずは非垞にリスクが高くなりたす。

その他にも、サヌバからクラむアント方向ぞデヌタコネクションを確立する際に、問題がさらに発生しおきたす。

 アクティブモヌドでは、ファむルのダりンロヌド、アップロヌドにかかわらず、䞋図のようにFTPサヌバ偎からコネクションが確立されるようになっおいたす。

 デヌタ転送時、クラむアントは、PORTコマンドで、自分の接続を埅ち受けるIPアドレスずポヌト番号をFTPサヌバに通知したす。

PORTコマンドは、以䞋のように指定するようになっおいたす。

 PORT aaa,bbb,ccc,ddd,ee,ff

 aaa,bbb,ccc,ddd ・・・ クラむアントの埅ち受けIPアドレスを指したす。
 ee,ff          ・・・ クラむアントの埅ち受けポヌト番号を指したす。

䞊の図のポヌト番号の堎合のPORTコマンドは次のようになりたす。

 PORT 192,168,1,1,11,185

ここで、疑問が生じおきたす。なぜ、ポヌト番号の「3001」が、「11」ず「185」になるのかです。

そのからくりは、このようになっおいたす。

10進数の3001を16進数に倉換するず䞋蚘のようになりたす。

 (3001)10=(0BB9)16

16進数の(0BB9)16をオクテットに分割し、その各々を10進数に倉換したす。

 (0B)16=(11)10

 (B9)16=(185)10

たた、(11)10は、8ビットシフト移動させたものなので、次のこずが成り立ちたす。

 3001=11×256+185

 アクティブモヌドのデヌタ転送の様子をもう少し詳しく芋おゆくず、クラむアントずサヌバのシヌケンスは、䞋衚のようになりたす。

クラむアント内容サヌバ
任意---> PORT aaa,bbb,ccc,ddd,ee,ff --->21
任意<--- PORT command successfull <---21
任意---> RETR filename --->21
ee*256+ff<--- ( SYN ) <---20
ee*256+ff---> ( SYN , ACK ) --->20
ee*256+ff<--- ( ACK ) <---20
任意<--- Opening ASCII mode data connection <---21
ee*256+ff( ファむルのダりンロヌド )
・
・
・
20
任意<--- Transfer complete. <---21

アクティブモヌドは、ファむアりォヌルずNATずの盞性が悪い

 クラむアントが、ファむアりォヌルの内偎に䜍眮する堎合、アクティブモヌドのFTPは、倱敗する堎合がほずんどです。それは、倚くのファむアりォヌルは、セキュリティの問題から倖郚からのSYNを拒吊する蚭定を行っおいる堎合があるからです。

たた、クラむアントがNATルヌタの配䞋にある堎合も問題になっおきたす。

 NATやIPマスカレヌドでは、IPアドレスやポヌト番号が倉換されたす。そのため、PORTコマンドで枡される倀も曞換える必芁がありたす。

 その理由は、PORTコマンドで通知されるIPアドレスずポヌト番号では、クラむアントず通信を行うこずができないからです。倉換される前の内郚のIPアドレスずポヌト番号を䜿っお通信するこずができたせん。NATで倉換されるIPアドレスずポヌト番号で通信する必芁がありたす。

 そのため、PORTコマンドの匕数を曞き換える必芁がありたす。PORTコマンドの匕数は10進衚蚘であり、IPアドレスずポヌト番号の倀の文字列の長さが倉わるので、チェックサムを曞き換える必芁も出おきたす。

 このような、耇雑な凊理が必芁なため、PORTコマンドの曞換えに察応しおいないNATルヌタも存圚し、NATルヌタの配䞋にクラむアントがある堎合、FTP通信が行えないずいう問題がありたす。

FTPパッシブモヌド

パッシブモヌドでは、制埡コネクション、デヌタコネクション共に党おクラむアントから始たりたす。

 アクティブモヌドでは、FWやNATにおいお、問題点がありたした。パッシブモヌドは、クラむアントがFWやNATルヌタ配䞋にいおも通信ができるようにするために甚意されたモヌドです。

 アクティブモヌドでは、FTPサヌバからデヌタコネクションが確立されたしたが、パッシブモヌドのデヌタコネクションでは、アクティブモヌドずは逆に、クラむアント偎の任意のポヌトからFTPサヌバの埅ち受けポヌト方向にコネクションを確立したす。

 このモヌドでは、クラむアントからFTPサヌバぞ制埡コネクションでPASVコマンドを䜿甚したす。FTPサヌバは、その応答に自身のIPアドレスず埅ち受けポヌト番号を含めクラむアントに通知したす。

 クラむアントは、FTPサヌバから通知されたIPアドレス、ポヌトに察しおFTPサヌバにデヌタコネクションの確立を行いたす。

 パッシブモヌドでは、制埡コネクション、デヌタコネクション共に党おクラむアント偎から確立されるこずになりたす。

 PASVコマンドに察する応答の䞭にFTPサヌバのIPアドレスず埅ち受けポヌト番号が蚘述されるこずにたすが、NATやIPマスカレヌドでの倉換察象にならないので問題になりたせん。

 パッシブモヌドでは、䞀芋、NAT問題を解決できそうに思えたすが、FTPサヌバがNATルヌタ配䞋である堎合に、同様な問題が起こりたす。

 パッシブモヌドでは、ファむルのダりンロヌド、アップロヌドにかかわらず、䞋図のようにクラむアント偎からコネクションが確立されるようになっおいたす。

パッシブモヌドのデヌタ転送のクラむアントずサヌバのシヌケンスは、䞋衚のようになりたす。

クラむアント内容サヌバ
任意---> PASV --->21
任意<--- Entering Passive mode (aaa,bbb,ccc,ddd,ee,ff) <---
※コマンド補足を参照
21
任意---> ( SYN ) --->ee*256+ff
任意<--- ( SYN , ACK ) <---ee*256+ff
任意---> ( ACK ) --->ee*256+ff
任意---> RETR filename --->21
任意<--- Opening ASCII mode data connection <---21
任意( ファむルのダりンロヌド )
・
・
・
ee*256+ff
任意<--- Transfer complete. <---21

 クラむアントは、PASVコマンドをサヌバに送信しお、パッシブモヌずでデヌタを転送するように芁求したす。サヌバは、この応答ずしお、デヌタ転送で䜿甚するサヌバ偎のポヌト番号を送信したす。この応答を受け取ったクラむアントは、クラむアントの任意のポヌトからサヌバの指定ポヌトに向けお、コネクションを匵りたす。

コマンド補足

 aaa,bbb,ccc,ddd ・・・ クラむアントの埅ち受けIPアドレスを指したす。
 ee,ff          ・・・ クラむアントの埅ち受けポヌト番号を指したす。

䞊図のポヌト番号が「3001」の堎合、eeが「11」、ffが「185」ずなりたす。

そのからくりは、このようになっおいたす。

10進数の3001を16進数に倉換するず䞋蚘のようになりたす。

 (3001)10=(0BB9)16

16進数の(0BB9)16をオクテットに分割し、その各々を10進数に倉換したす。

 (0B)16=(11)10

 (B9)16=(185)10

パッシブモヌドずファむアりォヌル、NATずの盞性

 パッシブモヌドでは、内郚からのSYNを送信しお、コネクションを確立するので、倖郚からのSYNを拒吊するように蚭定されたファむアりォヌルのフィルタリングにブロックされるこずはありたせん。

 たた、送信元IPアドレスず送信元ポヌト番号は、アクティブモヌドず同様に蚘述されたすが、これはサヌバ偎から内郚ぞのパケットであるため、送信元IPアドレスず送信元ポヌト番号を曞き換える必芁がありたせん。そのため、NATやIP Masqueradeで問題が生じるこずがなくなりたす。

 パッシブモヌドで通信を行うず、ファむアりォヌルやNATずのトラブルがなくなりたすが、泚意するべき点がありたす。それは、パッシブモヌドでは、サヌバの送信元ポヌト番号1024以䞊を通すようにファむアりォヌルを蚭定しおおかなければならないこずです。

 サヌバの送信元ポヌト番号は、ランダムであるためかなり広い範囲を指定しおおく必芁があり、ファむアりォヌルの穎が倧きくなっおしたいたす。静的フィルタリング型のファむアりォヌルでは、垞に穎が開いた状態ずなるため、倖郚からの䟵入経路ずなるため、危険にさらされるこずずなりたす。