2008年4月4日金曜日

NAT ファイアウォールを通して FTPS を使用したい

[http://www.nsoftware.com/kb/showentry.aspx?entry=09260707]

該当製品:


  • IP*Works!


現象:


NAT ファイアウォールを通して FTPS を使用したい

解決法:


NAT ファイアウォールを通しての FTPS の使用には問題があります。なぜならインターネットプロトコルの多くとは異なり、FTP はソケットコネクションを1つではなく2つ必要とするからです。第1のコネクションは制御コネクション (control connection) と呼ばれるもので、クライアントとサーバの間のコマンドとその応答は全てこのコネクション上で交わされます。第2のコネクションはデータコネクション (data connection) と呼ばれるもので、データ (ファイルおよびファイル一覧) を交換するためのものです。

そしてデータコネクションを設定するには、アクティブモードとパッシブモードの2つの方法があります。アクティブモードでは、データコネクションはサーバからクライアントに向けてオープンされます (つまりクライアントはサーバからのコネクションをリスンすることになります)。一方パッシブモードは丁度その反対で、クライアント側からサーバに対しコネクションをオープンします (つまりサーバ側がクライアントからのコネクションをリスンすることになります)。このパッシブモードが、特に SSL 接続のためには必要となります。

通常の暗号化されていないパッシブモードにおける FTP データコネクションは次のように構成されオープンされます:

CLIENT → SERVER: PASV
SERVER → CLIENT: 227 OK, Entering Passive Mode (193,12,1,121,15,6)


クライアントが PASV コマンドを送信するとサーバは "OK" と応答し、クライアントに対し自身の IP アドレスとリスンしているポート番号を通知します。カッコ内の最初の4オクテットはドット表記の IP アドレス (193.21.1.121) を表し、最後の2オクテットがポート番号 (15 × 256 + 6) = 3846 を表しています。この時点でサーバはデータコネクションをリスンしており - クライアントは次のステップとして双方向のデータ転送を開始できるように当該コネクションを張ることが可能となります。

さて、ここで NAT (Network Address Tranlation) を間に挟んでみましょう (CLIENT → NAT → SERVER)。この場合、通信は次のようになるでしょう。

CLIENT-->NAT: PASV
NAT-->SERVER: PASV
SERVER-->NAT: 227 OK, Entering Passive Mode (10,0,1,121,15,6)
NAT-->CLIENT: 227 OK, Entering Passive Mode (193,21,1,121,15,6)


これを見てお分かりのように、NAT は PASV コマンドに対するサーバの応答を覗き見しなければなりません。つまり、NAT はサーバが 10.0.1.121 のポート 3846 でリスンしていることを理解します。しかしこの例では、サーバはクライアントからは到達不可能なプライベートアドレスになっています。そして、NAT にはクライアントと通信可能なパブリックアドレスが割り当てられています。従って、NAT はサーバの応答を自分自身の応答で置き換えて、クライアントに対し NAT のアドレスとポートに対してコネクションをオープンするよう伝えます。そしてその次には当然、NAT がそのアドレスとポートに対するコネクションを受け取ったらその接続を FTP サーバの IP アドレスとポートに対しフォワードすることになります。

ここで別の厄介な問題が発生します。SSL ではどうなるのでしょうか。NAT は PASV 応答を覗き見することも、それを書き直すこともできません。従ってクライアントはファイアウォールの向こう側の、アクセス不可能な IP アドレスに対するデータコネクションを開こうとしてしまうことになります。

ではこれに対する解決法はあるのでしょうか? FTP サーバによっては、パッシブモード時に使用する IP アドレス (およびポート範囲) を管理者が指定できるようになっているものがあります。この場合、管理者はそのパブリック IP アドレスを設定することになるでしょう。また NAT によっては特定のポート範囲を自動的に固有のマシン/ポートにフォワードするよう管理者が設定できるものもあります。従って管理者がこのポート範囲を当該 FTP サーバが使用するパッシブポート範囲に一致するよう設定できれば、問題は解決するでしょう。別の解決法としては、EPSV (Extended Passive Mode) コマンドを使用するように設定する方法があります。この EPSV コマンドはポート番号のみを送信し、IP アドレスは制御コネクションの IP アドレスをそのまま使用します。IP*Works! の FTPS コントロールは UseEPSV 構成オプションをサポートしており、これを TRUE に設定することで対応可能です。

0 件のコメント: