- - PR -
VB.NETでのFTP接続エラー
1
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-08 15:48
いつも拝見させていただいております。
VB.NETで開発したC/Sシステムでの FTP接続で問題が発生しており、 調査の切り分けに時間がかかっております。 ※厳密に申し上げますと、C/Sとは違いますが、、 ●環境 クライアント:VB.NET FrameWork 2003 サーバ :RedHat Linux ES4 ●事象 全国のクライアントPC(約100箇所)から ダイアルアップ(モデム)にてDC(データセンタ)内に設けられた Linuxサーバに対してFTP接続を行い、 ファイルをアップロードしているのですが、 ある特定のクライアントPC(拠点A)からのFTP接続が出来ていない状況です。 ●エラー内容 System.Net.Sockets.SocketException: 対象のコンピュータによって拒否されたため、接続できませんでした。 場所 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 場所 System.Net.Sockets.Socket.Connect(EndPoint remoteEP) ●調査経過 1.上記.NETアプリケーションからのFTP接続は拠点Aを除き問題無く稼動しております。 2.拠点Aで使用しているクライアントPCから DOSプロンプトからftpコマンドを実行した場合には、 接続が確立されることを確認しています。 3.また、同端末からDOSプロンプトからpingを発行した場合、TimeOutになります。 ※1,2共にダイヤルアップ接続確立後の実行になります。 私としては拠点Aの環境に何かしら問題があるのではないかと 推測しているのですが、根拠が明確ではありません。(WF,セキュリティソフト関係?) 拠点が遠方な事、また手元に実行環境が無いことから、 手詰まり状態というのが正直なところです。 お聞きしたいことは、本事象の切り分け方法で 問題はアプリケーション側か、拠点AのクライアントPC側 (もしくは拠点Aのネットワーク環境)のどちらが濃厚かと言う事と、 ftpコマンドは成功するが、pingが失敗するという事象に対する 考えられる原因です。 何方かご存知の方がおりましたらご教授願いますでしょうか。 宜しくおねがいします。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2007-11-08 16:28
申し訳ありません。一部訂正です。
●環境 クライアント:VB.NET FrameWork 2003 ↓ クライアント:WindowsXP にVB.NET 2005 (.NET FrameWork 2.0)で作成した アプリケーションがインストールされています。 宜しくお願いします。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2007-11-08 17:42
「問題」というのは何を指すのでしょうか? 約100箇所動いていて、1箇所動いていないなら 少なくともその1箇所の環境が他と違うということですから、 その1箇所の環境を他と同じにすれば動くはずですよね。 だからといってアプリケーションには問題ない、とは言えませんよね。 少なくとも、そのアプリケーションは動かない環境が存在するわけです。 全ての環境で動くアプリケーションはありえないので、 どういった環境で動くものを作るのかは仕様次第です。 ということは、「問題」の定義は「仕様」依存ですから、 仕様が書いてないこの投稿内容では、問題がどこにあるのか全く分かりません。
ftpはTCPの20番ポートをコントロール用に使い、 データ転送用に適当なTCPポートをもうひとつ使うプロトコルです。 pingはICMPを使うアプリケーションです。 ICMPを禁止すればpingは動作しませんから、 ftpが動いてpingが動かないのは普通にあります。 詳細を説明するのはめんどくさいので省きますが ftpは古いプロトコルで、ファイヤーウォールやプロキシの設定がめんどうです。 ftpトラブルは大抵その辺で引っかかっています。 ftpを使うのに、どのクラスを使っているのか、 どのメンバを使ったときにエラーになるのか、 そういったことで多少状況がわかります。 あとは問題のある拠点のネットワーク構成を調べて、 プロキシをきったりファイヤーウォールを切ったり、 上流までtracertしたり、ポートスキャンしたり、 ですね。 TCP周りは基本なので、勉強しておいて損は無いでしょう。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2007-11-08 18:25
・ftp.exe ではうまくいく。
・プログラムからはうまくいかない。 ・対象のコンピュータによって拒否されたため、接続できませんでした。 ftp.exe は PASV に対応していないので、コントロールコネクションをクライアントらサーバーに張り、データコネクションをサーバーからクライアントに張ります。 .NET のクラスライブラリはまったく知らないですけど、おそらく、プログラムからFTPを扱うときは PASV モードになっているんじゃないかと推測します。PASV だとデータコネクションもクライアントからサーバーに張りますので、このデータコネクションの接続に失敗して「対象のコンピュータによって拒否されたため、接続できませんでした。」と出ているのでしょう。 ちなみに PASV でクライアントからサーバーに接続するときのサーバー側ポート番号は 20 番ではありません。もちろん 21番でもありません。宛先ポート番号はランダムです。 なので、ファイアウォールの設定がむずかしい。クライアント側のソースポートは 20番になるはずなので、ソースポート20を許可する設定をすれば良かったかな。ディスティネーションポートでは制御できないと思います。(FTPサーバーソフトウェアによってはランダムなポートの範囲を指定できるものもあります。この場合はディスティネーションポートを指定した通常のフィルタリング設定ができます。) ftp.exe でうまくいくということならプログラムで PASV モードにせず、PORT モードで接続をおこなえば原理的に ftp.exe と同じになりますから、うまくいくのではないかと思います。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2007-11-08 19:01
回答ありがとうございます。
長くなりますがご容赦ください。
れいさんの仰る通りです。 「問題」というのは"FTP接続が出来ない原因についての切り分け方"という事を 言いたかったのですが、すみません。 ただ、各クライアント端末に関して調査したところ、 全拠点に同一機器を納入し使用して頂く。という前提だったはずが、 全拠点がそのように実施されていないという現状があり、 またそれを強制出来ない立場にいます。
こちらも同意します。 確かにアプリケーションの問題とは言い切れません。
この点に関しては反省しております。
調べてみたところ、ファイヤーウォールやプロキシ、 セキュリティソフト関連が原因ではないかと思っています。 ※アプリケーションの疑いも未だ晴れていませんけど、、
すみませんでした。記載していたと勘違いしていました。 クラスは、下記メンバを持ったclsFTPというクラスを生成し、 'FTP Class Public Class clsFTP #Region "Class Variable Declarations" Private m_sRemoteHost, m_sRemotePath, m_sRemoteUser As String Private m_sRemotePassword, m_sMess As String Private m_iRemotePort, m_iBytes As Int32 Private m_objClientSocket As Socket Private m_iRetValue As Int32 Private m_bLoggedIn As Boolean Private m_sMes, m_sReply As String #End Region 同クラス内の下記メソッドのConnectで例外が発生するというものです。 Public Function Login() As Boolean Dim m_objClientSocket AS Socket m_objClientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim ep As New IPEndPoint(Dns.GetHostEntry(m_sRemoteHost).AddressList(0), m_iRemotePort) Try m_objClientSocket.Connect(ep) Catch ex As Exception MessageString = m_sReply Throw New IOException(ex.ToString) End Try ‥(省略) End Function
はい。 実際に拠点の方に協力して頂いてその辺りの調査に努めたいと思います。 (担当者が非協力的な為にこちらの掲示板で 担当者を説得出来る可能性(材料)を模索していた次第です。)
ご指摘ありがとうございます。 再度基礎から見直しを掛けてみようと思います。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2007-11-08 20:58
前述のように、ftpは二つの接続を用います。 データなのかコントロールなのかによって対応が変わります。 どっちでしょう? 関数名がLoginなので恐らくコントロールの接続だろうと思います。 コントロールの接続が繋がらないのだとすると、 ftp.exeは繋がるのに、アプリケーションではだめということになります。 DNSの解決が変でないのなら、 あとはウィルス対策ソフトを疑うべきですね。 もしデータ側の接続なら、PASVになります。 コントロール接続は繋がるということは、 途中でパケットが止められてるわけですので、 PC側のウィルス対策ソフト、OSのパケットフィルタ、 ルーターのフィルタ、という順にパケットが通ってるか 確認していけばいいだけですね。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2007-11-09 10:18
れいさん、未記入さん
ポイント箇所をご指摘頂きありがとうございます。 依然、プログラムの調査も継続中ですが、 それと平行に拠点担当者の方に使用端末の環境 (ウィルス対策ソフト等がインストールされているか、ネットワーク環境はetc) を順に確認を行おうと思います。 解決しましたらこちらでまた書き込みさせて頂きます。 それでは失礼いたします。 本日(11/14)追記です。 ウィルス対策ソフトが通信を遮断していたようで、 担当者さん曰く「無事動作しています」との回答を頂きました。 [ メッセージ編集済み 編集者: まごまご 編集日時 2007-11-14 13:24 ] |
1