web-dev-qa-db-ja.com

Filezillaを介して明示的にftpを実行できますが、コードからは転送できません

これは元々StackOverflowに投稿されましたが、コードが機能し、これはネットワーク/ファイアウォールの問題である可能性が高いため、ここで質問すると思いました。

タイトルにあるように、FileZillaクライアントを介してサーバーから別のマシンに接続できますが、コードを介して接続することはできません(.Net-FTPWebRequest)

別のマシンから動作するので、コードが優れていることはわかっています。私が問題を抱えている特定のマシンはNATの背後にありますが、SAは、通信しようとしているホストからのトラフィック用にすべてのポートを開いています。

何か提案があります-私は明らかな何かを見逃しましたか?

試行された接続から得られる例外は次のとおりです。

"Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected Host has failed to respond."

そして、接続しようとしているマシンからのログは次のように表示されます。

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> Connected, sending welcome message...

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220-FileZilla Server version 0.9.32 beta

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> AUTH TLS

7/26/2010 12:40:24 PM - (not logged in) (xx.xx.xxx.xxx)> 234 Using authentication type TLS

7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> 421 Login time exceeded. Closing control connection.

7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> disconnected.

編集:コードとfilezilla接続の両方にパッシブモードを使用しています。要求に応じて、(別のマシン上の)コードからの成功したftps接続(LIST)のログを次に示します:

7/26/2010 12:45:03 PMログインしていません)(xx.xx.xxx.xxx)>接続し、ウェルカムメッセージを送信しています...

7/26/2010 12:45:03 PM-(ログインしていない)(xx.xx.xxx.xxx)> 220-FileZillaServerバージョン0.9.32ベータ

7/26/2010 12:45:03 PM-(ログインしていない)(xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com

7/26/2010 12:45:03 PM-(ログインしていません)(xx.xx.xxx.xxx)> AUTH TLS

7/26/2010 12:45:04 PM-(ログインしていない)(xx.xx.xxx.xxx)> 234認証タイプTLSの使用

7/26/2010 12:45:04 PM-(ログインしていません)(xx.xx.xxx.xxx)> SSL接続が確立されました

7/26/2010 12:45:04 PM-(ログインしていない)(xx.xx.xxx.xxx)> PBSZ 0

7/26/2010 12:45:04 PM-(ログインしていない)(xx.xx.xxx.xxx)> 200 PBSZ = 0

7/26/2010 12:45:05 PM-(ログインしていない)(xx.xx.xxx.xxx)> PROT P

7/26/2010 12:45:05 PM-(ログインしていません)(xx.xx.xxx.xxx)> 200保護レベルをPに設定

7/26/2010 12:45:05 PM-(ログインしていません)(xx.xx.xxx.xxx)>ユーザーユーザー名

7/26/2010 12:45:05 PM-(ログインしていません)(xx.xx.xxx.xxx)> 331ユーザー名に必要なパスワード

7/26/2010 12:45:05 PM-(ログインしていない)(xx.xx.xxx.xxx)> PASS xxxxxxxxxx

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> 230ログオン

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> OPTS utf8 on

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> 200UTF8モードが有効

2010年7月26日12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> PWD

7/26/2010 12:45:05 PM --username(xx.xx.xxx.xxx)> 257 "/"は現在のディレクトリです。

2010年7月26日12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> CWD /

7/26/2010 12:45:05 PM --username(xx.xx.xxx.xxx)> 250CWDが成功しました。 "/"は現在のディレクトリです。

2010年7月26日12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)>タイプI

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> 200タイプをIに設定

2010年7月26日12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> PASV

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> 227パッシブモードに入る(xx、xx、xxx、xxx、xxx、xxx)

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)>リスト

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> 150接続が受け入れられました

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)>データ接続用のSSL接続が確立されました

7/26/2010 12:45:05 PM-ユーザー名(xx.xx.xxx.xxx)> 226転送OK

7/26/2010 12:46:43 PM-ユーザー名(xx.xx.xxx.xxx)>切断されました。

---(編集-これは、FileZillaクライアントを使用した同じマシンからの成功した試行のログです

7/28/2010 10:01:53 AM-(ログインしていません)(xx.xx.xxx.xxx)>接続し、ウェルカムメッセージを送信しています...

7/28/2010 10:01:53 AM-(ログインしていない)(xx.xx.xxx.xxx)> 220-FileZillaServerバージョン0.9.32ベータ

7/28/2010 10:01:53 AM-(ログインしていない)(xx.xx.xxx.xxx)> 220 ftp.xxxxxxxx.com

7/28/2010 10:01:53 AM-(ログインしていません)(xx.xx.xxx.xxx)> SSL接続が確立されました

7/28/2010 10:01:53 AM-(ログインしていない)(xx.xx.xxx.xxx)>ユーザーユーザー名

7/28/2010 10:01:53 AM-(ログインしていません)(xx.xx.xxx.xxx)> 331ユーザー名に必要なパスワード

7/28/2010 10:01:53 AM-(ログインしていない)(xx.xx.xxx.xxx)>合格********

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 230ログオン

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> SYST

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 215FileZillaによってエミュレートされたUNIX

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> FEAT

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 211-機能:

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> MDTM

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> REST STREAM

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)>サイズ

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> MLSTタイプ*;サイズ*;変更*;

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> MLSD

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> AUTH SSL

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> AUTH TLS

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> UTF8

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> CLNT

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> MFMT

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 211終了

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> PBSZ 0

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 200 PBSZ = 0

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> PROT P

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 200保護レベルをPに設定

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> PWD

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 257「/」は現在のディレクトリです。

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)>タイプI

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 200タイプをIに設定

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> PASV

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 227パッシブモードに入る(xx、xx、xxx、xxx、xxx、xxx)

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> MLSD

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 150接続が受け入れられました

7/28/2010 10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)>データ接続用のSSL接続が確立されました

2010年7月28日10:01:53 AM-ユーザー名(xx.xx.xxx.xxx)> 226転送OK

7/28/2010 10:02:18 AM-ユーザー名(xx.xx.xxx.xxx)>切断されました。

3
IniTech

ログは通常、起こっていることの一部しか示していないため、これらのタイプの問題に対処するのは難しい場合があります。

この時点での最善の策は、パケットキャプチャおよび分析ソフトウェア(最も優れた-および無料 wireshark など)を使用して、実際にネットワーク上で何が起こっているかを確認することです。

マシンとリモートシステム間のすべてのトラフィックをキャプチャし、機能している接続とコードの間にどのような違いがあるかを確認してください。それはあなたに問題がどこにあるかを示すかもしれません。

実際の問題を指摘している可能性があるため、TLS接続のネゴシエーション方法に特に注意してください( IBM's にある非常に素晴らしく理解しやすいドキュメントがあります)。例えば:

  • 証明書が交換された後に接続が停止した場合は、一方の当事者が他方の証明書を検証できないことを示しています。これは、特に自己署名証明書またはプライベートルートが使用されている場合、TLSソフトウェアの非常に一般的な問題の原因です。
  • ハンドシェイクの最初の段階で接続が切断された場合、クライアントとサーバーが使用するプロトコルについて合意できない可能性があります(通常、一方の当事者が他方の当事者がサポートしていない「安全な」プロトコルに制限しているため)。
  • サーバーが「クライアント証明書が必要」フラグを設定している場合は、認証用のクライアント証明書が設定されていない可能性があります。
  • (等)

TLSチャネルが正常にネゴシエートされていることがわかった場合は、大砲を使用する必要があります。サーバーの秘密鍵を取得して、TLSトラフィックをデコードします。ただし、これはTLS接続が DHキー交換 を使用しない場合にのみ可能になるため、最初にサーバーまたはクライアントで無効にします。

DHが非アクティブ化され、秘密鍵を取得したら、Wiresharkの SSL/TLSに関するwikiページ の指示に従うことができます。これは、プロセスをかなり詳細に説明しています ブログpost それはおそらく少しわかりやすいでしょう。

1
Stephane

明らかな何かを見逃したことがありますか

Ftpサーバーに接続する方法は1つしかないため、コードがFileZillaクライアントと同じことをしていると誤解している可能性があります。

接続されていないときにログを表示します。クライアントがどのように接続するかを確認するには、接続が成功したログと比較する必要があります。 (AUTH TLSを使用していないか、パッシブモードなどを使用している可能性があります)

また、FileZillaについては何も知りませんが、その構成(FTP、TLS、NATなど)によって問題が発生する可能性があるため、一部のFTPサーバーは自身をNAT対応と表現しています。

0
sgmoore