サービスとして実行され、FTPクライアントを含むアプリケーションがあります。アクティブFTPのみをサポートするFTPサーバーに接続する必要があります。ファイルのリストを取得するか、ファイルをダウンロードしようとすると、WindowsファイアウォールがFTPサーバーからの受信接続をドロップします。 (Windowsでこの問題が発生したとは思わないXPまたはWindows Vista。)
アクティブFTPは、サーバーがクライアントへの接続を、クライアントが指定したポートで開くことを要求するプロトコルです。 ( http://slacksite.com/other/ftp.html )
Windowsファイアウォールで大きなポート範囲を開いて、FTPクライアントにそれらのポートのみを使用するように強制できることは知っていますが、WindowsファイアウォールがアクティブFTPをネイティブでサポートすることを推測していました。
WindowsファイアウォールでアクティブFTPを自動的に検出し、必要に応じて必要なポートを開くために必要な設定はありますか?プログラムでその設定を変更できますか?
ありがとう。
Windowsファイアウォールの例外リストにポートを追加する代わりに、アクセスする必要があるアプリケーションを追加します。 Windowsファイアウォールは、そのアプリケーションがバインドして、必要なポートを使用できるようにします。
アクティブモードとパッシブモードのどちらの場合も、サーバーは常にデータ接続用にポート20を使用し、クライアントがFTP PORTコマンドを発行したときに指定したポートに接続します。
Windows 7ファイアウォールを見ると、特定のプロトコルタイプ(TCP)の特定のリモートポート(20)から任意のローカルポートへの接続を許可するカスタム受信ルールを作成できるようです。このルールが適用されるローカルおよびリモートのIPアドレスを指定することもできます。
私はWindowsファイアウォールを使用したことがないことを認めざるを得ませんが、それはあなたにとってはうまくいくように思えます。
ファイアウォールがステートフルFTPフィルタリングを実行していることを確認してみましたか?
これを行うには、管理者権限でコマンドプロンプトを開き、次のように入力します。
netsh advfirewallがグローバルなStatefulFtpを有効に設定
それがあなたの問題にまったく影響を与えたとしたら、私は興味があります。
WindowsマシンでFTPサーバーを作成している間、多くの人は%SystemRoot%\ system32\inetsrv\inetinfo.exeを気にしません。
サブネットまたはインターネットから接続にアクセスする前に、アプリケーションがホワイトリストに登録されている必要があります。
まず、これらのポートを許可します:HTTPとFTPの両方で80、20、21。次に、「inetinfo.exe」の例外を追加します
この問題は、インバウンドルールのトップをより正確に見て解決しました。ファイル転送プログラムと呼ばれる2つのルールがあることに注意してください(1つはTCPともう1つはUDP用)--blocking "c:\ windows\system32\ftp.exe"プログラム。両方を無効にすると、すべてが魅力のように機能しました!ちょうど私の2セント;-)
Windows XP/Vista/7はすべて、「アプリケーションレイヤーゲートウェイサービス」をアクティブFTPの接続ヘルパーとして使用します。アクティブFTPが機能するためには、このサービスが開始されていることを確認する必要があります。
開始するには:
イントラネットのFTPクライアントに問題があり、その特定のプログラムに対してファイアウォールの例外を作成したくありませんでした。クライアントプログラムを使用して、Active FTPを「Just Work」にしたかったのです。
「アプリケーション層ゲートウェイサービス」を有効にしようとしました(sc start ALG
)、「statefulftp」が有効になっていることを確認しました(netsh advfirewall set global statefulftp enable
)。これらはいくつかのケースで必要になると思いますが、私には違いはありませんでした。
最後に、ローカルIPから接続fromポート20を開いただけで、アクティブFTPはすべてのプログラムで機能します。
netsh advfirewall firewall add rule name="FTP (active)" action=allow protocol=TCP dir=in remoteport=20 remoteip=localsubnet
Remoteip = localsubnetの代わりに、特定のIPを指定することもできます。