パッシブ サーバー モード (PASV コマンドを使用) をサポートする FTP サーバーがあります。これは Windows XP では正常に動作します。ファイアウォールを有効にした Windows Vista または Windows 7 からこのサーバーにアクセスすると、接続がすぐにシャットダウンされます。リセット パケットがサーバーに送信され、サーバーが接続をリセットした (これは事実ではありません) ことがソケットに通知されます。
ファイアウォールを無効にすると問題は解消されます。
他の FTP サーバーへの接続は正常に機能します。違いは、PASV に対するサーバーの応答がアドレス フィールドを括弧で囲まないことです。これは、RFC-959 および RFC-1132 に記載されているとおり合法です。
この不正な動作を止めるにはファイアウォールをどのように設定すればよいでしょうか?
答え1
括弧に問題があるとは思いません。
むしろ、そのサーバーによって割り当てられた動的ポート範囲が Vista/7 と一致していないのではないかと思います。
このテーマに関する議論については、この記事を参照してください。
Windows VistaおよびWindows Server 2008ではTCP/IPのデフォルトの動的ポート範囲が変更されました。
コンピュータ上の IPv4 の動的ポート範囲を表示するには、次のコマンドを使用します。
netsh int ipv4 show dynamicport tcp
TCP の動的ポート範囲を設定するには、たとえば次のようにします。
netsh int ipv4 set dynamicport tcp start=1024 num=30000
さらに多くのコマンドについては上記の記事で説明されています。
編集: Windows ファイアウォールは、PASV 応答で指定された動的ポートが動的ポートのデフォルト範囲内にない場合でも、そのポートを開くのに十分な知能を備えている可能性があることに注意してください。ただし、括弧なしの応答を理解できるほど十分に知能が備わっていない可能性もあります。動的ポートのデフォルト範囲を拡張する可能性を検討する価値があるかもしれません。
答え2
これは、Windows 7 で Java と FTP を実行したときに発生した問題を思い出させます。
結局、これは FTP、パッシブ モード、および IPv6 接続の Microsoft ファイアウォールのバグであることが判明しました (アドレスが IPv6 である必要はなく、接続を行ったソフトウェアが IPv6 スタックを使用して接続を行うだけです)。
あなたの質問に記載されている症状は、この問題と非常に似ているようですので、ここにリンクして要約します(この質問は Java とは関係ありませんが、修正は同じである可能性があります)
そこで言及されているいくつかの解決策の概要:
- Microsoft 修正プログラム:http://support.microsoft.com/kb/2754804
- Vista/7 で実行している FTP クライアントを IPv4 スタックで実行してみる (可能かもしれないし、不可能かもしれない)
- Windows ファイアウォールのステートフル FTP を無効にします
netsh advfirewall set global StatefulFTP disable
(ただし、これにより、ファイアウォールを通過する非パッシブ モードの FTP 接続が無効になります)
答え3
バグがあるため、ファイアウォールを構成することはできません。
現場の古いデバイスに組み込まれているため、括弧内のポート情報を送信するように FTP サーバーを変更できない場合は、次の動作を行う特別なクライアントが必要です。
このクライアントは、ファイアウォールを正常な状態に保つために、TYPE I
各コマンドの直前にコマンドを送信する必要がありますPASV
。非バイナリ転送が必要な場合は、TYPE コマンドのパラメータを変更できます。