2011-11-16 2 views
2

시도하고 간략하게 간다사용자 지정 FTP 클라이언트 PASV 데이터 연결이 거부되었습니다.

나는 C# .net 3.5를 사용하여 사용자 지정 FTP 구현을 작성했습니다. 시스템은 연결 관리를 위해 TcpClient (활성 모드의 경우 TcpListener)를 사용합니다. 단일 인스턴스에서 이상한 동작이 발생하고 가능한 원인을 묻습니다.

클라이언트 자체가 훌륭하게 작동하며 고객의 상당수가 만족합니다. 그러나, 우리는 내가 알 수없는 것을 가지고있다. 나는 주변에 찌르 기 위해 wireshark 흔적을 보냈지 만 진정한 기쁨은 없습니다. 클라이언트 컴퓨터는 내가 (클라이언트 설명을 통해) 큰 네트워크 인프라라고 믿는 것 뒤에 있습니다. 네트워크 외부에서 동일한 서버에 대한 연결은 매력처럼 작동합니다. 여기 내가보고있는 것이 있습니다.

내 클라이언트가 수동 모드에서 작동하면 데이터 연결 (서버가 수동 모드로 전환되고 포트를 지정 함)에 대해 TCP 핸드 셰이크 요청이 전송되지만 결코 인식되지 않습니다. 이로 인해 재 시도 및 최종 시간 초과가 발생합니다.

Filezilla (및 Windows 탐색기 및 IE ...) 클라이언트에서 수동 모드를 사용하면 연결이 문제없이 진행됩니다. 고의로 클라이언트와 상사가 코드를 가리키게합니다.

wireshark 추적을 통해가는 TCP 프레임 사이의 차이점을 볼 수 없습니다. 모든 제어 연결은 포트 21에 도달하고 두 시나리오에서 확인 응답을받습니다. 깃발은 유사하다. 이 경우에는 높은 번호의 포트 52000+ (그러나 내가 가진 흔적에는 동일하지 않습니다)을 제외하고 데이터 연결에도 동일하게 적용됩니다.

우리는 더 낮은 수준의 프로토콜 문제에 직면 할 때 네트워크 프로그래밍 전문가가 아니며 더 큰 네트워크주의 사항에 대한 이해는 매우 제한적입니다. 개발자로서 나는 즉시 "FIREWALL ISSUE"라고 울부 짖는다. 그러나 그것은 누군가를 위해 아무 것도 해결하지 못한다.

마무리하려면 어떤 종류의 하드웨어/방화벽이 이러한 종류의 동작을 일으킬 수 있는지 알고 있습니까? 나는 응용 프로그램 수준에서 트래픽을 차단하는 것이 의심 스럽지만 결코 알지 못합니다.

읽어 주셔서 감사합니다.

+1

다음과 같은 질문을 던집니다 : 왜 이미 FTP가있을 때 자신의 FTP 구현을 작성 했습니까? –

+0

좋은 질문입니다, 2 가지 이유.1 : 일반적으로, 부서는 제 3 자 라이브러리를 싫어합니다 (Microsoft의 FtpWebRequest는 쓰레기입니다). 둘째, 고객 피드백에 프록시 지원을 포함시킬 수있는 유연성이 필요했습니다. – Gusdor

답변

0

내 신발을 밝게 비추십시오. 믿을 수 있겠습니까? 아마도 이것은 결국 사용자 오류 일 것입니다.

큰 질문은 '왜 filezilla와 windows는 작동하지만 소프트웨어는 그렇지 못합니까'입니다. 글쎄, 마침내 서버 측에서 어떤 일이 벌어지고 있는지 말해주는 흔적이 있습니다.

filezilla와 windows가 활성 모드로 돌아가지만 말하지 않습니다. 포트 20 (패시브 모드, 제어 호스트 포트) 및 21 (활성 모드, 클라이언트 데이터 포트)이 잘 알려져 있기 때문에 네트워킹 하드웨어가 허용 할 수 있습니다 (방화벽 설정에 관계없이).

그러나 우리의 소프트웨어는 기능으로 FTP 서클에서 권장하지 않기 때문에 자동으로 활성 모드로 되돌아 가지 않습니다. 대신 활성 모드는 연결을 설정할 때 선택하는 별도의 옵션입니다. 흥미롭게도, 그것은 방화벽에 의해 zapped되고있는 발신 클라이언트 핸드 셰이크 요청이지만, 이상한 일들이 일어났습니다. 나는이 하나의 손을 씻고 잠재 고객을 자동으로 대체 할 것입니다.

EDIT : 예, 사용자가 네트워크에 우리에게 알려주지 않은 프록시가 있습니다. pebcak 경고 소리를!