2017年11月01日
川俣晶の縁側ソフトウェア技術雑記 total 9435 count

Azure上のIISとFTPSでファイル転送する場合の罠

Written By: 川俣 晶連絡先

問題 §

  1. 「IISのFTPSはImplicitモードをサポートしない」は間違いであった。実際にはサポートする
  2. ftpとftpsにはサーバとクライアント以外に決定的な相違点があった
  3. Azure上でPASVモードを使用するには、追加のノウハウが必要

IISで使用するImplicitモード §

「まず訂正事項だ。以下のようにIISのFTPSはImplicitモードをサポートしないと以前書いたが間違っていた。確かに接続可能だった」

Subject: IISサーバにWinSCPとFTPSでファイル転送する場合の罠

Keyword: 【▲→川俣晶の縁側→ソフトウェア→技術雑記】

URL: IISサーバにWinSCPとFTPSでファイル転送する場合の罠

名前: 佐々木 緒

本文:

お世話になります。サイトを拝見しました。

IISでFTPSの待ち受けポートを設定することは可能です。したがってImplicitモードでの通信も可能です。

方法は単純に、サイトバインドで種類「ftp」、ポート「990」のバインドを追加すれ

ばOKです。ポート「20」との併用も可能です。

ただし、Windowsファイアウォールで受信規則「FTP Server Secure (FTP SSL Tra

ffic-In)」(990ポートの受信)と、パッシブモードであれば受信規則「FTP Server Passive (FTP Passive Traffic-In)」(ハイポートの受信)、アクティブモードであれば送信規則「FTP Server Secure (FTP SSL Traffic-Out)」(989ポートの受信)を許可する必要があります。

全て設定すれば、Explicit/Implicitおよびパッシブ/アクティブの組み合わせを問わず通信可能なFTPSサーバーを構成できます。便利ですね。

「確かに990で通信できた。ありがとう」

「良かったね」

ftpとftpsの相違点 §

「今回調査して分かったことだが、以下の2点の理由により実際に動作しない設定でも動作してしまう」

  • ftpのアクティブモードを特別扱いするファイアウォールやルータは多く、実はNATの内側でもルータの内側でもアクティブモードは動作してしまう
  • 接続に失敗するとモードを切り換えてリトライするクライアントが多い

「つまり、PASVモードで接続成功と思っていても、実はアクティブモードで接続しているケースがあり得るわけだね?」

「そうだ」

「なぜそれが問題の?」

「ftpsのトラフィックは暗号化されているので、同じように特別扱いはされない。つまり、ftpで上手く通信できている環境で、ftpsも通るとは限らない」

「それは問題を切り分ける場合の注意事項だね」

Azure上でPASVモードを使用できない問題 §

「AzureでPASVモードが使用できないので、じっくり調べたところ、思わぬことが分かった。どんなことだい?」

「PASVコマンドの応答して、以下のようなレスポンスが戻り、そこでデータチャンネルのIPアドレスとポート番号が指定される」

227 Entering Passive Mode (104,41,173,83,27,90).

「それで?」

「ところが、このIPアドレスはAzure仮想マシンのInternal IPでも、Public IPでもない。そのため、ftpsクライアントはサーバが存在しないIPアドレスに接続をトライして結果として接続できずにタイムアウトしていた」

「対策はなんだい?」

「IISマネージャの【FTPファイアウォールのサポート】の【ファイアウォールの外部IPアドレス】を、仮想マシンのPublic IPに書き換える。これで動作する」

「ftpsクライアントが正しいIPアドレスにアクセスしに行くからだね」

「そうだ」

「これで円満に解決?」

「いいや。そうじゃない。仮想マシンが持つIPアドレスは変化する可能性がある。だから、IPアドレスが変わってしまうとまた接続不能に戻ってしまう」

「えー」

「というわけで、ここから絶対IPアドレスに依存しないために更に一工夫が必要だ」

「そんなことが可能なのかい?」

「実は可能だ。WinSCPやfilezillaは、間違った設定で運用されているftpsサーバ対策として、PASVコマンドの応答としてローカルIPアドレスが指定されているときは、そのアドレスを使用せずコマンドチャンネルを接続したIPアドレスと同じIPアドレスを使うモードを持っている。デフォルトでオンだ。だから、これを使う」

「どう使うの?」

「IIS側で設定するIPアドレスをわざとプライベートIPアドレスに設定する。たとえば、IIS側のftp設定で【ファイアウォールの外部IPアドレス】を192.168.1.1に書き換える。すると賢いftpsクライアントはそれを検出してそのアドレスを使わないようにして、サーバ本来のPublic IPアドレスを使ってくれる」

「それで繋がるわけだね」

「WinSCPやfilezillaでその設定を切っていなければな」

補足 §

「ネットを検索すると、ftpで上手く転送できないときはアクティブモード固定に設定するというバッドノウハウが見つかるが、その意味は【頭のいいルータやファイアウォールがよろしくやってくれるからそれでオッケー】であって、よろしくやってくれないftpsでは正解から遠ざかるばかりだと分かった」

「ftpsを使うには、正攻法で正しいPASVモードを設定しないとダメだって事だね」

「そう、正しいPASVモードね。初期値がPASVモードというだけで、リトライしたときにアクティブモードで接続するような設定では上手く行かない」

「ftpでは動いてしまうのだね?」

「確実ではないが動いてしまう環境も多いようだ」

「でも、ftpsでは動かないのだね?」

「動かない。何しろトラフィックが暗号化されているからな。途中に入った機器が内容を理解することはできない」