none
プログラムからFTP.exeを呼び出して使う場合のファイアーウォール例外設定方法

    質問

  • プログラムからWindows標準のFTP.exeを呼び出して別サーバー上に立てている
    FTPサーバーに接続し、ファイルをGETしていますが、
    Windowsファイアーウォールを有効にするとFTP.exeが終了しません。
    Windowsファイアーウォールの例外に呼び出し元プログラムとFTP.exeを指定しても
    パケットがドロップされてしまいます。(2台で同じ現象))
    何を指定すればよいのでしょうか。

    ■対象環境
      Windows Server 2003 R2 SE SP2

    ■ファイアーウォールのログ

      2012-01-30 13:02:23 DROP TCP SSS.SSS.SSS.SSS DDD.DDD.DDD.DDD 20 5001 40 FA 4003798013 1670495301 16560 - - - RECEIVE
      2012-01-30 13:02:26 DROP TCP SSS.SSS.SSS.SSS DDD.DDD.DDD.DDD 40 FA 444539930 1345423007 16560 - - - RECEIVE
      ~

     SSS.SSS.SSS.SSS ← FTPサーバーのIPアドレス
     DDD.DDD.DDD.DDD ← 自分のIPアドレス

    ■FTP.exeの実行
     sprintf(ftpcmd, "ftp -n -v < %s", tempfile);
     if((fp=popen(ftpcmd, "r"))==NULL){

     

    2012年1月30日 4:50

すべての返信

  • いが さん、こんにちは。
    フォーラム オペレーターの田中夢です。
     
    私の方でも何か情報がないかと探してみたところ、Windows ファイアウォールを有効にした状態で IIS サービス(FTP サーバーも含みます)を有効にする方法について記載しているサポート情報 (KB) がありました。
     
    また、英語の資料になってしまうのですが、TechNet ライブラリに Windows ファイアウォールの fix についての文書がありました。「I cannot get my FTP program to work with Windows Firewall.」という項目では、使用している FTP プログラムがパッシブ FTP の代わりにアクティブ FTP を使用している場合に発生する。 Windows ファイアウォールでは Application Layer Gateway (ALG) を使ってアクティブ FTP を処理するため、ALG サービスが起動していない場合は、起動してみてください。という内容が記載されています。
     
    また、パッシブモードの FTP サーバー用に Windows ファイアウォールを構成する方法について記載されているサポート情報 (KB) や、Windows ファイアウォールの動作について説明している TechNet ライブラリの文書もありましたので、こちらもご紹介させていただきますね。
     
    (これらの方法は私の方では試していないので、もしもお試しになる場合には、テスト環境でテストをするなど、ご自身の責任でお願いいたします。)
     
    <参考情報>
    - Windows ファイアウォールを設定したまま、IIS のサービス提供を有効にする方法
    http://support.microsoft.com/kb/883877/ja
     
    - Windows Firewall Quick Fixes
    http://technet.microsoft.com/en-us/library/cc739791(WS.10).aspx
    (I cannot get my FTP program to work with Windows Firewall. 項目をご参照ください。)
     
    - パッシブ モードの FTP サーバー用に Windows ファイアウォールを構成する方法
    http://technet.microsoft.com/ja-jp/library/dd421710(WS.10).aspx
     
    - How Windows Firewall Works
    http://technet.microsoft.com/en-us/library/cc755604(WS.10).aspx
    (Windows firewall Protocols 項目をご参照ください。)
     
    検索ワード: 
    Windows Server 2003 FTP transfers fail if Windows Firewall is enabled
    Windows Server 2003 firewall ftp allow
     
     
    こちらの情報が少しでも参考になれば幸いです。
    ---------------------------------------------------------------------
    日本マイクロソフト株式会社 フォーラム オペレーター 田中夢
    2012年2月3日 7:01
    モデレータ
  • 質問があいまいですみません。
    Windowsファイアーウォールを有効にしているのはFTPクライアント側であり、FTP.exe
    を使用しているのでアクティブモードでの接続となります。

       - Windows ファイアウォールを設定したまま、IIS のサービス提供を有効にする方法
       - パッシブ モードの FTP サーバー用に Windows ファイアウォールを構成する方法
          ⇒ どちらもFTPサーバー側の設定についての説明なのであてはまりません。
       - Windows Firewall Quick Fixes
          ⇒ ALGサービスは起動していますし、プログラム、FTP.exe共に例外設定をしています。
       - How Windows Firewall Works
          ⇒ 解決に繋がるような記述はありませんでした。

    尚、FTPクライアントとしてWindowsServer2008を使用した場合にはファイアーウォールを
    有効にしてもFTPを実行するプログラムを受信規則の例外に設定するだけで問題なく通信が
    できることが確認できました。

    なんとか解決したいのですが、他に有効な情報はありませんでしょうか。

    2012年2月8日 5:58
  • 手元の Windows Server 2003 R2 SP2 (英語版) で Windows Firewall を有効にして、ftp.exe を手で実行してみたところ、Firewall の問い合わせダイアログに対して [Unblock] をクリックしただけで、アクティブモードでも問題なく get 等できました。ALG サービスをどうこうする必要もありませんでした。(自動的に Start しました。)

    作成された Firewall Exception を見てみたところ、プログラムとして C:\WINDOWS\system32\ftp.exe が追加されているだけですね。(Scope は Any computer)

    2012年2月8日 9:58
  • 返答ありがとうございます。
    こちらの環境でもftp.exeを手で実行すれば問題なくget等できます。
    しかしながら、質問内容は「プログラムからftp.exeを実行した場合」
    なのです。
    申し訳ないのですが参考になりませんでした。

    2012年2月10日 1:21
  • コマンド プロンプトだってプログラムなのですが :-)

    _popen("ftp -n -v < test.txt", "r");

    でも全く同じ動作でした。([Unblock] ボタン押すだけ。)

    2012年2月10日 2:03
  • Windowsファイアーウォールの設定をデフォルトに戻し、プログラムから起動して
    [Unblock]ボタンを押せば確かにその一回はgetできます。
    が、その後しばらくしてもう一度同じ動作を行うとFirewallの問合せダイアログは
    表示されずパケットがドロップされてしまうのです。
    (コマンドプロンプトでFTP.exeを実行した場合にはその状態でもget等可能です。)
    2012年2月10日 6:43
  • ちょっと試したところでは、[Keep blocking] をクリックした場合でも ALG がめんどうをみてくれるようで、コマンド プロンプトからでも_popen経由でも、そもそも例外規則さえ必要さえ必要ないようなのですが…。

    その「プログラム」は、どのユーザーがどのセッションでどのように起動して、どのftp.exeを起動しているのでしょうか?

    2012年2月10日 16:51
  • Windows上に立てているサービスが子プロセス(コンソールアプリ)を起動して
    そのプログラムの中でftp.exeを実行しています。

    なので
     どのユーザー:ローカル システム アカウント ← サービスを起動しているアカウント
     どのセッション:Webアプリではないので不要???
     どのftp.exe:c:\windows\system32\ftp.exe
    ということでしょうか。

    2012年2月13日 1:21
  • セッションはターミナル サービス セッションのことですが、サービスから起動しているのでしたらセッション 0 なのでしょうね。

    > Windowsファイアーウォールの設定をデフォルトに戻し、プログラムから起動して
    > [Unblock]ボタンを押せば確かにその一回はgetできます。

    というのはたしかでしょうか? こちらで試したところでは、サービスから起動した時には、サービスが対話的でも非対話的でも、 [Keep Blocking] / [Unblock] / [Ask Me Later] を問うダイアログは表示されないようですが。なお、そのときでも、ALG サービスを disable にしていない限り、例外規則がなくてもアクティブ接続できました。

    同じプログラムを、サービスではなく通常のログオン ユーザーが実行してみて確認してはいかがでしょう?

    2012年2月21日 7:10
  • ずいぶん時間がかかってしまいましたが、その後わかったことを記します。

    >というのはたしかでしょうか?

    Windowsファイアーウォールのダイアログはプログラムの別のプロセスが
    通信をしようとして出していました。
    ここで「Unblock」を押したことでWindowsファイアーウォールが一時的に
    無効状態になり、今回調査している通信が出来たのではないかと思われます。

    >同じプログラムを、サービスではなく通常のログオン ユーザーが実行してみて確認してはいかがでしょう?

    Administratorでログオンしコマンドプロンプトから同じプログラムを実行しましたが、
    やはりブロックされてしまいました。
    知らず知らずのうちにALGサービスで制御できないプログラムになってしまっているのでしょうか。

    2012年3月2日 10:07
  • その後ですが、、、未だ解決しておりません。
    複数の詳しい方にも確認し、Windows Server 2003 R2 SE SP2の
    Windowsファイアーウォールのバグの可能性が高いという状況です。
    その他、さらに情報があればいただけますでしょうか。

    2012年3月29日 2:16
  • 1年もたつので、すでに解決しているかもしれませんが。

    Windows7で、Excel VBAからFTPを実行した際に同様の問題になりました。

    具体的には、Windows Firewallで、C:\Windows\system32\ftp.exeを許したところ、DOS窓からのFTPは成功するようになりましたが、Excel VBAからはgetもしくはputのステートメントで止まってしまいました。

    Windows Firewallで、C:\Windows\Syswow64\ftp.exeを許したところ、Excel VBAからも動作するようになりました。

    32bitアプリからftpを実行すると、こちらのパスのexeが使用されるようです。

    2013年3月13日 6:54